关于捕获图形生成器

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 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 中的视频捕获