Festlegen der Graphuhr

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

Wenn Sie ein Filterdiagramm erstellen, wählt der Filter Graph-Manager automatisch eine Referenzuhr für das Diagramm aus. Alle Filter im Diagramm werden mit der Referenzuhr synchronisiert. Insbesondere verwenden Rendererfilter die Referenzuhr, um die Präsentationszeit jedes Beispiels zu bestimmen.

Es gibt in der Regel keinen Grund, dass eine Anwendung die Vom Filter Graph Manager gewählte Referenzuhr außer Kraft setzt. Sie können dies jedoch tun, indem Sie die IMediaFilter::SetSyncSource-Methode im Filter Graph-Manager aufrufen. Diese Methode verwendet einen Zeiger auf die IReferenceClock-Schnittstelle der Uhr. Rufen Sie die -Methode auf, während das Diagramm beendet wird.

Wenn ein Filter eine Uhr bereitstellt, können Sie den IReferenceClock-Zeiger abrufen, indem Sie QueryInterface für den Filter aufrufen. Alternativ können Sie eine externe Referenzuhr implementieren, die nicht von einem Filter bereitgestellt wird, solange Ihre externe Uhr IReferenceClock implementiert. Das folgende Beispiel zeigt, wie eine Uhr angegeben wird:

IGraphBuilder *pGraph = 0;
IReferenceClock *pClock = 0;

CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
    IID_IGraphBuilder, (void **)&pGraph);

// Build the graph.
pGraph->RenderFile(L"C:\\Example.avi", 0);

// Create your clock.
hr = CreateMyPrivateClock(&pClock);
if (SUCCEEDED(hr))
{
    // Set the graph clock.
    IMediaFilter *pMediaFilter = 0;
    pGraph->QueryInterface(IID_IMediaFilter, (void**)&pMediaFilter);
    pMediaFilter->SetSyncSource(pClock);
    pClock->Release();
    pMediaFilter->Release();
}

In diesem Beispiel wird davon ausgegangen, dass CreateMyPrivateClock eine anwendungsdefinierte Funktion ist, die eine Uhr erstellt und einen IReferenceClock-Zeiger zurückgibt.

Sie können auch festlegen, dass das Filterdiagramm ohne Uhr ausgeführt wird, indem Sie SetSyncSource mit dem Wert NULL aufrufen. Wenn keine Uhr vorhanden ist, wird das Diagramm so schnell wie möglich ausgeführt. Ohne Uhr warten Rendererfilter nicht auf die Präsentationszeit eines Beispiels. Stattdessen rendern sie jedes Beispiel, sobald es eintrifft. Das Festlegen des Graphen für die Ausführung ohne Uhr ist nützlich, wenn Sie Daten schnell verarbeiten möchten, anstatt eine Vorschau in Echtzeit anzuzeigen.

Grundlegende DirectShow-Aufgaben

CBaseReferenceClock-Klasse

Zeit und Uhren in DirectShow