Verbinden von zwei Filtern

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

In diesem Thema werden einige Hilfsfunktionen zum Verbinden von DirectShow-Filtern erläutert.

Um zwei Filter zu verbinden, müssen Sie einen nicht verbundenen Ausgabepin auf dem Upstream-Filter und einen nicht verbundenen Eingabestift im downstream-Filter finden.

Wenn Sie bereits über Zeiger auf beide Pins verfügen, rufen Sie die IGraphBuilder::Connect-Methode auf, um sie zu verbinden. Wenn die Pins nicht direkt miteinander verbunden werden können, fügt die IGraphBuilder::Connect-Methode möglicherweise zusätzliche Filter ein, um die Verbindung abzuschließen. Weitere Informationen finden Sie unter Intelligent Connect.

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

Ausgabe an Filter anheften

Die folgende Funktion akzeptiert zwei Parameter: Einen Zeiger auf einen Ausgabenadel und einen Zeiger auf einen Filter. Die Funktion verbindet den Ausgabepin mit dem ersten verfügbaren Eingabestift 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 Eingabenadel abzurufen. Diese Funktion wird im Thema Suchen einer nicht verbundenen Pin in einem Filter angezeigt.
  2. Ruft IGraphBuilder::Connect auf, um die beiden Pins zu verbinden.

An Eingabenadel filtern

Die nächste Funktion verwendet einen Zeiger auf einen Filter und einen Zeiger auf einen Eingabenadel. Er verbindet den Eingabestift mit dem ersten verfügbaren Ausgabepin auf dem 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 Upstream Filter 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