共用方式為


關於擷取圖形產生器

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

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

使用擷取圖形產生器

首先,呼叫 CoCreateInstance 來建立擷取圖形產生器和 Filter Graph 管理員的新實例。 然後,透過呼叫 Filter Graph Manager 的 IGraphBuilder 介面的指標,使用 ICaptureGraphBuilder2::SetFiltergraph 來初始化擷取圖形生成器。 下圖說明此程式。

初始化擷取圖形產生器

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

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 的影片擷取