添加按 CLSID 筛选
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 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 捕获驱动程序的包装器。 必须使用 系统设备枚举器 或 筛选器映射器创建这些筛选器。 有关详细信息,请参阅 枚举设备和筛选器。
相关主题