Conectar dois filtros

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

Este tópico mostra algumas funções auxiliares para conectar filtros do DirectShow.

Para conectar dois filtros, você deve encontrar um pino de saída não conectado no filtro upstream e um pino de entrada não conectado no filtro downstream.

Se você já tiver ponteiros para ambos os pinos, chame o método IGraphBuilder::Connect para conectá-los. Se os pinos não puderem se conectar diretamente uns aos outros, o método IGraphBuilder::Connect poderá inserir filtros adicionais para concluir a conexão. Para obter mais informações, consulte Conexão inteligente.

Se você tiver um ponteiro para os filtros, mas não os pinos, deverá usar o método IBaseFilter::EnumPins para localizar os pinos. (Consulte Enumerando pinos.) As funções auxiliares neste tópico demonstram essa técnica.

Pino de saída para filtrar

A função a seguir usa dois parâmetros: um ponteiro para um pino de saída e um ponteiro para um filtro. A função conecta o pino de saída ao primeiro pino de entrada disponível no 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;
}

Essa função faz o seguinte:

  1. Chama a FindUnconnectedPin função para obter um pino de entrada não conectado. Essa função é mostrada no tópico Localizar um Pino Não Conectado em um Filtro.
  2. Chama IGraphBuilder::Connect para conectar os dois pinos.

Filtrar para o Pin de Entrada

A próxima função usa um ponteiro para um filtro e um ponteiro para um pino de entrada. Ele conecta o pino de entrada ao primeiro pino de saída disponível no 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 para Filtrar

A terceira função usa um ponteiro para um filtro upstream e um ponteiro para um filtro downstream e tenta conectar ambos os 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 gerais de Graph-Building

ICaptureGraphBuilder2::RenderStream