Share via


建置 VMR-9 篩選圖形

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

因為影片混合轉譯器 9 篩選 (VMR-9) 不是預設的視訊轉譯器,所以使用 VMR-9 的應用程式必須明確地將它新增至圖形並加以連線。 本節說明使用 VMR-9 建置篩選圖形的兩種不同的方法。

使用擷取圖形產生器

擷取圖形產生器是用來建置自訂篩選圖形的協助程式物件。 您可以使用它來建置 VMR-9 圖表,如下所示:

  1. 建立和初始化擷取圖形產生器,如 關於擷取圖形產生器主題中所述。

  2. 呼叫 CoCreateInstance 以建立 VMR-9:

    IBaseFilter *pVmr = NULL;
    hr = CoCreateInstance(CLSID_VideoMixingRenderer9, 0, 
        CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pVmr);
    
  3. 在篩選圖形管理員上呼叫 IFilterGraph::AddFilter ,將 VMR-9 新增至篩選圖形:

    hr = pGraph->AddFilter(pVmr, L"VMR9");
    
  4. 呼叫 IGraphBuilder::AddSourceFilter 以新增視訊檔案的來源篩選:

    IBaseFilter *pSource;
    hr = pGraph->AddSourceFilter(L"C:\\Example.avi", L"Source1", &pSource);
    
  5. 呼叫 ICaptureGraphBuilder2::RenderStream 方法,將視訊串流轉譯至 VMR:

    hr = pBuild->RenderStream(0, 0, pSource, 0, pVmr);  
    
  6. 或者,再次呼叫 RenderStream 來轉譯音訊資料流程:

    hr = pBuild->RenderStream(0, &MEDIATYPE_Audio, pSource, 0, NULL);
    

您可以為每個來源檔案呼叫 AddSourceFilter 和 RenderStream,以混合數個視訊串流。

使用 Filter Graph 管理員

如果您不想使用擷取圖形產生器,您可以直接在篩選圖形管理員上使用方法建置 VMR-9 圖形,如下所示:

  1. 建立 VMR-9 並將其新增至圖形,如上一個程式所示。
  2. 使用 AddSourceFilter 新增視訊檔案的來源篩選,如上一個程式所示。
  3. 如果您想要轉譯音訊,請建立 DirectSound 轉譯器 篩選的實例,並將它新增至篩選圖形。
  4. 使用 IBaseFilter::EnumPins 方法,在來源篩選上尋找輸出釘選。 如需詳細資訊 ,請參閱列舉釘選
  5. 查詢 IFilterGraph2 介面的 Filter Graph 管理員。
  6. 使用 AM_RENDEREX_RENDERTOEXISTINGRENDERERS 旗標呼叫 IFilterGraph2::RenderEx 。 此呼叫只會使用圖形中已有的轉譯器篩選來轉譯輸出釘選,在此案例中為 VMR-9 和 DirectSound 轉譯器。 這可防止 Intelligent Connect 邏輯將預設視訊轉譯器新增至圖形,這會讓 VMR-9 保持未連線。

使用擷取圖形產生器建置圖形