Freigeben über


Referenzuhren

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

Eine Funktion des Filter Graph-Managers besteht darin, alle Filter im Graphen mit derselben Uhr zu synchronisieren, die als Referenzuhr bezeichnet wird.

Jedes Objekt, das die IReferenceClock-Schnittstelle verfügbar macht, kann als Referenzuhr fungieren. Die Referenzuhr kann von einem DirectShow-Filter bereitgestellt werden, in der Regel der Audiorenderer, der Zugriff auf einen Hardwaretimer hat. Als Fallback kann der Filter Graph-Manager die Systemzeit verwenden.

Nominal misst eine Referenzuhr die Zeit in Intervallen von 100 Nanosekunden, obwohl die tatsächliche Genauigkeit der Uhr möglicherweise geringer ist. Um die aktuelle Uhrzeit der Uhr abzurufen, rufen Sie die IReferenceClock::GetTime-Methode auf. Die Baseline der Uhr –die Zeit, ab der sie beginnt zu zählen – hängt von der Implementierung ab, sodass der von GetTime zurückgegebene Wert von Natur aus nicht aussagekräftig ist. Entscheidend ist das Delta ab dem Start der Ausführung des Graphen.

Obwohl die Genauigkeit einer Referenzuhr variieren kann, werden die von der GetTime-Methode zurückgegebenen Zeiten garantiert monoton erhöht. Anders ausgedrückt: Die Uhrzeiten werden nie rückwärts gehen. Wenn eine Referenzuhr Taktzeiten von einer Hardwarequelle generiert und die Hardwareuhr rückwärts springt (z. B. bei einer Anpassung an der Uhr), sollte die GetTime-Methode weiterhin die letzte gemeldete Zeit zurückgeben, bis die Hardwareuhr aufgeholt wird. Weitere Informationen finden Sie unter CBaseReferenceClock-Klasse.

Standardreferenzuhr

Der Filter Graph-Manager wählt automatisch eine Referenzuhr aus, wenn der Graph ausgeführt wird. Es verwendet den folgenden Algorithmus, um die Uhr auszuwählen:

  • Wenn die Anwendung eine Uhr ausgewählt hat (siehe unten), verwenden Sie diese Uhr.
  • Wenn das Diagramm einen Livequellenfilter enthält, der IReferenceClock unterstützt, verwenden Sie diesen Filter. Die Definition einer Livequelle finden Sie unter Livequellen.
  • Wenn das Diagramm KEINE Livequellenfilter enthält, verwenden Sie einen beliebigen Filter im Graphen, der IReferenceClock unterstützt, beginnend mit den Renderern und Upstream. Verbundene Filter gegenüber nicht verbundenen Filtern bevorzugen. (Wenn das Diagramm einen Audiodatenstrom rendert, wählt dieser Schritt im Algorithmus normalerweise den Audiorendererfilter aus.)
  • Wenn kein Filter eine geeignete Uhr bereitstellt, verwenden Sie die Systemverweisuhr, die auf der Systemzeit basiert.

Festlegen der Referenzuhr

Eine Anwendung kann eine Uhr auswählen, indem sie die IMediaFilter::SetSyncSource-Methode im Filter Graph-Manager aufruft. Sie sollten dies nur tun, wenn Sie einen bestimmten Grund haben, eine andere Uhr zu bevorzugen.

Sie können den Graphfilter-Manager anweisen, keine Verweisuhr zu verwenden, indem Sie SetSyncSource mit dem Wert NULL aufrufen. Sie können dies beispielsweise tun, um Beispiele so schnell wie möglich zu verarbeiten. Um die Standardreferenzuhr wiederherzustellen, rufen Sie die IFilterGraph::SetDefaultSyncSource-Methode im Filter Graph-Manager auf.

Wenn sich die Verweisuhr ändert, benachrichtigt der Filter Graph-Manager jeden Filter durch Aufrufen der IMediaFilter::SetSyncSource-Methode . Anwendungen sollten diese Methode niemals für Filter aufrufen.

Festlegen der Graphuhr

Zeit und Uhren in DirectShow