設定圖形時鐘
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 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,將篩選圖形設定為不使用時鐘來執行。 如果沒有時鐘,圖形會儘快執行。 沒有時鐘,轉譯器篩選準則不會等候樣本的呈現時間。 相反地,它們會在每個樣本送達時立即轉譯。 如果您想要快速處理資料,而不是即時預覽,請將圖表設定為在沒有時鐘的情況下執行會很有用。
相關主題