Freigeben über


Zeitstempel und Dauer

In diesem Thema wird beschrieben, wie Media Foundation-Transformationen Zeitstempel verarbeiten sollten.

Ein MFT muss einen möglichst genauen Zeitstempel und eine möglichst genaue Dauer für alle Ausgabebeispiele festlegen. Bei einem einfachen MFT, der einen Eingabepuffer übernimmt und ihn vollständig in einen Ausgabepuffer verarbeitet, sollte der MFT einfach den Zeitstempel und die Dauer direkt aus dem Eingabebeispiel in das Ausgabebeispiel kopieren. Viele Transformationen sind jedoch komplexer und erfordern möglicherweise komplexere Berechnungen der Ausgabezeit. Alle MFTs sollten die folgenden Grundlegenden Regeln beachten:

  • Ein MFT sollte versuchen, einen Zeitstempel und eine Dauer für alle nicht komprimierten Video- oder Audioausgabebeispiele zu platzieren, wenn ein genauer Zeitstempel oder eine genaue Dauer für die Eingabebeispiele angegeben ist oder berechnet werden kann. Für einige Ausgabezeitstempel kann eine Interpolation erforderlich sein, insbesondere für Decoder.
  • Die Zeitstempel und Dauer der Eingabebeispiele sollten in den Ausgabebeispielen so weit wie möglich beibehalten werden.
  • Die Ausgabezeitstempel oder -dauer stimmen möglicherweise nicht mit der Eingabe überein, da der MFT Daten zurückhält oder die Ausgabe in andere Teile als die Eingabe aufbricht. In diesem Fall sollte der MFT den Ausgabezeitstempel aus dem frühesten Eingabebeispiel berechnen, das Daten enthält, die zum Erstellen des Ausgabebeispiels verwendet werden. Fügen Sie zum Berechnen des Ausgabezeitstempels den Eingabezeitstempel des entsprechenden Eingabebeispiels der Dauer der Daten hinzu, die bereits aus diesem Beispiel transformiert wurden. Das zweite Beispiel am Ende dieses Abschnitts veranschaulicht diese Idee.
  • Wenn die Eingabebeispiele eine Dauer aufweisen, sollte diese Dauer beibehalten werden. Wenn ein Eingabebeispiel keine Dauer aufweist, sollte der MFT nach Möglichkeit eine Dauer aus der Größe des Ausgabepuffers oder der vom Medientyp angegebenen Datenrate berechnen.
  • Die berechnete Dauer sollte abgeschnitten (gerundet) und nicht auf den nächsten Inkrement gerundet werden. Die Pipeline verfügt über genügend Slack, um etwas ungenaue Dauer zu verarbeiten, aber es ist einfacher für die Pipeline, eine Dauer zu verarbeiten, die 1% zu kurz ist, als eine Dauer, die 1% zu lang ist. Es gibt jedoch keinen Grund, die Dauer absichtlich zu verkürzen, außer durch Rundungen.

Decoder

Ein Decoder konvertiert komprimierte Pakete in unkomprimierte Daten. Da die Ausgabe unkomprimiert ist, haben Decoder eine besondere Verpflichtung, die Zeitstempel und Dauer korrekt zu erhalten. Einige komprimierte Formate, insbesondere MPEG-2, verfügen nicht über Zeitstempel für alle Eingabepakete und haben häufig keine Dauer für ein Paket. Bei diesen Formaten ist der Decoder dafür verantwortlich, für jedes Ausgabebeispiel einen gültigen Zeitstempel und eine gültige Dauer zu platzieren, indem er die impliziten Daueren aller Ausgaben seit dem letzten Eingabebeispiel mit Zeitstempel summiert.

Wenn die Dauer für Videos nicht im komprimierten Format verfügbar ist, sollte der Decoder die Dauer als Inverse der Bildrate berechnen, in 100 Nanosekundeneinheiten konvertiert und gerundet werden.

Wenn die Dauer für Audiodaten nicht im komprimierten Format verfügbar ist, sollte der Decoder die Dauer als Inverse der Audioabtastrate multipliziert mit der Anzahl der Samples im Ausgabepuffer multipliziert, in 100-Nanosekunden-Einheiten konvertiert und gerundet berechnen.

