Compartir a través de


Agregar un filtro por CLSID

[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 siguiente función crea un filtro con un identificador de clase especificado (CLSID) y lo agrega al gráfico de filtros:

// Create a filter by CLSID and add it to the graph.

HRESULT AddFilterByCLSID(
    IGraphBuilder *pGraph,      // Pointer to the Filter Graph Manager.
    REFGUID clsid,              // CLSID of the filter to create.
    IBaseFilter **ppF,          // Receives a pointer to the filter.
    LPCWSTR wszName             // A name for the filter (can be NULL).
    )
{
    *ppF = 0;

    IBaseFilter *pFilter = NULL;
    
    HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, 
        IID_PPV_ARGS(&pFilter));
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pGraph->AddFilter(pFilter, wszName);
    if (FAILED(hr))
    {
        goto done;
    }

    *ppF = pFilter;
    (*ppF)->AddRef();

done:
    SafeRelease(&pFilter);
    return hr;
}

Nota:

En este ejemplo se usa la función SafeRelease para liberar el puntero IBaseFilter .

 

La función llama a CoCreateInstance para crear el filtro y, a continuación, llama a IFilterGraph::AddFilter para agregar el filtro al grafo. En el ejemplo de código siguiente se usa esta función para agregar el filtro Mux avi al grafo:

IBaseFilter *pMux;
hr = AddFilterByCLSID(pGraph, CLSID_AviDest, L"AVI Mux", &pMux, NULL); 
if (SUCCEEDED(hr))
{
    /* ... */
   pMux->Release();
}

Tenga en cuenta que algunos filtros no se pueden crear con CoCreateInstance. Esto suele ocurrir con filtros que administran otros componentes de software. Por ejemplo, el filtro AVI Compressor es un contenedor para códecs de vídeo y el filtro captura de vídeo WDM es un contenedor para controladores de captura WDM. Estos filtros se deben crear mediante el enumerador de dispositivos del sistema o el asignador de filtros. Para obtener más información, vea Enumerar dispositivos y filtros.

Técnicas generales de Graph-Building