Freigeben über


Livequellen

[Das dieser Seite zugeordnete Feature DirectShow-ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngineund Audio/Video Capture in Media Foundationersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code MediaPlayer-, IMFMediaEngine und Audio-/Videoaufnahme in Media Foundation anstelle von DirectShow-verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, um die neuen APIs zu verwenden, falls möglich umgeschrieben werden.]

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

Ein Filter wird als Livequelle betrachtet, wenn eine der folgenden Werte zutrifft:

  • Der Filter gibt das AM_FILTER_MISC_FLAGS_IS_SOURCE Flag aus der IAMFilterMiscFlags::GetMiscFlags Methode zurück, UND mindestens eine seiner Ausgabe-Pins macht die IAMPushSource- Schnittstelle verfügbar.
  • Der Filter macht die IKsPropertySet Schnittstelle verfügbar und verfügt über einen Aufnahme-Pin (PIN_CATEGORY_CAPTURE). Weitere Informationen finden Sie unter Pin Property Set.

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

Latenz

Die Latenz eines Filters ist die Zeitspanne, die der Filter zum Verarbeiten eines Beispiels benötigt. 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 einer Audioquelle mit einer Latenz von 500 ms. Jeder Videoframe gelangt zum Videorenderer ca. 470 ms, bevor das entsprechende Audiobeispiel den Audiorenderer erreicht. Sofern das Diagramm den Unterschied nicht ausgleicht, 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 ermöglicht die Synchronisierung durch Aufrufen der IAMGraphStreams::SyncUsingStreamOffset-Methode. Wenn die Synchronisierung aktiviert ist, fragt der Filter Graph Manager jeden Quellfilter für IAMPushSource-ab. Wenn der Filter IAMPushSource-unterstützt, ruft der FilterDiagramm-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 Datenstromoffset zu geben, der durch diesen Filter zu den von ihm generierten Zeitstempeln hinzugefügt wird.

Diese Methode ist in erster Linie für die Livevorschau vorgesehen. Beachten Sie jedoch, dass eine Vorschau-Pin auf einem Liveaufnahmegerät (z. B. eine Kamera) keine Zeitstempel für die von ihr bereitgestellten Beispiele festgelegt. Damit Sie diese Methode mit einem Liveaufnahmegerät verwenden können, müssen Sie eine Vorschau des Aufnahme-Pins anzeigen. Weitere Informationen finden Sie unter DirectShow Video Capture Filters.

Derzeit wird die IAMPushSource Schnittstelle vom VFW Capture Filter und dem Audio Capture Filter unterstützt.

Wenn ein Rendererfilter Beispiele mit einer Referenzuhr plant, der Quellfilter sie jedoch mit einer anderen Uhr erzeugt, können Störungen in der Wiedergabe auftreten. Der Renderer kann schneller als die Quelle ausgeführt werden, was zu Lücken in den Daten führt. Oder es kann langsamer als die Quelle ausgeführt werden, was dazu führt, dass Beispiele "bündeln", bis irgendwann das Diagramm Beispiele abgibt. In der Regel kann eine Livequelle ihre Produktionsrate nicht steuern. Stattdessen sollte der Renderer die Raten mit der Quelle abgleichen.

Derzeit führt nur der Audiorenderer einen Abgleich der Rate durch, da Störungen bei der Audiowiedergabe spürbarer sind als Störungen im Video. Zum Durchführen des Rateabgleichs muss der Audiorenderer etwas auswählen, mit dem er den Sätzen 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 Beispiele immer sofort gerendert, sobald sie eingehen.)
  • Andernfalls überprüft der Audiorenderer, ob eine Livequelle vorgelagert ist, wenn ein Referenzuhr für das Diagramm vorhanden ist. Dabei werden die zuvor beschriebenen Kriterien verwendet. Ist dies nicht der Fall, stimmt der Audiorenderer nicht mit den Raten überein.
  • Wenn eine Livequelle vorgelagert ist und diese Quelle die IAMPushSource Schnittstelle an der Ausgabenadel verfügbar macht, ruft der Audiorenderer IAMPushSource::GetPushSourceFlagsauf. Es sucht nach einer der folgenden Flags:
    • AM_PUSHSOURCECAPS_INTERNAL_RM. Dieses Kennzeichen bedeutet, dass der Quellfilter über einen eigenen Mechanismus zum Abgleich von Geschwindigkeiten 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, auch wenn er die IAMPushSource Schnittstelle verfügbar macht. Daher stimmt der Audiorenderer nicht mit den Raten überein.
    • AM_PUSHSOURCECAPS_PRIVATE_CLOCK. Dieses Kennzeichen bedeutet, dass der Quellfilter eine private Uhr verwendet, um Zeitstempel zu generieren. In diesem Fall stimmt der Audiorenderer mit den Zeitstempeln überein. (Wenn die Beispiele jedoch keine Zeitstempel haben, ignoriert der Renderer dieses Flag.)
  • Wenn GetPushSourceFlags keine Flags (Null) zurückgibt, hängt das Verhalten des Audiorenderers von der Graphuhr ab und gibt an, ob die Beispiele Zeitstempel haben:
    • Wenn der Audiorenderer nicht die Graphuhr ist und die Beispiele Zeitstempel aufweisen, stimmt der Audiorenderer mit den Zeitstempeln überein.
    • Wenn die Beispiele keine Zeitstempel haben, versucht der Audiorenderer, die Rate eingehender Audiodaten abzugleichen.
    • Wenn der Audiorenderer die Graphuhr ist, wird versucht, die eingehende Datenrate abzugleichen.

Der Grund für den letzten Fall ist Folgendes: 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 entspricht der Renderer in diesem Fall der Rate eingehender Audiodaten.

Zeit und Uhren in DirectShow-