Der einzige Zeitpunkt, zu dem eine Transformation ein Beispiel ohne Zeitstempel ausgeben sollte, ist, wenn der MFT noch nie einen Zeitstempel für ein Eingabebeispiel erhalten hat oder wenn es keine Möglichkeit gibt, einen genauen Ausgabezeitstempel aus dem vorherigen Eingabezeitstempel zu berechnen.

Audiodecoder

Bei Audiodecodern wird die Dauer jedes Ausgabebeispiels aus der Audio-Samplingrate und der Anzahl der PCM-Samples pro Kanal im Ausgabepuffer berechnet.

Die richtige Methode zum Berechnen von Ausgabezeitstempeln hängt davon ab, ob die Eingabebeispiele Zeitstempel enthalten.

Wenn die Eingabebeispiele Zeitstempel enthalten, berechnet der Decoder die Ausgabezeitstempel aus den Eingabezeitstempeln wie folgt:

  • Wenn jeder Eingabepuffer einen oder mehrere vollständige komprimierte Frames ohne Teilframes enthält, entspricht der Ausgabezeitstempel dem Eingabezeitstempel abzüglich der bekannten Latenz des Decoders. Beispielsweise weist ein Dolby Digital-Decoder (AC-3) eine Latenz von 256 PCM-Beispielen auf. Bei einer Abtastrate von 48 kHz beträgt die Latenz beispielsweise 5,33 Millisekunden (msec). Wenn der Eingabezeitstempel also 1000 msec ist, ist der Ausgabezeitstempel 1000 – 5,33 = 994,66 msec. Wenn der Eingabepuffer mehr als einen ganzen komprimierten Frame enthält, erzeugt der Decoder ein Ausgabebeispiel für jeden Frame im Eingabebeispiel. Alle Ausgabebeispiele werden ordnungsgemäß zeitstempelt, sodass keine Lücken vorhanden sind.
  • Je nach Transportformat kann ein Eingabepuffer teilweise Frames enthalten. Beispielsweise kann ein Puffer einen Teil eines Frames aus dem vorherigen Eingabepuffer enthalten, gefolgt von einem oder mehreren vollständigen Frames, gefolgt vom Start des nächsten Frames. In diesem Fall ist es im Allgemeinen richtig, davon auszugehen, dass der Eingabezeitstempel dem ersten Frame entspricht, der innerhalb des Puffers beginnt. (Das heißt, ein Teilframe, der im vorherigen Puffer gestartet wurde, ist nicht im Zeitstempel für den aktuellen Puffer enthalten.) Berechnen Sie den Ausgabezeitstempel entsprechend.

Wenn die Eingabebeispiele keine Zeitstempel enthalten:

  • Der Decoder sollte eigene Zeitstempel generieren und den ersten Ausgabezeitstempel auf 0 festlegen.
  • Die Stichprobendauer wird aus der Anzahl der Ausgabebeispiele im Puffer und der Abtastrate berechnet.
  • Nachfolgende Zeitstempel werden aus dem vorherigen Zeitstempel und der vorherigen Dauer berechnet: Aktueller Zeitstempel + aktuelle Dauer = nächster Zeitstempel. Es sollten keine Lücken in den Ausgabezeitstempeln vorhanden sein.

Wenn der Eingabedatenstrom anfänglich Zeitstempel enthält, aber aus irgendeinem Grund zu keinen Zeitstempeln wechselt, sollte der Decoder weiterhin seine eigenen Ausgabezeitstempel generieren, sodass diese kontinuierlich sind und keine Lücke besteht.

Wenn der Eingabedatenstrom Zeitstempel enthält, es aber Zeitlücken gibt, gibt der Decoder diese Lücken einfach weiter. Anders ausgedrückt: Der Decoder sollte nicht versuchen, inkonsistente Zeitstempel im Eingabedatenstrom zu beheben.

Mischer

Hinweis

In Windows Vista unterstützt die Media Foundation-Pipeline keine MFTs mit mehr als einer Eingabe. MFTs mit mehreren Eingaben werden in Windows 7 unterstützt.

 

