設定圖形時鐘
[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、IMFMediaEngine和媒體基礎結構中的 音訊/視訊擷取所取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 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,將篩選圖形設定為不使用時鐘來執行。 如果沒有時鐘,圖表會盡快運行。 沒有時鐘,轉譯器篩選不會等候範例的呈現時間。 相反地,系統會在樣本接收到時立即呈現每個範例。 如果您想要快速處理數據,而不是即時預覽數據,請將圖表設定為不使用時鐘執行會很有用。
相關主題