次の方法で共有


2 つのフィルターを接続する

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

このトピックでは、DirectShow フィルターを接続するためのヘルパー関数をいくつか示します。

2 つのフィルターを接続するには、アップストリーム フィルターに接続されていない出力ピンと、ダウンストリーム フィルターに接続されていない入力ピンが見つかる必要があります。

両方のピンへのポインターが既にある場合は、 IGraphBuilder::Connect メソッドを呼び出して接続します。 ピンが直接接続できない場合、 IGraphBuilder::Connect メソッドによって追加のフィルターが挿入され、接続が完了する可能性があります。 詳細については、「 インテリジェント接続」を参照してください。

ピンではなくフィルターへのポインターがある場合は、 IBaseFilter::EnumPins メソッドを使用してピンを検索する必要があります。 (「 ピンの列挙」を参照)。このトピックのヘルパー関数は、この手法を示しています。

フィルターにピン留めする出力

次の関数は、出力ピンへのポインターとフィルターへのポインターの 2 つのパラメーターを受け取ります。 関数は、出力ピンをフィルターの最初の使用可能な入力ピンに接続します。

// 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 を呼び出して、2 つのピンを接続します。

入力ピンへのフィルター処理

次の関数は、フィルターへのポインターと入力ピンへのポインターを受け取ります。 入力ピンをフィルタの最初の使用可能な出力ピンに接続します。

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

フィルター処理

3 番目の関数は、アップストリーム フィルターへのポインターとダウンストリーム フィルターへのポインターを受け取り、両方のフィルターの接続を試みます。

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