it-swarm.com.de

Wer kennt sich mit der mp4-Datenstruktur aus?

Wo in der mp4-Dateistruktur ist die Dauer davon?

32
Tom Brito

Dies ist möglicherweise nicht die Antwort auf Ihr Problem, aber es war mein: http://mediainfo.sourceforge.net/

(Es hat eine Bibliothek und ist Open Source, so dass Sie einfach nach den benötigten Teilen suchen können.)

13
Camilo Martin

Siehe https://github.com/sannies/mp4parser project. Es ist eine Java-Bibliothek, die die Struktur von mp4-Dateien zeigt.

8
Aftershock

Soweit ich weiß, wird der "mp4" -Container von der QuickTime-Atomstruktur abgeleitet. Sie können die Beschreibung des QuickTime-Dateiformats lesen.

Das Analysieren von Quicktime-Atomen ist keine große Sache (siehe atomicParsley project ). Ich bin nicht sicher für MP4, aber für MOV-Dateien - es gibt ein "duration" -Feld in "mvhd" (Filmheader) und auch in "tkhd" (Trackheader). Diese Dauer ist normalerweise eine Anzahl von Frames, multipliziert mit dem Attribut "Zeitskala" . Die Zeitskala kann in denselben Atomen gefunden werden.

6
2can

Für den Red5 MP4-Reader habe ich das "mvhd" -Atom verwendet, da es sowohl Zeitskala- als auch Dauerfelder enthält. Die Dauer des Atoms wird je nach verwendeter Version unterschiedlich sein. Unten sehen Sie ein Beispiel:

public long create_full_atom(MP4DataStream bitstream) throws IOException {
    long value = bitstream.readBytes(4);
    version = (int)value >> 24;
    flags = (int)value & 0xffffff;
    readed += 4;
    return readed;
}

public long create_movie_header_atom(MP4DataStream bitstream) throws IOException { create_full_atom(bitstream); if (version == 1) { creationTime = createDate(bitstream.readBytes(8)); modificationTime = createDate(bitstream.readBytes(8)); timeScale = (int)bitstream.readBytes(4); duration = bitstream.readBytes(8); readed += 28; } else { creationTime = createDate(bitstream.readBytes(4)); modificationTime = createDate(bitstream.readBytes(4)); timeScale = (int)bitstream.readBytes(4); duration = bitstream.readBytes(4); readed += 16; } int qt_preferredRate = (int)bitstream.readBytes(4); int qt_preferredVolume = (int)bitstream.readBytes(2); bitstream.skipBytes(10); long qt_matrixA = bitstream.readBytes(4); long qt_matrixB = bitstream.readBytes(4); long qt_matrixU = bitstream.readBytes(4); long qt_matrixC = bitstream.readBytes(4); long qt_matrixD = bitstream.readBytes(4); long qt_matrixV = bitstream.readBytes(4); long qt_matrixX = bitstream.readBytes(4); long qt_matrixY = bitstream.readBytes(4); long qt_matrixW = bitstream.readBytes(4); long qt_previewTime = bitstream.readBytes(4); long qt_previewDuration = bitstream.readBytes(4); long qt_posterTime = bitstream.readBytes(4); long qt_selectionTime = bitstream.readBytes(4); long qt_selectionDuration = bitstream.readBytes(4); long qt_currentTime = bitstream.readBytes(4); long nextTrackID = bitstream.readBytes(4); readed += 80;
return readed;
}


Bei einer Randnotiz habe ich die Werte verwendet, um die Spielzeit und fps wie folgt zu berechnen:
    double fps = (videoSampleCount * timeScale) / (double) duration;
    double videoTime = ((double) duration / (double) timeScale);
Die videoSampleCount-Variable stammt vom "stsz" -Atom.

6
Paul Gregoire

MP4 ist ein "Container" -Format, das bedeutet, dass es mehrere verschiedene Audio- oder Videoströme enthalten kann. Und jeder Stream könnte seinen eigenen Wert haben ...

Um herauszufinden, was Sie benötigen, benötigen Sie weitere Referenzdateien. Ich könnte vorschlagen, hier und hier ... zu suchen, aber Sie müssen wahrscheinlich darüber hinaus nach den verschiedenen Arten von A/V-Streams suchen, die Sie unterstützen möchten.

4
ewall

Bei Verwendung von MP4Parser http://code.google.com/p/mp4parser/ wie im vorherigen Poster erwähnt - sie haben sogar ein Beispiel, das die Dauer angibt: 

https://mp4parser.googlecode.com/svn/trunk/examples/src/main/Java/com/googlecode/mp4parser/GetDuration.Java

1

Grundsätzlich ist die MP4-Struktur ein Baum . Makro-Bereiche sind:

  • ftyp - Dateityp
  • moov - enthält Metadaten (Songtitel, Autoren, URL und andere Infos)
  • free - leerer Bereich zum Trennen von Kopf und Daten
  • mdat - enthält die Audio-Frames

Sie können dieses kostenlose MP4 Analyzer-Tool ausprobieren 

http://www.thinmultimedia.co.kr/products/MP4Reader_download.html

1

Die Dauer des Films befindet sich im Filmheader mvhd ..__ Die Dauer in Sekunden wird von zwei Feldern in mvhd abgeleitet.

  • 4 Byte Zeitskala 
  • 4 Byte Dauer

Dies sind die Zeilen 380 und 382, ​​die von @Tom Brito gepostet wurden.

Also gegebene Zeitskala 'ts' und Dauer 'dur' Duration in seconds = dur / ts

0
Peter Tran