Livequellen

Eine Livequelle, die auch als Pushquelle bezeichnet wird, empfängt Daten in Echtzeit. Beispiele hierfür 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 einer der folgenden Bedingungen zutrifft:

Wenn ein Livequellenfilter eine Uhr enthält, bevorzugt der Filter-Graph-Manager diese Uhr, wenn er die Graphverweisuhr auswählt. Weitere Informationen finden Sie unter Referenzuhren.

Latenz

Die Latenz eines Filters ist die Zeit, die der Filter benötigt, um ein Beispiel zu verarbeiten. Bei Livequellen wird die Latenz durch die Größe des Puffers bestimmt, der zum Halten von Stichproben 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 der Graph den Unterschied nicht ausgleicht, werden die Audio- und Videodaten nicht synchronisiert.

Livequellen können über die IAMPushSource-Schnittstelle synchronisiert werden. Der Filter Graph Manager synchronisiert nur Livequellen, wenn die Anwendung die Synchronisierung durch Aufrufen der IAMGraphStreams::SyncUsingStreamOffset-Methode aktiviert. Wenn die Synchronisierung aktiviert ist, fragt der Graph-Manager jeden Quellfilter für IAMPushSource ab. Wenn der Filter IAMPushSource unterstützt, ruft der Filter-Graph-Manager IAMLatency::GetLatency auf, um die erwartete Latenz des Filters abzurufen. (Die IAMPushSource-Schnittstelle erbt IAMLatency.) Anhand der kombinierten Latenzwerte bestimmt der Filter-Graph-Manager die maximal erwartete Latenz im Diagramm. Anschließend ruft sie IAMPushSource::SetStreamOffset auf, um jedem Quellfilter einen Streamoffset zu geben, der den von ihm generierten Zeitstempeln durch diesen Filter erhöht wird.

Diese Methode ist in erster Linie für die Livevorschau vorgesehen. Beachten Sie jedoch, dass ein Vorschaupin auf einem Liveaufnahmegerät (z. B. einer Kamera) keine Zeitstempel für die von ihm übertragenen Beispiele festgelegt. Um diese Methode mit einem Liveerfassungsgerät zu verwenden, müssen Sie daher eine Vorschau über den Aufnahmepin anzeigen. Weitere Informationen finden Sie unter DirectShow Video Capture Filters.

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

Rate Matching

Wenn ein Rendererfilter Stichproben mit einer Verweisuhr geplant, aber der Quellfilter sie mit einer anderen Uhr erzeugt, können bei der Wiedergabe Störungen auftreten. Der Renderer wird möglicherweise schneller als die Quelle ausgeführt, wodurch Lücken in den Daten verursacht werden. Oder es kann langsamer als die Quelle ausgeführt werden, was dazu führt, dass Stichproben "bündelt" werden, bis das Diagramm die Stichproben zu einem bestimmten Zeitpunkt verdringt. In der Regel kann eine Livequelle ihre Produktionsrate nicht steuern, daher sollte der Renderer die Raten mit der Quelle ab übereinstimmen.

Derzeit führt nur der Audiorenderer einen Ratenabgleich durch, da Störungen bei der Audiowiedergabe deutlicher sind als Störungen im Video. Um einen Ratenabgleich durchzuführen, muss der Audiorenderer etwas auswählen, mit dem er die Raten abgleicht. Dabei wird der folgende Algorithmus verwendet:

  • Wenn das Diagramm keine Referenzuhr verwendet, versucht der Audiorenderer nicht, Die Raten zu finden. (Wenn das Diagramm keine Referenzuhr hat, werden Stichproben immer sofort gerendert, sobald sie eintreffen.)
  • Andernfalls überprüft der Audiorenderer anhand der oben beschriebenen Kriterien, ob eine Livequelle vorgeschaltet ist, wenn es eine Referenzuhr für das Diagramm gibt. Falls nicht, findet der Audiorenderer keine Übereinstimmung mit Raten.
  • Wenn eine Livequelle vorgeschaltet ist und diese Quelle die IAMPushSource-Schnittstelle auf dem Ausgabepin verfügbar macht, ruft der Audiorenderer IAMPushSource::GetPushSourceFlagsauf. Es sucht nach einem der folgenden Flags:
    • AM _ PUSHSOURCECAPS _ INTERNAL _ RM. Dieses Flag bedeutet, dass der Quellfilter über einen eigenen Mechanismus zum Abgleich der Rate verfügt, sodass der Audiorenderer nicht mit Raten abgleicht.
    • AM _ PUSHSOURCECAPS _ NICHT _ LIVE. Dieses Flag bedeutet, dass der Quellfilter eigentlich keine Livequelle ist, obwohl er die IAMPushSource-Schnittstelle verfügbar macht. Daher findet der Audiorenderer keine Übereinstimmung mit Raten.
    • AM _ PUSHSOURCECAPS _ PRIVATE _ CLOCK. Dieses Flag bedeutet, dass der Quellfilter eine private Uhr verwendet, um Zeitstempel zu generieren. In diesem Fall stimmt der Audiorenderer die Raten mit den Zeitstempeln ab. (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 davon, ob die Beispiele Zeitstempel haben:
    • Wenn der Audiorenderer nicht die Graphuhr ist und die Beispiele Zeitstempel haben, stimmt der Audiorenderer die Raten mit den Zeitstempeln ab.
    • Wenn die Beispiele keine Zeitstempel haben, versucht der Audiorenderer, mit der Rate eingehender Audiodaten zu übereinstimmen.
    • Wenn der Audiorenderer die Graphuhr ist, versucht er, mit der eingehenden Datenrate zu übereinstimmen.

Der Grund für den letzten Fall ist der folgende: 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 ab stimmen. Wenn dies der Wert wäre, würde er versuchen, die Raten mit sich selbst zu abwehen, was zu Abweichungen der Uhr führen könnte. Daher stimmt der Renderer in diesem Fall mit der Rate eingehender Audiodaten ab.

Zeit und Uhren in DirectShow