Quitar todos los filtros del grafo
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
La manera más fácil de quitar todos los filtros de un grafo de filtro es simplemente liberar el Administrador de gráficos de filtros y crear uno nuevo. Asegúrese de liberar todos los punteros que la aplicación tenga en las interfaces de los administradores de gráficos de filtros, así como punteros a objetos del gráfico, incluidos filtros, patillas, el reloj de referencia, etc.
Como alternativa, puede quitar los filtros de uno en uno mediante el 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();
}
En este ejemplo se usa el método IFilterGraph::EnumFilters para enumerar los filtros del gráfico. Al quitar un filtro, el objeto del enumerador se desincronice con el gráfico. Use el método IEnumFilters::Reset para restablecer el enumerador. De lo contrario, se producirá un error en cualquier llamada posterior a IEnumFilters::Next .