共用方式為


設定圖形時鐘

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngine和媒體基礎結構中的 音訊/視訊擷取所取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

當您建置篩選圖形時,篩選圖形管理員會自動選擇圖形的參考時鐘。 圖表中的所有篩選器皆已同步至參考時鐘。 特別是,轉譯器篩選會使用參考時鐘來判斷每個樣本的呈現時間。

應用程式通常沒有理由覆蓋 Filter Graph Manager 的參考時鐘選擇。 不過,您可以在 Filter Graph Manager 上呼叫 IMediaFilter::SetSyncSource 方法來執行此動作。 此方法會採用時鐘 IReferenceClock 介面的指標。 在圖形停止時呼叫 方法。

如果篩選條件提供時鐘,您可以在篩選上呼叫 QueryInterface,以取得 IReferenceClock 指標。 或者,您可以實作一個不由濾波器提供的外部參考時鐘,只要您的外部時鐘實作了 IReferenceClock。 下列範例示範如何指定時鐘:

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();
}

此範例假設 CreateMyPrivateClock 是應用程式定義的函式,可建立時鐘並傳回 IReferenceClock 指標。

您也可以藉由呼叫 SetSyncSource 並將其值設為 NULL,將篩選圖形設定為不使用時鐘來執行。 如果沒有時鐘,圖表會盡快運行。 沒有時鐘,轉譯器篩選不會等候範例的呈現時間。 相反地,系統會在樣本接收到時立即呈現每個範例。 如果您想要快速處理數據,而不是即時預覽數據,請將圖表設定為不使用時鐘執行會很有用。

基本 DirectShow 任務

CBaseReferenceClock 類別

DirectShow 中的時間和時鐘