Поделиться через


Удаление всех фильтров в графе

[Функция, связанная с этой страницей, 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 завершится ошибкой.