Zeitstempel

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

Der Zeitstempel definiert die Start- und Endzeiten eines Medienbeispiels, gemessen in der Streamzeit. Der Zeitstempel wird manchmal als Präsentationszeit bezeichnet. Wenn Sie den Rest dieses Artikels lesen, sollten Sie beachten, dass nicht alle Formate Zeitstempel auf die gleiche Weise verwenden. Beispielsweise sind nicht alle MPEG-Beispiele zeitstempelt. In MPEG-Filterdiagrammen wird der Zeitstempel erst dann auf jeden Frame angewendet, wenn sie vom Decoder ausgegeben werden.

Wenn ein Rendererfilter ein Beispiel empfängt, plant er das Rendern basierend auf dem Zeitstempel. Wenn das Beispiel zu spät eintrifft oder keinen Zeitstempel aufweist, rendert der Filter das Beispiel sofort. Andernfalls wartet der Filter bis zur Startzeit des Beispiels, bevor das Beispiel gerendert wird. (Es wartet auf die Startzeit, indem die IReferenceClock::AdviseTime-Methode aufgerufen wird.)

Quellfilter und Parserfilter sind für das Festlegen der richtigen Zeitstempel für die von ihnen verarbeiteten Beispiele verantwortlich. Verwenden Sie die folgenden Richtlinien.

  • Dateiwiedergabe: Das erste Beispiel ist zeitstempelt mit einer Startzeit von 0. Nachfolgende Zeitstempel werden durch die Stichprobenlänge und die Wiedergaberate bestimmt, die selbst durch das Dateiformat bestimmt wird. Der Filter, der die Datei analysiert, ist für die Berechnung der richtigen Zeitstempel (z. B. avi Splitter) verantwortlich.
  • Video- und Audioaufnahme: Jedes Beispiel ist zeitstempelt mit einer Startzeit, die der Datenstromzeit entspricht, zu der es aufgenommen wurde, mit den folgenden Einschränkungen:
    • Videoframes von einem Vorschaupin (im Gegensatz zu einem Aufnahmenadel) sind nicht zeitstempelt. Aufgrund der Graphlatenz kommt ein Videoframe, der mit der Aufnahmezeit gestempelt ist, immer spät beim Videorenderer an. Dies kann dazu führen, dass der Renderer Frames bei einem Versuch der Qualitätskontrolle ablöscht. Informationen zur Qualitätskontrolle finden Sie unter Qualitätskontrollverwaltung.
    • Audioaufnahme: Der Audioaufnahmefilter verwendet einen eigenen Satz von Puffern, die von den vom Audiotreiber verwendeten Puffern getrennt sind. Der Audiotreiber füllt die Puffer des Erfassungsfilters in festen Intervallen aus. Das Intervall hängt vom Treiber ab, beträgt aber in der Regel nicht mehr als 10 Millisekunden. Die Zeitstempel in den Audiobeispielen spiegeln die Zeit wider, zu der der Treiber die Puffer des Audioaufnahmefilters gefüllt hat. Diese Zeiten können etwas ungenau sein, insbesondere wenn die Anwendung eine sehr kleine Puffergröße verwendet. Die Medienzeiten spiegeln jedoch genau die Anzahl der Audiobeispiele im Puffer wider.
  • Mux-Filter: Je nach Ausgabeformat muss ein Mux-Filter möglicherweise Zeitstempel generieren oder nicht. Das AVI-Dateiformat verwendet beispielsweise eine feste Bildrate ohne Zeitstempel, sodass der AVI Mux-Filter davon ausgeht, dass die Stichproben ungefähr zur richtigen Zeit eintreffen. Wenn die eingehenden Zeitstempel jedoch eine Lücke aufweisen, die größer als ein Frame ist, schreibt der AVI Mux einen Indexeintrag mit der Größe 0, um einen gelöschten Frame anzugeben. Bei der Dateiwiedergabe werden zur Laufzeit neue Zeitstempel generiert, wie zuvor beschrieben.

Um den Zeitstempel für ein Beispiel festzulegen, rufen Sie die IMediaSample::SetTime-Methode auf.

Medienzeiten

Optional kann der Filter auch eine Medienzeit für das Beispiel angeben. In einem Videostream stellt die Medienzeit die Framenummer dar. In einem Audiostream stellt die Medienzeit die Beispielnummer im Paket dar. Wenn jedes Paket beispielsweise eine Sekunde mit 44,1 Kilohertz (kHz) Audio enthält, weist das erste Paket eine Medienstartzeit von 0 0 und eine Medienstoppzeit von 44100 auf. In einem suchbaren Stream ist die Medienzeit immer relativ zur Startzeit des Datenstroms. Angenommen, Sie versuchen zwei Sekunden ab dem Beginn eines 15-fps-Videostreams. Das erste Medienbeispiel nach der Suche hat einen Zeitstempel von 0, aber eine Medienzeit von 30.

Renderer- und Muxfilter können die Medienzeit nutzen, um zu bestimmen, ob Frames oder Beispiele gelöscht wurden, indem sie auf Lücken überprüfen. Filter sind jedoch nicht erforderlich, um die Medienzeit festzulegen. Um die Medienzeit für ein Beispiel festzulegen, rufen Sie die IMediaSample::SetMediaTime-Methode auf.

Zeit und Uhren in DirectShow