Wo werden Synchronisationsinformationen in Containerformaten gespeichert?

3060
DEopen

Mehrere Audioströme, Videoströme und Untertitel werden in einem Container gespeichert. Diese werden zusammen abgespielt.

Wo werden die Synchronisationsinformationen im Containerformat gespeichert? In Metadaten oder woanders?

4

1 Antwort auf die Frage

2
slhck

Das hängt vom Behälter selbst ab. Verschiedene Container behandeln die Synchronisation unterschiedlich. Der Unterschied liegt in der Art und Weise, wie die Daten selbst gespeichert werden.

Zum Beispiel kann der Container wählen, nur Teile zu speichern, die gleichzeitig präsentiert werden sollen, oder Synchronisationspunkte von Zeit zu Zeit einfügen oder sogar jedem Datenblock einen Zeitstempel zuweisen.

Einige Container können zeitbasiert sein, während andere nur ein Datenstrom sind. Letzteres hat natürlich Leistungsvorteile, aber die Synchronisierung kann deaktiviert sein und das Suchen ist ohne einen bestimmten Index (wie in AVI) nicht möglich.


Beispielsweise verwendet der MPEG-2-Transportstrom, ein sehr frühes Containerformat, paketierte Elementarströme, um die Daten zu speichern. Beispielsweise haben Sie einen paketierten Stream für Video und einen für Audio. Um sie zu synchronisieren, gibt es das Feld Program Clock Reference:

Damit ein Decodierer synchronisierten Inhalt präsentieren kann, beispielsweise Audiospuren, die mit dem zugehörigen Video übereinstimmen, wird mindestens einmal alle 100 ms eine Programmtaktreferenz oder eine PCR im Anpassungsfeld eines MPEG-2-Transportstrompakets übertragen. Die PID mit der PCR für ein MPEG-2-Programm wird durch den pcr_pid-Wert in der zugehörigen Programmtabelle identifiziert. Der Wert der PCR wird bei richtiger Verwendung verwendet, um im Decodierer eine system_timing_clock zu erzeugen. Wenn der STC-Decoder ordnungsgemäß implementiert ist, bietet er eine hochgenaue Zeitbasis, die zum Synchronisieren von elementaren Audio- und Video-Streams verwendet wird.


Der beliebte MP4- Container basiert auf dem QuickTime-Dateiformat und hat daher eine gemeinsame Basis an Funktionen. Die Spezifikation finden Sie hier . Die Synchronisierung ist nicht Teil der Metadaten, sondern Teil der eigentlichen Daten. Ich habe mich jedoch nicht mit den Details befasst.

Bei Verwendung von RTP- Hinterspuren kann eine MP4-Datei für das Streaming vorbereitet werden, indem angegeben wird, welche Pakete mit welchem ​​Zeitstempel im Medium korreliert sind. Eine Hinweisspur sagt zum Beispiel: Dieses Paket besteht aus diesen Videodaten und diesen Audiodaten. Diese werden jedoch für die lokale Wiedergabe ignoriert.


AVI- Container basieren auf RIFF . Sie speichern die einzelnen Datenframes in "Chunks". Da die Daten selbst in einzelne Frames (z. B. Videoframes, Audioframes) aufgeteilt werden können, ist dies sogar mit variablem Bitrateninhalt möglich, da die Frame-Länge immer gleich ist. Dieses Dokument enthält eine detaillierte Beschreibung des AVI-Formats. Der wichtige Aspekt der Synchronisation ist, dass das AVI korrekt gemultiplext wird.


Der Matroska-Container ähnelt MP4 und anderen. Es ist vollständig timecode-basiert, wie Sie in diesem Diagramm sehen können . Die Daten selbst (z. B. Video, Audio) werden in Cluster und dann in Blöcke aufgeteilt. Der Timecode wird mehr oder weniger wie ein Präsentationszeitstempel behandelt.

Eine Sache, die ich jedoch erwähnen möchte, um Verwirrung zu vermeiden, ist der Timecode. Das schnelle Auge wird feststellen, dass pro Cluster ein Timecode angezeigt wird und dann noch ein anderer innerhalb der Blockstruktur. Das funktioniert so, dass der Timecode im Cluster relativ zur gesamten Datei ist. Es ist normalerweise der Timecode, bei dem der erste Block im Cluster abgespielt werden muss. Der Timecode im Block selbst ist relativ zum Timecode im Cluster. Nehmen wir zum Beispiel an, dass der Timecode im Cluster auf 10 Sekunden eingestellt ist und Sie einen Block in diesem Cluster haben, der 12 Sekunden nach dem Clip abgespielt werden soll. Dies bedeutet, dass der Timecode im Block auf 2 Sekunden eingestellt ist


Der Ogg-Container, der nicht so beliebt ist, macht dies folgendermaßen :

Durch Gruppieren wird definiert, wie mehrere logische Bitströme seitenweise in demselben physischen Bitstrom verschachtelt werden sollen. Eine Gruppierung ist beispielsweise erforderlich, um einen Videostrom mit mehreren synchronisierten Audiospuren unter Verwendung verschiedener Codecs in verschiedenen logischen Bitströmen zu verschachteln.

Ogg weiß jedoch nichts über den Codec und ein "Zeit" -Konzept:

Ogg hat kein Konzept von 'Zeit': Es kennt nur sequentiell ansteigende, einheitlose Positionsmarker. Eine Anwendung kann temporäre Informationen nur über höhere Schichten abrufen, die Zugriff auf die Codec-APIs haben, um Granulatpositionen oder -zeit zuzuweisen und zu konvertieren.