[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、IMFMediaEngine和媒體基金會中的 音訊/視訊擷取取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
[此 API 不受支持,未來可能會改變或無法使用。]
若要預覽專案,您需要一個稱為 轉譯引擎的元件,它會從時間軸建置 DirectShow 篩選圖形。 篩選圖表是實際呈現項目的內容。 您可以使用轉譯引擎來預覽專案,或撰寫最終輸出檔。
本文不會詳細說明轉譯引擎。 您只需要調用幾個方法即可進行預覽。 您可以在 轉譯專案中找到更全面的說明,包括如何寫入輸出檔案。 下列程式代碼範例示範如何建構預覽圖表。
IRenderEngine *pRender = NULL;
hr = CoCreateInstance(CLSID_RenderEngine, NULL, CLSCTX_INPROC_SERVER,
IID_IRenderEngine, (void**) &pRender);
hr = pRender->SetTimelineObject(pTL);
hr = pRender->ConnectFrontEnd( );
hr = pRender->RenderOutputPins( );
使用 CoCreateInstance 函式建立轉譯引擎。 然後在轉譯引擎的 IRenderEngine 介面上呼叫下列方法:
- SetTimelineObject。 指定要使用的時程表。
- ConnectFrontEnd。 建置一個部分篩選圖形,並在時間軸中的每個群組建立一個輸出接腳。
- RenderOutputPins。 將每個輸出端子連接到視訊或音訊渲染器,以完成預覽圖形。
建置圖形之後,您可以執行圖形來預覽專案,就像使用任何 DirectShow 篩選圖表一樣。 首先,呼叫 IRenderEngine::GetFilterGraph 方法,以取得篩選圖形的指標。
IGraphBuilder *pGraph = NULL;
hr = pRender->GetFilterGraph(&pGraph);
查詢 IMediaControl 和 IMediaEvent 介面的篩選圖表。 使用這兩個介面來執行圖形,並等候播放完成。 如需如何使用這些介面的說明,請參閱 如何播放檔案 和 回應事件。 下列程式代碼示範使用這些介面的其中一種方式。
IMediaControl *pControl = NULL;
IMediaEvent *pEvent = NULL;
long evCode;
pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
hr = pControl->Run();
hr = pEvent->WaitForCompletion(INFINITE, &evCode);
pControl->Stop();
此範例中的程式代碼會阻止程序執行,直到播放完成為止,因為在 IMediaEvent::WaitForCompletion 方法呼叫中使用了 INFINITE 參數。 不過,如果播放期間發生問題,可能會導致程式停止回應。 在實際的應用程式中,使用訊息迴圈等候播放完成。 也建議您為使用者提供中斷播放的方式。
當您完成使用轉譯引擎時,請一律呼叫 IRenderEngine::ScrapIt 方法。 此方法會刪除篩選圖表,並釋放轉譯引擎所持有的任何資源。
pRender->ScrapIt();
相關主題