Ein Mischer nimmt mehrere Eingaben auf und mischt sie in einer Ausgabe. Wenn die Eingabeströme nicht vollständig ratengesperrt oder zeitlich geringfügig versetzt sind, kann unklar sein, welche Zeit für die Ausgabe festgelegt werden soll. Je nach Medientyp finden Sie einige Richtlinien:

  • Audio. Beim Start oder unmittelbar nach einer Entleerung oder Spülung sollte ein Audiomischer mit der Erstellung von Ausgabebeispielen warten, bis er ein Eingabebeispiel für alle erforderlichen Eingabedatenströme erhalten hat. Zu diesem Zeitpunkt sollte der früheste Zeitstempel der ersten Beispiele ausgewählt werden, der als Basislinie für die Ausgabezeitstempel verwendet werden soll. Die anderen Streams sollten mit Stille gepolstert werden, um jegliche Zeitabweichungen aufholen zu können. Wenn ein Beispiel für einen optionalen Eingabedatenstrom empfangen wird, sollte es auch in die Berechnung einbezogen werden. Ab diesem Zeitpunkt sollte der MFT eine kontinuierliche und ungebrochene Kette von Ausgabezeitstempeln erzeugen. Im Allgemeinen sollte der MFT nicht versuchen, einen Stream zu berücksichtigen, der relativ zu einem anderen abdriftet. Stattdessen sollten die Ausgabezeitstempel aus dem Baselinezeitstempel, die Ausgaberate und die Puffergrößen berechnet werden. Wenn eine weitere Entleerung oder Leerung auftritt, sollte der MFT die geplanten Zeitstempel zurücksetzen.

  • Video. Beim Start oder unmittelbar nach einer Entleerung oder Spülung sollte ein Videomischer mit der Erstellung von Ausgabebeispielen warten, bis er ein Eingabebeispiel für alle erforderlichen Eingabedatenströme erhalten hat. Zu diesem Zeitpunkt sollte der früheste Zeitstempel der ersten Beispiele ausgewählt werden, der als Basislinie für die Ausgabezeitstempel verwendet werden soll. Im Allgemeinen sollte versucht werden, fortlaufende und regelmäßige Ausgabezeitstempel und feste Dauer beizubehalten, auch wenn die Eingabe nicht so regelmäßig ist, falls erforderlich durch wiederholende Eingabeframes.

Encoder

Ein Encoder konvertiert unkomprimiertes Audio oder Video in komprimierte Pakete. Ein Encoder sollte die folgenden Richtlinien befolgen:

  • Der Encoder sollte den Konventionen des Ausgabeformats entsprechen. Wenn das Format in der Regel nicht jedes Beispiel zeitstempelt, wie in MPEG-2, muss nicht jedes Ausgabebeispiel über einen Zeitstempel und eine Dauer verfügen.

  • Die Eingabezeitstempel sollten im Ausgabeformat beibehalten werden, wenn das Format Felder für Zeitstempel enthält, es sei denn, bessere Zeitinformationen sind aus einer anderen Quelle verfügbar, z. B. die Anwendung selbst.

Multiplexer

Hinweis

In Windows Vista unterstützt die Media Foundation-Pipeline keine MFTs mit mehr als einer Eingabe. MFTs mit mehreren Eingaben werden in Windows 7 unterstützt.

 

Ein Multiplexer kombiniert zwei verschiedene Audio- oder Videodatenströme in einem verschachtelten Format, z. B. AVI oder MPEG-2-Transportstream. Ein Multiplexer sollte die folgenden Richtlinien befolgen:

  • Der Multiplexer sollte den Konventionen des Ausgabeformats entsprechen. Wenn das Format in der Regel nicht jedes Beispiel zeitstempelt, wie in MPEG-2, muss nicht jedes Ausgabebeispiel über einen Zeitstempel und eine Dauer verfügen.

  • Der Zeitstempel sollte die früheste Zeit widerspiegeln, die auf einem Frame platziert wird, der in diesem Paket beginnt, oder die Zeit des ersten Audiobeispiels, das aus diesem Paket decodiert würde. Ignorieren Sie diese Richtlinie, wenn sie mit den Konventionen des Ausgabeformats in Konflikt kommt.

Demultiplexer

Ein Demultiplexer teilt ein verschachteltes Format, z. B. AVI oder MPEG-2-Transportstream, in die zugrunde liegenden Audio- und Videostreams auf.

Wenn das Format bestimmte Zeitstempelinformationen enthält, mit denen genaue Ausgabezeitstempel basierend auf den Eingabezeitstempeln berechnet werden können, sollten diese Informationen verwendet werden. Wenn das Format jedoch Zeiten in einer völlig anderen Basis enthält, die keine Beziehung zu den Eingabezeitstempeln haben, und ein präziser Offset zum Eingabezeitstempel nicht berechnet werden kann, sollten die eigenen Zeiten des Formats ignoriert werden.

