Referenzuhren
[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 Funktion des Filter Graph-Managers besteht darin, alle Filter im Diagramm mit der gleichen Uhr zu synchronisieren, die als Referenzuhrbezeichnet 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 100-Nanosekunden-Intervallen, obwohl die tatsächliche Genauigkeit der Uhr geringer sein kann. Rufen Sie zum Abrufen der aktuellen Uhrzeit die IReferenceClock::GetTime-Methode auf. Die Basislinie der Uhr – die Zeit, von der aus sie gezählt wird – hängt von der Implementierung ab, sodass der von GetTime zurückgegebene Wert nicht inhärent aussagekräftig ist. Was wichtig ist, ist das Delta, wenn das Diagramm gestartet wurde.
Obwohl die Genauigkeit einer Referenzuhr variieren kann, werden die von der GetTime Methode zurückgegebenen Zeiten garantiert monoton erhöht. Mit anderen Worten: Die Uhrzeiten gehen nie rückwärts. Wenn eine Referenzuhr Taktzeiten aus einer Hardwarequelle generiert und die Hardwareuhr rückwärts springt (z. B. wenn eine Anpassung an die Uhr vorhanden ist), sollte die GetTime--Methode die letzte gemeldete Zeit weiterhin zurückgeben, bis die Hardwareuhr nachholt. Weitere Informationen finden Sie unter CBaseReferenceClock Class.
Standardreferenzuhr
Der Filter Graph-Manager wählt automatisch eine Referenzuhr aus, wenn das Diagramm 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. Informationen zur Definition einer Livequelle finden Sie unter live sources.
- Wenn das Diagramm keine Livequellenfilter enthält, verwenden Sie einen beliebigen Filter im Diagramm, der IReferenceClock-unterstützt, beginnend mit den Renderern und dem Arbeiten vorgelagert. Bevorzugen Sie verbundene Filter gegenüber nicht verbundenen Filtern. (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 Systemreferenzuhr, die auf der Systemzeit basiert.
Festlegen der Referenzuhr
Eine Anwendung kann eine Uhr auswählen, indem sie die IMediaFilter::SetSyncSource--Methode für den Filter Graph-Manager aufruft. Dies sollten Sie nur tun, wenn Sie einen bestimmten Grund haben, eine andere Uhr zu bevorzugen.
Sie können den Filter Graph-Manager anweisen, keine Referenzuhr zu verwenden, indem Sie SetSyncSource- mit dem Wert NULL-aufrufen. Beispielsweise können Sie dies tun, um Beispiele so schnell wie möglich zu verarbeiten. Rufen Sie zum Wiederherstellen der Standardreferenzuhr die IFilterGraph::SetDefaultSyncSource--Methode im Filter Graph Manager auf.
Wenn sich die Referenzuhr ändert, benachrichtigt der Filter Graph-Manager jeden Filter, indem er seine IMediaFilter::SetSyncSource--Methode aufruft. Anwendungen sollten diese Methode niemals für Filter aufrufen.
Verwandte Themen