枚举引脚

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

筛选器支持 IBaseFilter::EnumPins 方法,该方法枚举筛选器上可用的引脚。 它返回指向 IEnumPins 接口的 指针。 IEnumPins::Next 方法检索 IPin 接口指针。

以下示例演示了一个函数,该函数在给定筛选器上查找具有给定方向的引脚 (输入或输出) 。 它使用 PIN_DIRECTION 枚举来指定固定方向,并使用 IPin::QueryDirection 方法查找每个枚举引脚的方向。 如果此函数找到匹配的引脚,它将返回具有未完成引用计数的 IPin 接口指针。 调用方负责释放接口。

HRESULT GetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **ppPin)
{
    IEnumPins  *pEnum = NULL;
    IPin       *pPin = NULL;
    HRESULT    hr;

    if (ppPin == NULL)
    {
        return E_POINTER;
    }

    hr = pFilter->EnumPins(&pEnum);
    if (FAILED(hr))
    {
        return hr;
    }
    while(pEnum->Next(1, &pPin, 0) == S_OK)
    {
        PIN_DIRECTION PinDirThis;
        hr = pPin->QueryDirection(&PinDirThis);
        if (FAILED(hr))
        {
            pPin->Release();
            pEnum->Release();
            return hr;
        }
        if (PinDir == PinDirThis)
        {
            // Found a match. Return the IPin pointer to the caller.
            *ppPin = pPin;
            pEnum->Release();
            return S_OK;
        }
        // Release the pin for the next time through the loop.
        pPin->Release();
    }
    // No more pins. We did not find a match.
    pEnum->Release();
    return E_FAIL;  
}

可以轻松修改此函数,以返回具有指定方向的第 n 个引脚或 n个未连接的引脚。 (若要查明某个引脚是否已连接到另一个引脚,请调用 IPin::ConnectedTo 方法。)

枚举筛选器图中的对象

在筛选器上查找未连接的固定

常规Graph-Building技术

固定属性集