設定圖形時鐘

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

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

通常沒有任何理由讓應用程式覆寫 Filter Graph Manager 的參考時鐘選擇。 不過,您可以在 Filter Graph 管理員上呼叫 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 指標。

您也可以使用Null值呼叫SetSyncSource,將篩選圖形設定為不使用時鐘來執行。 如果沒有時鐘,圖形會儘快執行。 沒有時鐘,轉譯器篩選準則不會等候樣本的呈現時間。 相反地,它們會在每個樣本送達時立即轉譯。 如果您想要快速處理資料,而不是即時預覽,請將圖表設定為在沒有時鐘的情況下執行會很有用。

基本 DirectShow 工作

CBaseReferenceClock 類別

DirectShow 中的時間和時鐘