Remover todos os filtros no grafo
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]
A maneira mais fácil de remover todos os filtros em um grafo de filtro é simplesmente liberar o Gerenciador de Grafo de Filtros e criar um novo. Certifique-se de liberar todos os ponteiros que seu aplicativo tem para quaisquer interfaces nos Gerenciadores de Grafo de Filtro, bem como ponteiros para objetos no grafo, incluindo filtros, pinos, o relógio de referência e assim por diante.
Como alternativa, você pode remover os filtros um de cada vez, usando o método 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();
}
Este exemplo usa o método IFilterGraph::EnumFilters para enumerar os filtros no grafo. Remover um filtro faz com que o objeto enumerador fique fora de sincronia com o grafo. Use o método IEnumFilters::Reset para redefinir o enumerador. Caso contrário, qualquer chamada subsequente para IEnumFilters::Next falhará.