Share via


Connettere due filtri

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Questo argomento illustra alcune funzioni helper per la connessione dei filtri DirectShow.

Per connettere due filtri, è necessario trovare un pin di output non connesso nel filtro upstream e un pin di input non connesso nel filtro downstream.

Se sono già presenti puntatori a entrambi i pin, chiamare il metodo IGraphBuilder::Connect per connetterli. Se i pin non possono connettersi direttamente tra loro, il metodo IGraphBuilder::Connect potrebbe inserire filtri aggiuntivi per completare la connessione. Per altre informazioni, vedere Intelligent Connect.

Se si dispone di un puntatore ai filtri ma non ai pin, è necessario utilizzare il metodo IBaseFilter::EnumPins per trovare i pin. Vedere enumerazione dei pin. Le funzioni helper in questo argomento illustrano questa tecnica.

Pin di output al filtro

La funzione seguente accetta due parametri: un puntatore a un pin di output e un puntatore a un filtro. La funzione connette il pin di output al primo pin di input disponibile nel 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;
}

Questa funzione esegue le operazioni seguenti:

  1. Chiama la FindUnconnectedPin funzione per ottenere un pin di input non connesso. Questa funzione è illustrata nell'argomento Trovare un pin non connesso in un filtro.
  2. Chiama IGraphBuilder::Connect per connettere i due pin.

Filtro al pin di input

La funzione successiva accetta un puntatore a un filtro e un puntatore a un pin di input. Connette il pin di input al primo pin di output disponibile nel 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;
}

Filtra per filtrare

La terza funzione accetta un puntatore a un filtro upstream e un puntatore a un filtro downstream e tenta di connettere entrambi i filtri.

// 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;
}

Tecniche di Graph-Building generali

ICaptureGraphBuilder2::RenderStream