捕获筛选器的引脚要求

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

本主题介绍在 DirectShow 捕获筛选器上实现输出引脚的要求。

引脚名称

你可以为固定提供任何名称。 如果图钉名称以平铺 (~) 字符开头,则应用程序调用 IGraphBuilder::RenderFile 时,Filter Graph 管理器不会自动呈现该图钉。 例如,如果筛选器具有捕获固定和预览固定,则可以分别将它们命名为“~Capture”和“Preview”。 如果应用程序在图形中呈现该筛选器,则预览图钉将连接到其默认呈现器,并且不会连接到捕获引脚,这是一种合理的默认行为。 这也适用于提供不打算呈现的信息数据的图钉,或需要设置自定义属性的图钉。 请注意,带有波形符 (~) 前缀的固定仍可由应用程序手动连接。

固定类别

捕获筛选器始终具有捕获引脚,并且可能具有预览固定。 某些捕获筛选器可能具有其他输出引脚,用于传递其他类型的数据,例如控制信息。 每个输出引脚都必须公开 IKsPropertySet 接口。 应用程序使用此接口来确定引脚类别。 引脚通常返回PIN_CATEGORY_CAPTURE或PIN_CATEGORY_PREVIEW。 有关详细信息,请参阅 固定属性集

以下示例演示如何实现 IKsPropertySet 以返回捕获引脚上的引脚类别:

// Set: Cannot set any properties.
HRESULT CMyCapturePin::Set(REFGUID guidPropSet, DWORD dwID,
    void *pInstanceData, DWORD cbInstanceData, void *pPropData, 
    DWORD cbPropData)
{
    return E_NOTIMPL;
}

// Get: Return the pin category (our only property). 
HRESULT CMyCapturePin::Get(
    REFGUID guidPropSet,   // Which property set.
    DWORD dwPropID,        // Which property in that set.
    void *pInstanceData,   // Instance data (ignore).
    DWORD cbInstanceData,  // Size of the instance data (ignore).
    void *pPropData,       // Buffer to receive the property data.
    DWORD cbPropData,      // Size of the buffer.
    DWORD *pcbReturned     // Return the size of the property.
)
{
    if (guidPropSet != AMPROPSETID_Pin) 
        return E_PROP_SET_UNSUPPORTED;
    if (dwPropID != AMPROPERTY_PIN_CATEGORY)
        return E_PROP_ID_UNSUPPORTED;
    if (pPropData == NULL && pcbReturned == NULL)
        return E_POINTER;
    if (pcbReturned)
        *pcbReturned = sizeof(GUID);
    if (pPropData == NULL)  // Caller just wants to know the size.
        return S_OK;
    if (cbPropData < sizeof(GUID)) // The buffer is too small.
        return E_UNEXPECTED;
    *(GUID *)pPropData = PIN_CATEGORY_CAPTURE;
    return S_OK;
}

// QuerySupported: Query whether the pin supports the specified property.
HRESULT CMyCapturePin::QuerySupported(REFGUID guidPropSet, DWORD dwPropID,
    DWORD *pTypeSupport)
{
    if (guidPropSet != AMPROPSETID_Pin)
        return E_PROP_SET_UNSUPPORTED;
    if (dwPropID != AMPROPERTY_PIN_CATEGORY)
        return E_PROP_ID_UNSUPPORTED;
    if (pTypeSupport)
        // We support getting this property, but not setting it.
        *pTypeSupport = KSPROPERTY_SUPPORT_GET; 
    return S_OK;
}

编写捕获筛选器