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


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

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