建置 VMR-9 篩選圖形
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]
因為影片混合轉譯器 9 篩選 (VMR-9) 不是預設的視訊轉譯器,所以使用 VMR-9 的應用程式必須明確地將它新增至圖形並加以連線。 本節說明使用 VMR-9 建置篩選圖形的兩種不同的方法。
使用擷取圖形產生器
擷取圖形產生器是用來建置自訂篩選圖形的協助程式物件。 您可以使用它來建置 VMR-9 圖表,如下所示:
建立和初始化擷取圖形產生器,如 關於擷取圖形產生器主題中所述。
呼叫 CoCreateInstance 以建立 VMR-9:
IBaseFilter *pVmr = NULL; hr = CoCreateInstance(CLSID_VideoMixingRenderer9, 0, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pVmr);
在篩選圖形管理員上呼叫 IFilterGraph::AddFilter ,將 VMR-9 新增至篩選圖形:
hr = pGraph->AddFilter(pVmr, L"VMR9");
呼叫 IGraphBuilder::AddSourceFilter 以新增視訊檔案的來源篩選:
IBaseFilter *pSource; hr = pGraph->AddSourceFilter(L"C:\\Example.avi", L"Source1", &pSource);
呼叫 ICaptureGraphBuilder2::RenderStream 方法,將視訊串流轉譯至 VMR:
hr = pBuild->RenderStream(0, 0, pSource, 0, pVmr);
或者,再次呼叫 RenderStream 來轉譯音訊資料流程:
hr = pBuild->RenderStream(0, &MEDIATYPE_Audio, pSource, 0, NULL);
您可以為每個來源檔案呼叫 AddSourceFilter 和 RenderStream,以混合數個視訊串流。
使用 Filter Graph 管理員
如果您不想使用擷取圖形產生器,您可以直接在篩選圖形管理員上使用方法建置 VMR-9 圖形,如下所示:
- 建立 VMR-9 並將其新增至圖形,如上一個程式所示。
- 使用 AddSourceFilter 新增視訊檔案的來源篩選,如上一個程式所示。
- 如果您想要轉譯音訊,請建立 DirectSound 轉譯器 篩選的實例,並將它新增至篩選圖形。
- 使用 IBaseFilter::EnumPins 方法,在來源篩選上尋找輸出釘選。 如需詳細資訊 ,請參閱列舉釘選 。
- 查詢 IFilterGraph2 介面的 Filter Graph 管理員。
- 使用 AM_RENDEREX_RENDERTOEXISTINGRENDERERS 旗標呼叫 IFilterGraph2::RenderEx 。 此呼叫只會使用圖形中已有的轉譯器篩選來轉譯輸出釘選,在此案例中為 VMR-9 和 DirectSound 轉譯器。 這可防止 Intelligent Connect 邏輯將預設視訊轉譯器新增至圖形,這會讓 VMR-9 保持未連線。
相關主題