Udostępnij przez


Łączenie dwóch filtrów

[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

W tym temacie przedstawiono niektóre funkcje pomocnicze służące do łączenia filtrów DirectShow.

Aby połączyć dwa filtry, należy znaleźć niepodłączone wyprowadzenie wyjściowe w filtrze nadrzędnym i niepodłączone wyprowadzenie wejściowe w filtrze podrzędnym.

Jeśli masz już wskaźniki do obu wyprowadzeń, wywołaj metodę IGraphBuilder::Connect, aby je połączyć. Jeśli pinezki nie mogą łączyć się bezpośrednio ze sobą, IGraphBuilder::Connect metoda może wstawić dodatkowe filtry, aby zakończyć połączenie. Aby uzyskać więcej informacji, zobacz Intelligent Connect.

Jeśli masz wskaźnik do filtrów, ale nie pinezki, musisz użyć metody IBaseFilter::EnumPins, aby znaleźć pinezki. (Zobacz Wyliczanie pinezek.) Funkcje pomocnicze w tym temacie przedstawiają tę technikę.

Wyprowadzenie wyjściowe do filtru

Poniższa funkcja przyjmuje dwa parametry: wskaźnik do wyprowadzenia wyjściowego i wskaźnik do filtru. Funkcja łączy wyprowadzenie wyjściowe z pierwszym dostępnym numerem PIN w filtrze.

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

Ta funkcja wykonuje następujące czynności:

  1. Wywołuje funkcję FindUnconnectedPin, aby uzyskać niezwiązany numer PIN wejściowy. Ta funkcja jest wyświetlana w temacie Find an Unconnected Pin on a Filter.
  2. Wywołuje metodę IGraphBuilder::Connect w celu połączenia dwóch wyprowadzeń.

Filtruj do numeru PIN wejściowego

Następna funkcja pobiera wskaźnik do filtru i wskaźnik do numeru PIN wejściowego. Łączy on numer PIN wejściowy z pierwszym dostępnym numerem PIN wyjściowym filtru.

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

Filtruj do filtru

Trzecia funkcja pobiera wskaźnik do filtru nadrzędnego i wskaźnika do filtru podrzędnego i próbuje połączyć oba filtry.

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

Ogólne techniki Graph-Building

ICaptureGraphBuilder2::RenderStream