Verbinden Zwei Filter

In diesem Thema werden einige Hilfsfunktionen zum Verbinden von DirectShow-Filtern gezeigt.

Um zwei Filter zu verbinden, müssen Sie einen nicht verbundenen Ausgabepin im Upstreamfilter und einen nicht verbundenen Eingabepin für den Downstreamfilter finden.

Wenn Sie bereits Zeiger auf beide Stecknadeln haben, rufen Sie die IGraphBuilder::Verbinden-Methode auf, um sie zu verbinden. Wenn die Pins nicht direkt miteinander verbunden werden können, fügt die IGraphBuilder::Verbinden-Methode möglicherweise zusätzliche Filter ein, um die Verbindung herzustellen. Weitere Informationen finden Sie unter Intelligent Verbinden.

Wenn Sie einen Zeiger auf die Filter, aber nicht die Stecknadeln haben, müssen Sie die IBaseFilter::EnumPins-Methode verwenden, um die Stecknadeln zu finden. (Siehe Enumerating Pins.) Die Hilfsfunktionen in diesem Thema veranschaulichen diese Technik.

An Filter anheften der Ausgabe

Die folgende Funktion verwendet zwei Parameter: einen Zeiger auf einen Ausgabepin und einen Zeiger auf einen Filter. Die Funktion verbindet den Ausgabepin mit dem ersten verfügbaren Eingabepin im Filter.

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

Diese Funktion führt Folgendes aus:

  1. Ruft die FindUnconnectedPin Funktion auf, um einen nicht verbundenen Eingabepin zu erhalten. Diese Funktion wird im Thema Suchen einer nicht verbundenen Stecknadel in einem Filter gezeigt.
  2. Ruft IGraphBuilder::Verbinden auf, um die beiden Stecknadeln zu verbinden.

Filtern nach Eingabepin

Die nächste Funktion verwendet einen Zeiger auf einen Filter und einen Zeiger auf einen Eingabepin. Er verbindet den Eingabepin mit dem ersten verfügbaren Ausgabepin im Filter.

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

Filtern nach Filter

Die dritte Funktion verwendet einen Zeiger auf einen Upstreamfilter und einen Zeiger auf einen Downstreamfilter und versucht, beide Filter zu verbinden.

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

Allgemeine Graph-Building Techniken

ICaptureGraphBuilder2::RenderStream