Wenn das Format keine verwendbaren Zeitstempelinformationen enthält, sollte der Demultiplexer die folgenden Regeln befolgen:

  • Nicht komprimierte Ausgabedatenströme sollten nach Möglichkeit gültige Zeitstempel und Daueren aufweisen, die aus dem nächstgelegenen vorherigen Eingabezeitstempel berechnet werden.

  • Komprimierte Ausgabedatenströme sollten nur Zeitstempel für das erste Ausgabebeispiel aufweisen, das von einem Eingabebeispiel mit einem Zeitstempel abgeleitet ist. Wenn das Eingabebeispiel keinen Zeitstempel aufweist, sollten keine von diesem Eingabebeispiel abgeleiteten Ausgabebeispiele einen Zeitstempel aufweisen. Wenn das Eingabebeispiel in mehrere Ausgabebeispiele unterteilt ist, sollte nur das erste Ausgabebeispiel einen Zeitstempel aufweisen, und der Rest sollte keine Zeitstempel aufweisen.

Beispiele

Beispiel 1: Angenommen, ein Videoeffekt nimmt immer einen unkomprimierten Eingaberahmen an, wendet den Effekt an und kopiert ihn in die Ausgabe. Es hält keine Frames oder Puffer für Eingaben zurück. Dieser MFT kopiert einfach den Zeitstempel und die Dauer aus dem Eingabebeispiel in das Ausgabebeispiel, sofern sie verfügbar sind, und führt überhaupt keine Zeitberechnungen durch.

Beispiel 2: Angenommen, ein Audioeffekt transformiert alle bis auf 10 Millisekunden (ms) jedes Eingabepuffers, wodurch die zusätzlichen 10 ms für die Kombination mit dem nächsten Puffer gespeichert werden. Es wird ein Datenstrom von Beispielen abgerufen, die alle eine Dauer von 50 ms haben. Die Eingabezeiten sind in der folgenden Tabelle aufgeführt.

Beispiel Eingabezeit Eingabedauer Ausgabezeit Ausgabedauer
1 20 50 20 40
2 70 50 60 50
3 121 50 110 50
4 171 50 161 50

 

Beachten Sie die Diskrepanz von 1 ms zwischen der tatsächlichen Dauer der Stichprobe 2 und der impliziten Dauer basierend auf dem nächsten Zeitstempel (121 ? 70 = 51).

Da der MFT 10 ms zurückhält, gibt er die ersten 40 ms der Eingabestichprobe 1 als Ausgabebeispiel 1 mit einem Zeitstempel von 20 ms und einer Dauer von 40 ms aus.

Ausgabebeispiel 2 kombiniert die zuvor zurückgehaltenen 10 ms mit 40 ms Eingabebeispiel 2. Dieses Beispiel erhält einen Zeitstempel von 60 ms (der Zeitstempel der vorherigen Eingabestichprobe, 20 ms, plus die Dauer der daten, die bereits aus dieser Stichprobe verarbeitet wurden, 40 ms). Die Dauer beträgt 50 ms.

Ebenso weist das nächste Beispiel einen Zeitstempel von 110 ms (70 ms + 40ms) mit einer Dauer von 50 ms auf.

Interessanter ist die nächste Berechnung. Der implizierte Zeitstempel der vorherigen Ausgabezeit und -dauer beträgt 160 ms (Zeitstempel 110 ms + Dauer 50 ms). Der Ausgabezeitstempel sollte jedoch aus dem Eingabezeitstempel der frühesten Eingabestichprobe berechnet werden, die das Ausgabebeispiel zeitlich überschneidet, sowie aus der Länge aller daten, die bereits aus diesem Beispiel verarbeitet wurden. Das nächstgelegene überlappende Eingabebeispiel ist die Stichprobe 4 (Zeitstempel = 171), aber dies ist nicht das früheste. Das früheste überlappende Beispiel ist Beispiel 3 (Zeitstempel = 121). Wenn Sie die 40 ms hinzufügen, die bereits aus diesem Beispiel verarbeitet wurden, ist das Ergebnis 161.

Schreiben eines benutzerdefinierten MFT