Freigeben über


Verbinden von zwei Filtern

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

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

Um zwei Filter zu verbinden, müssen Sie einen nicht verbundenen Ausgabestift im Upstreamfilter und einen nicht verbundenen Eingabenadel für den nachgeschalteten Filter finden.

Wenn Sie bereits Zeiger auf beide Pins haben, rufen Sie die IGraphBuilder::Connect-Methode auf, um sie zu verbinden. Wenn die Pins keine direkte Verbindung miteinander herstellen 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 über einen Zeiger auf die Filter, aber nicht über die Pins verfügen, 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.

Ausgabeheften zum Filtern

Die folgende Funktion verwendet zwei Parameter: Einen Zeiger auf einen Ausgabestift und einen Zeiger auf einen Filter. Die Funktion verbindet den Ausgabehefter mit dem ersten verfügbaren Eingabenadel auf dem 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 folgende Aktionen aus:

  1. Ruft die FindUnconnectedPin-Funktion auf, um einen nicht verbundenen Eingabenadel abzurufen. Diese Funktion wird im Thema Suchen einer nicht verbundenen Pin auf einem Filter-gezeigt.
  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 Eingabenadel mit dem ersten verfügbaren Ausgabestift 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;
}

Filter zum Filtern

Die dritte Funktion verwendet einen Zeiger auf einen Upstreamfilter und einen Zeiger auf einen nachgeschalteten Filter 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