添加按 CLSID 筛选

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

以下函数 (CLSID) 创建具有指定类标识符的筛选器,并将其添加到筛选图中:

// Create a filter by CLSID and add it to the graph.

HRESULT AddFilterByCLSID(
    IGraphBuilder *pGraph,      // Pointer to the Filter Graph Manager.
    REFGUID clsid,              // CLSID of the filter to create.
    IBaseFilter **ppF,          // Receives a pointer to the filter.
    LPCWSTR wszName             // A name for the filter (can be NULL).
    )
{
    *ppF = 0;

    IBaseFilter *pFilter = NULL;
    
    HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, 
        IID_PPV_ARGS(&pFilter));
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pGraph->AddFilter(pFilter, wszName);
    if (FAILED(hr))
    {
        goto done;
    }

    *ppF = pFilter;
    (*ppF)->AddRef();

done:
    SafeRelease(&pFilter);
    return hr;
}

注意

此示例使用 SafeRelease 函数释放 IBaseFilter 指针。

 

该函数调用 CoCreateInstance 来创建筛选器,然后调用 IFilterGraph::AddFilter 将筛选器添加到图中。 下面的代码示例使用此函数将 AVI 复用器 筛选器添加到图中:

IBaseFilter *pMux;
hr = AddFilterByCLSID(pGraph, CLSID_AviDest, L"AVI Mux", &pMux, NULL); 
if (SUCCEEDED(hr))
{
    /* ... */
   pMux->Release();
}

请注意,无法使用 CoCreateInstance 创建某些筛选器。 管理其他软件组件的筛选器通常就是这种情况。 例如, AVI 压缩器 筛选器是视频编解码器的包装器, 而 WDM 视频捕获 筛选器是 WDM 捕获驱动程序的包装器。 必须使用 系统设备枚举器筛选器映射器创建这些筛选器。 有关详细信息,请参阅 枚举设备和筛选器

常规Graph-Building技术