Livequellen

[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.]

Eine Livequelle, auch als Pushquelle bezeichnet, empfängt Daten in Echtzeit. Beispiele hierfür sind Videoaufzeichnungen und Netzwerkübertragungen. Im Allgemeinen kann eine Livequelle nicht die Rate steuern, mit der Daten eintreffen.

Ein Filter gilt als Livequelle, wenn einer der folgenden Punkte zutrifft:

Wenn ein Livequellenfilter eine Uhr bereitstellt, bevorzugt der Filter graph-Manager diese Uhr, wenn er die Diagrammreferenzuhr wählt. Weitere Informationen finden Sie unter Referenzuhren .

Latenz

Die Latenz eines Filters ist die Zeitspanne, die der Filter benötigt, um ein Beispiel zu verarbeiten. Bei Livequellen wird die Latenz durch die Größe des Puffers bestimmt, der zum Aufnehmen von Beispielen verwendet wird. Angenommen, das Filterdiagramm verfügt über eine Videoquelle mit einer Latenz von 33 Millisekunden (ms) und eine Audioquelle mit einer Latenz von 500 ms. Jeder Videoframe erreicht den Videorenderer ca. 470 ms, bevor das entsprechende Audiobeispiel den Audiorenderer erreicht. Sofern das Diagramm den Unterschied nicht kompensiert, werden Audio und Video nicht synchronisiert.

Livequellen können über die IAMPushSource-Schnittstelle synchronisiert werden. Der Filter Graph-Manager synchronisiert keine Livequellen, es sei denn, die Anwendung aktiviert die Synchronisierung durch Aufrufen der IAMGraphStreams::SyncUsingStreamOffset-Methode . Wenn die Synchronisierung aktiviert ist, fragt der Filter Graph Manager jeden Quellfilter nach IAMPushSource ab. Wenn der Filter IAMPushSource unterstützt, ruft der Filtergraph-Manager IAMLatency::GetLatency auf, um die erwartete Latenz des Filters abzurufen. (Die IAMPushSource-Schnittstelle erbt IAMLatency.) Aus den kombinierten Latenzwerten bestimmt der Filter Graph-Manager die maximale erwartete Latenz im Diagramm. Anschließend wird IAMPushSource::SetStreamOffset aufgerufen, um jedem Quellfilter einen Streamoffset zu geben, den dieser Filter den generierten Zeitstempeln hinzufügt.

Diese Methode ist in erster Linie für die Livevorschau vorgesehen. Beachten Sie jedoch, dass ein Vorschaunadel auf einem Liveaufnahmegerät (z. B. einer Kamera) keine Zeitstempel für die von ihr gelieferten Beispiele festgelegt. Um diese Methode mit einem Liveerfassungsgerät verwenden zu können, müssen Sie eine Vorschau über den Aufnahmenadel anzeigen. Weitere Informationen finden Sie unter DirectShow-Videoaufnahmefilter.

Derzeit wird die IAMPushSource-Schnittstelle vom VFW-Erfassungsfilter und dem Audioaufnahmefilter unterstützt.

Ratenabgleich

Wenn ein Rendererfilter Beispiele mit einer Referenzuhr plant, der Quellfilter sie jedoch mit einer anderen Uhr erzeugt, können Fehler bei der Wiedergabe auftreten. Der Renderer kann schneller als die Quelle ausgeführt werden, was zu Datenlücken führt. Oder es kann langsamer als die Quelle ausgeführt werden, was dazu führt, dass die Beispiele "zusammenhingen", bis das Diagramm die Stichproben irgendwann fallen lässt. In der Regel kann eine Livequelle ihre Produktionsrate nicht steuern, sodass der Renderer stattdessen die Raten mit der Quelle abgleichen sollte.

Derzeit führt nur der Audiorenderer einen Ratenabgleich durch, da Störungen bei der Audiowiedergabe stärker spürbar sind als Störungen im Video. Um den Ratenabgleich durchzuführen, muss der Audiorenderer etwas auswählen, mit dem er den Raten entspricht. Es verwendet den folgenden Algorithmus:

  • Wenn das Diagramm keine Referenzuhr verwendet, versucht der Audiorenderer nicht, die Raten abzugleichen. (Wenn das Diagramm keine Referenzuhr aufweist, werden Die Stichproben immer sofort gerendert, sobald sie eintreffen.)
  • Andernfalls überprüft der Audiorenderer unter Verwendung der zuvor beschriebenen Kriterien, ob eine Livequelle Upstream vorhanden ist, wenn eine Referenzuhr für das Diagramm vorhanden ist. Andernfalls stimmt der Audiorenderer nicht mit den Raten überein.
  • Wenn eine Livequelle Upstream vorhanden ist und diese Quelle die IAMPushSource-Schnittstelle an ihrem Ausgabenadel verfügbar macht, ruft der Audiorenderer IAMPushSource::GetPushSourceFlags auf. Es sucht nach einem der folgenden Flags:
    • AM_PUSHSOURCECAPS_INTERNAL_RM. Dieses Flag bedeutet, dass der Quellfilter über einen eigenen Mechanismus für die Ratenanpassung verfügt, sodass der Audiorenderer nicht mit den Raten übereinstimmt.
    • AM_PUSHSOURCECAPS_NOT_LIVE. Dieses Flag bedeutet, dass der Quellfilter nicht wirklich eine Livequelle ist, obwohl er die IAMPushSource-Schnittstelle verfügbar macht. Daher stimmt der Audiorenderer nicht mit den Raten überein.
    • AM_PUSHSOURCECAPS_PRIVATE_CLOCK. Dieses Flag bedeutet, dass der Quellfilter eine private Uhr verwendet, um Zeitstempel zu generieren. In diesem Fall vergleicht der Audiorenderer die Raten mit den Zeitstempeln. (Wenn die Beispiele jedoch keine Zeitstempel aufweisen, ignoriert der Renderer dieses Flag.)
  • Wenn GetPushSourceFlags keine Flags (null) zurückgibt, hängt das Verhalten des Audiorenderers von der Graphuhr und davon ab, ob die Beispiele Zeitstempel aufweisen:
    • Wenn der Audiorenderer nicht die Graphuhr und die Beispiele Zeitstempel aufweisen, gleicht der Audiorenderer die Raten mit den Zeitstempeln ab.
    • Wenn die Beispiele keine Zeitstempel aufweisen, versucht der Audiorenderer, die Rate der eingehenden Audiodaten zu entsprechen.
    • Wenn der Audiorenderer die Graphuhr ist, versucht er, die eingehende Datenrate zu entsprechen.

Der Grund für den letzten Fall ist folgender: Wenn der Audiorenderer die Referenzuhr ist und der Quellfilter dieselbe Uhr verwendet, um Zeitstempel zu generieren, kann der Audiorenderer die Raten nicht mit den Zeitstempeln abgleichen. Wenn ja, würde es tatsächlich versuchen, die Raten mit sich selbst abzugleichen, was dazu führen könnte, dass die Uhr abdrift. Daher stimmt der Renderer in diesem Fall mit der Rate eingehender Audiodaten überein.

Zeit und Uhren in DirectShow