共用方式為


連接兩個篩選

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

本主題說明連線 DirectShow 篩選的一些協助程式函式。

若要連接兩個篩選準則,您必須在上游篩選上找到未連接的輸出針腳,以及下游篩選準則上的未連接輸入針腳。

如果您已經有兩個針腳的指標,請呼叫 IGraphBuilder::Connect 方法來連接它們。 如果針腳無法直接連線到彼此, IGraphBuilder::Connect 方法可能會插入其他篩選,以完成連線。 如需詳細資訊,請參閱 Intelligent Connect

如果您有篩選準則的指標,但不是針腳,則必須使用 IBaseFilter::EnumPins 方法來尋找釘選。 (請參閱 列舉 Pins.) 本主題中的協助程式函式示範這項技術。

輸出釘選到篩選

下列函式會採用兩個參數:輸出釘選的指標,以及篩選準則的指標。 函式會將輸出釘選連接到篩選上第一個可用的輸入針腳。

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

此函式會執行下列動作:

  1. 呼叫 函 FindUnconnectedPin 式以取得未連接的輸入針腳。 本主題顯示此函式: 在篩選上尋找未連線的釘選
  2. 呼叫 IGraphBuilder::Connect 以連接兩個針腳。

篩選為輸入釘選

下一個函式會採用篩選的指標,以及輸入針腳的指標。 它會將輸入釘選連接到篩選上第一個可用的輸出針腳。

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

篩選至篩選

第三個函式會採用上游篩選的指標和下游篩選的指標,並嘗試連接這兩個篩選準則。

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

一般Graph-Building技術

ICaptureGraphBuilder2::RenderStream