Удаление всех фильтров в графе
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]
Самый простой способ удалить все фильтры в графе фильтров — просто освободить диспетчер фильтров и создать новый. Обязательно отпустите все указатели, которые имеются в приложении на любые интерфейсы диспетчеров графов фильтров, а также указатели на объекты в графе, включая фильтры, контакты, эталонные часы и т. д.
Кроме того, можно удалить фильтры по одному с помощью метода 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 завершится ошибкой.