连接两个筛选器

[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayerIMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获,而不是 DirectShow。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]

本主题介绍用于连接 DirectShow 筛选器的一些帮助程序函数。

若要连接两个筛选器,必须在上游筛选器上找到未连接的输出引脚,并在下游筛选器上找到未连接的输入引脚。

如果已有指向两个引脚的指针,请调用 IGraphBuilder::Connect 方法进行连接。 如果引脚无法直接连接到对方,IGraphBuilder::Connect 方法可能会插入其他筛选器以完成连接。 有关详细信息,请参阅 Intelligent Connect

如果有指向筛选器的指针,但不能指向引脚,则必须使用 IBaseFilter::EnumPins 方法来查找引脚。 (请参阅 枚举引脚。)本主题中的帮助程序函数演示了此方法。

输出固定到筛选器

以下函数采用两个参数:指向输出引脚的指针,以及指向筛选器的指针。 该函数将输出引脚连接到筛选器上的第一个可用输入引脚。

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