Zeitstempel und Dauer
In diesem Thema wird beschrieben, wie Media Foundation Transforms Zeitstempel behandeln sollten.
Ein MFT muss für alle Ausgabebeispiele so genau wie möglich einen Zeitstempel und eine genaue Dauer festlegen. Für einen einfachen MFT, der einen Eingabepuffer verwendet und ihn vollständig in einen Ausgabepuffer verarbeitet, sollte MFT einfach den Zeitstempel und die Dauer direkt aus dem Eingabebeispiel in das Ausgabebeispiel kopieren. Viele Transformationen sind jedoch komplexer als dies 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 wird oder berechnet werden kann. Die Interpolation kann für einige Ausgabezeitstempel erforderlich sein, insbesondere für Decoder.
- Die Zeitstempel und Dauer der Eingabebeispiele sollten auf den Ausgabebeispielen so weit wie möglich beibehalten werden.
- Die Ausgabezeitstempel oder -dauer stimmen möglicherweise nicht mit der Eingabe überein, da die MFT Daten zurückhält oder die Ausgabe in verschiedene Teile unterteilt als die Eingabe. 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. Um den Ausgabezeitstempel zu berechnen, fügen Sie den Eingabezeitstempel des entsprechenden Eingabebeispiels zur 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 MFT eine Dauer berechnen, sofern möglich aus der Größe des Ausgabepuffers oder der vom Medientyp angegebenen Datenrate.
- Berechnete Dauer sollte abgeschnitten (aufgerundet) und nicht auf das nächste Inkrement gerundet werden. Die Pipeline hat genügend Pufferzeit, um Die Dauer zu verarbeiten, die etwas ungenau sind, aber es ist einfacher, eine Dauer von 1% zu kurz zu behandeln als eine Dauer von 1% zu lang. Das heißt, es gibt keinen Grund, die Dauer absichtlich zu kürzen, außer durch Runden.
Decoder
Ein Decoder konvertiert komprimierte Pakete in nicht komprimierte Daten. Da die Ausgabe nicht komprimiert ist, haben Decoder eine besondere Verpflichtung, die Zeitstempel und Dauer korrekt zu erhalten. Einige komprimierte Formate, vor allem MPEG-2, verfügen nicht über Zeitstempel für alle Eingabepakete und haben häufig keine Dauer für ein Paket. Für diese Formate ist der Decoder dafür verantwortlich, einen gültigen Zeitstempel und eine gültige Dauer in jedes Ausgabebeispiel einzufügen, indem die implizierte Dauer aller Ausgaben seit dem letzten Zeitstempeleingabebeispiel addiert wird.
Wenn die Dauer im komprimierten Format nicht verfügbar ist, sollte der Decoder die Dauer als Umkehrung der Bildfrequenz berechnen, in 100-Nanosekunden konvertiert und aufgerundet werden.
Wenn die Dauer für Audiodaten nicht im komprimierten Format verfügbar ist, sollte der Decoder die Dauer als Umkehrung der Audio-Samplerate berechnen, die mit der Anzahl der Beispiele im Ausgabepuffer multipliziert wird, in 100-Nanosekunden konvertiert und aufgerundet wird.
Die einzige Zeit, zu der eine Transformation ein Beispiel ohne Zeitstempel ausgeben soll, ist, wenn der MFT 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 der einzelnen Ausgabebeispiele anhand der Audiosamplingrate und der Anzahl der PCM-Beispiele 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 minus der bekannten Latenz des Decoders. Ein Dolby Digital-Decoder (AC-3) hat beispielsweise eine Latenz von 256 PCM-Beispielen. Bei einer Samplingrate von 48 kHz beträgt die Latenz beispielsweise 5,33 Millisekunden (msec). Wenn der Eingabezeitstempel also 1000 msec beträgt, beträgt der Ausgabezeitstempel 1000 – 5,33 = 994,66 msec. Wenn der Eingabepuffer mehr als einen ganzen komprimierten Frame enthält, erzeugt der Decoder für jeden Frame im Eingabebeispiel ein Ausgabebeispiel. Alle Ausgabebeispiele werden korrekt gestempelt, sodass keine Lücken vorhanden sind.
- Je nach Transportformat kann ein Eingabepuffer Teilframes enthalten. Ein Puffer kann z. B. einen Teil eines Frames aus dem vorherigen Eingabepuffer enthalten, gefolgt von einem oder mehreren vollständigen Frames, gefolgt vom Anfang 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, wobei der erste Ausgabezeitstempel auf Null festgelegt wird.
- Die Stichprobendauer wird aus der Anzahl der Ausgabebeispiele im Puffer und der Stichprobenrate berechnet.
- Nachfolgende Zeitstempel werden aus dem vorherigen Zeitstempel und der 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 ohne Zeitstempel wechselt, sollte der Decoder weiterhin eigene Ausgabezeitstempel generieren, sodass sie fortlaufend sind und keine Lücke vorhanden ist.
Wenn der Eingabedatenstrom Zeitstempel enthält, es jedoch Lücken in den Zeiten gibt, verteilt der Decoder einfach diese Lücken. Mit anderen Worten, der Decoder sollte nicht versuchen, inkonsistente Zeitstempel im Eingabedatenstrom zu beheben.
Mixer
Anmerkung
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 und mischt sie in eine Ausgabe. Wenn die Eingabedatenströme nicht vollständig versperrt sind oder geringfügig voneinander versetzt sind, kann es mehrdeutig sein, welche Zeit für die Ausgabe festgelegt werden soll. Hier sind einige Richtlinien, je nach Medientyp:
Audio. Beim Start oder unmittelbar nach einem Abfluss oder Spülen sollte ein Audiomischer warten, bis es ein Eingabebeispiel für alle erforderlichen Eingabedatenströme erhalten hat. Zu diesem Zeitpunkt sollte der früheste Zeitstempel der ersten Stichproben ausgewählt werden, die als Basislinie für die Ausgabezeitstempel verwendet werden sollen. Die anderen Datenströme sollten mit Stille gepolstert werden, um jederzeit Diskrepanzen zu machen. Wenn ein Beispiel für einen optionalen Eingabedatenstrom empfangen wird, sollte es auch in die Berechnung einbezogen werden. Ab diesem Zeitpunkt sollte die MFT eine kontinuierliche und ungebrochene Kette von Ausgabezeitstempeln erzeugen. Im Allgemeinen sollte der MFT nicht versuchen, einen Datenstrom relativ zu einem anderen zu berücksichtigen. Stattdessen sollten die Ausgabezeitstempel aus dem geplanten Zeitstempel, der Ausgaberate und den Puffergrößen berechnet werden. Wenn ein anderer Abfluss oder eine andere Spülung auftritt, sollte der MFT seine geplanten Zeitstempel zurücksetzen.
Video. Beim Start oder unmittelbar nach einem Abfluss oder Spülen sollte ein Videomischer warten, bis es ein Eingabebeispiel für alle erforderlichen Eingabedatenströme erhalten hat. Zu diesem Zeitpunkt sollte der früheste Zeitstempel der ersten Stichproben ausgewählt werden, die als Basislinie für die Ausgabezeitstempel verwendet werden sollen. Im Allgemeinen sollte versucht werden, fortlaufende und regelmäßige Ausgabezeitstempel und feste Dauer beizubehalten, auch wenn die Eingabe nicht so normal ist, wenn dies erforderlich ist, indem Eingabeframes wiederholt werden.
Encoder
Ein Encoder wandelt nicht komprimierte Audio- oder Videodaten in komprimierte Pakete um. 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
Anmerkung
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 Videostreams in einem überlappenden Format, z. B. AVI oder MPEG-2 Transport Stream. Ein Multiplexer sollte die folgenden Richtlinien befolgen:
Das 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 steht.
Demultiplexer
Ein Demultiplexer teilt ein interleaviertes Format wie AVI oder MPEG-2 Transport Stream 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 Uhrzeiten in einer völlig anderen Basis enthält, die keine Beziehung zu den Eingabezeitstempeln aufweisen, und ein genauer Offset zum Eingabezeitstempel nicht berechnet werden kann, sollte die Uhrzeit 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 Dauer aufweisen, die aus dem nächstgelegenen vorherigen Eingabezeitstempel berechnet werden.
Komprimierte Ausgabedatenströme sollten zeitstempel nur für das erste Ausgabebeispiel aufweisen, das von einem Eingabebeispiel mit einem Zeitstempel abgeleitet wurde. Wenn das Eingabebeispiel keinen Zeitstempel hat, sollten keine Ausgabebeispiele, die von diesem Eingabebeispiel abgeleitet wurden, 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 verwendet immer einen nicht komprimierten Eingabeframe, wendet den Effekt an und kopiert ihn in die Ausgabe. Es hält keine Frames oder Puffer für eingaben. 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 außer 10 Millisekunden (ms) jedes Eingabepuffers und speichert die zusätzlichen 10 ms, um mit dem nächsten Puffer zu kombinieren. Es erhält einen Datenstrom von Beispielen, die alle eine Dauer von 50 ms haben. Die Eingabezeiten werden in der folgenden Tabelle angezeigt.
Probe | 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 1 Ms-Diskrepanz zwischen der tatsächlichen Dauer der Stichprobe 2 und der implizierten Dauer basierend auf dem nächsten Zeitstempel (121 ? 70 = 51).
Da die MFT 10 ms zurückhält, gibt sie die ersten 40 ms des Eingabebeispiels 1 als Ausgabebeispiel 1 aus, mit einem Zeitstempel von 20 ms und einer Dauer von 40 ms.
Ausgabebeispiel 2 kombiniert die 10 ms, die zuvor mit 40 ms des Eingabebeispiels 2 zurückgehalten wurden. Dieses Beispiel erhält einen Zeitstempel von 60 ms (den Zeitstempel des vorherigen Eingabebeispiels, 20 ms und die Dauer der daten, die bereits aus dieser Stichprobe verarbeitet wurden, 40 ms). Es erhält eine Dauer von 50 ms.
Ebenso weist das nächste Beispiel einen Zeitstempel von 110 ms (70 ms + 40 ms) mit einer Dauer von 50 ms auf.
Die nächste Berechnung ist interessanter. Der konkludente Zeitstempel der vorherigen Ausgabezeit und Dauer beträgt 160 ms (Zeitstempel 110 ms + Dauer 50 ms). Der Ausgabezeitstempel sollte jedoch aus dem Eingabezeitstempel des frühesten Eingabebeispiels berechnet werden, das das Ausgabebeispiel in der Zeit überlappt, sowie die Länge aller Daten, die bereits aus diesem Beispiel verarbeitet wurden. Das nächstgelegene überlappende Eingabebeispiel ist das Beispiel 4 (Zeitstempel = 171), dies ist jedoch nicht die früheste. Das früheste überlappende Beispiel ist Beispiel 3 (Zeitstempel = 121). Wenn Sie die 40 ms hinzufügen, die bereits aus dieser Stichprobe verarbeitet wurden, lautet das Ergebnis 161.
Verwandte Themen