删除图形中的所有筛选器

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

删除筛选器图中所有筛选器的最简单方法是释放 Filter Graph 管理器并创建一个新筛选器。 请确保将应用程序具有的每个指针释放到 Filter Graph Manager 上任何接口,以及指向图中对象的指针,包括筛选器、引脚、引用时钟等。

或者,可以使用 IFilterGraph::RemoveFilter 方法一次删除一个筛选器:

// Stop the graph.
pControl->Stop();

// Enumerate the filters in the graph.
IEnumFilters *pEnum = NULL;
HRESULT hr = pGraph->EnumFilters(&pEnum);
if (SUCCEEDED(hr))
{
    IBaseFilter *pFilter = NULL;
    while (S_OK == pEnum->Next(1, &pFilter, NULL))
     {
         // Remove the filter.
         pGraph->RemoveFilter(pFilter);
         // Reset the enumerator.
         pEnum->Reset();
         pFilter->Release();
    }
    pEnum->Release();
}

此示例使用 IFilterGraph::EnumFilters 方法枚举图形中的筛选器。 删除筛选器会导致枚举器对象与图形不同步。 使用 IEnumFilters::Reset 方法重置枚举器。 否则,对 IEnumFilters::Next 的任何后续调用都将失败。