共用方式為


關於擷取圖形產生器

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

執行視訊或音訊擷取的篩選圖表稱為擷 取圖形。 擷取圖形通常比檔案播放圖表更複雜。 為了方便應用程式建置擷取圖形,DirectShow 提供稱為 Capture Graph Builder 的協助程式物件。 擷取圖形產生器會公開 ICaptureGraphBuilder2 介面,其中包含建置和控制擷取圖形的方法。 下圖說明 Capture Graph Builder 和 ICaptureGraphBuilder2 介面。

使用擷取圖形產生器

首先,呼叫 CoCreateInstance 以建立擷取圖形產生器和篩選圖形管理員的新實例。 然後呼叫 ICaptureGraphBuilder2::SetFiltergraph ,並使用篩選圖形管理員 IGraphBuilder 介面的指標來初始化擷取圖形產生器。 下圖說明此程序。

初始化擷取圖形產生器

下列程式碼顯示協助程式函式來執行下列步驟:

HRESULT InitCaptureGraphBuilder(
  IGraphBuilder **ppGraph,  // Receives the pointer.
  ICaptureGraphBuilder2 **ppBuild  // Receives the pointer.
)
{
    if (!ppGraph || !ppBuild)
    {
        return E_POINTER;
    }
    IGraphBuilder *pGraph = NULL;
    ICaptureGraphBuilder2 *pBuild = NULL;

    // Create the Capture Graph Builder.
    HRESULT hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, 
        CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild );
    if (SUCCEEDED(hr))
    {
        // Create the Filter Graph Manager.
        hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER,
            IID_IGraphBuilder, (void**)&pGraph);
        if (SUCCEEDED(hr))
        {
            // Initialize the Capture Graph Builder.
            pBuild->SetFiltergraph(pGraph);

            // Return both interface pointers to the caller.
            *ppBuild = pBuild;
            *ppGraph = pGraph; // The caller must release both interfaces.
            return S_OK;
        }
        else
        {
            pBuild->Release();
        }
    }
    return hr; // Failed
}

在影片擷取的本節中,假設您使用擷取圖形產生器來建立擷取圖形。 不過,您可以使用 IGraphBuilder 方法來完全建置擷取圖形。 不過,這被視為進階主題,而擷取圖形產生器方法則優先使用。 如需詳細資訊,請參閱 進階擷取主題

關於 DirectShow 中的影片擷取