Compartir a través de


Conectar dos filtros

[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.

En este tema se muestran algunas funciones auxiliares para conectar filtros directShow.

Para conectar dos filtros, debe encontrar un pin de salida no conectado en el filtro ascendente y un pin de entrada no conectado en el filtro de bajada.

Si ya tiene punteros a ambos pines, llame al método IGraphBuilder::Connect para conectarlos. Si los pines no se pueden conectar directamente entre sí, el método IGraphBuilder::Connect podría insertar filtros adicionales para completar la conexión. Para obtener más información, consulte Intelligent Connect.

Si tiene un puntero a los filtros pero no a los pines, debe usar el método IBaseFilter::EnumPins para buscar los patillas. (Vea Enumerar patillas). Las funciones auxiliares de este tema muestran esta técnica.

Anclar de salida al filtro

La siguiente función toma dos parámetros: un puntero a un pin de salida y un puntero a un filtro. La función conecta el pin de salida al primer pin de entrada disponible en el filtro.

// Connect output pin to filter.

HRESULT ConnectFilters(
    IGraphBuilder *pGraph, // Filter Graph Manager.
    IPin *pOut,            // Output pin on the upstream filter.
    IBaseFilter *pDest)    // Downstream filter.
{
    IPin *pIn = NULL;
        
    // Find an input pin on the downstream filter.
    HRESULT hr = FindUnconnectedPin(pDest, PINDIR_INPUT, &pIn);
    if (SUCCEEDED(hr))
    {
        // Try to connect them.
        hr = pGraph->Connect(pOut, pIn);
        pIn->Release();
    }
    return hr;
}

Esta función hace lo siguiente:

  1. Llama a la FindUnconnectedPin función para obtener un pin de entrada no conectado. Esta función se muestra en el tema Buscar un pin no conectado en un filtro.
  2. Llama a IGraphBuilder::Connect para conectar los dos pines.

Filtrar por pin de entrada

La siguiente función toma un puntero a un filtro y un puntero a un pin de entrada. Conecta el pin de entrada al primer pin de salida disponible en el filtro.

// Connect filter to input pin.

HRESULT ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pSrc, IPin *pIn)
{
    IPin *pOut = NULL;
        
    // Find an output pin on the upstream filter.
    HRESULT hr = FindUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
    if (SUCCEEDED(hr))
    {
        // Try to connect them.
        hr = pGraph->Connect(pOut, pIn);
        pOut->Release();
    }
    return hr;
}

Filtrar por filtro

La tercera función toma un puntero a un filtro ascendente y un puntero a un filtro de bajada e intenta conectar ambos filtros.

// Connect filter to filter

HRESULT ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pSrc, IBaseFilter *pDest)
{
    IPin *pOut = NULL;

    // Find an output pin on the first filter.
    HRESULT hr = FindUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
    if (SUCCEEDED(hr))
    {
        hr = ConnectFilters(pGraph, pOut, pDest);
        pOut->Release();
    }
    return hr;
}

Técnicas generales de Graph-Building

ICaptureGraphBuilder2::RenderStream