删除图形中的所有筛选器
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 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 的任何后续调用都将失败。