删除图形中的所有筛选器

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

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

或者,可以使用 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 的任何后续调用都将失败。