声明筛选器信息

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

第一步是根据需要声明筛选器信息。 DirectShow 定义了以下结构,用于描述筛选器、引脚和媒体类型:

结构 说明
AMOVIESETUP_FILTER 描述筛选器。
AMOVIESETUP_PIN 描述图钉。
AMOVIESETUP_MEDIATYPE 描述媒体类型。

 

这些结构是嵌套的。 AMOVEIESETUP_FILTER结构具有指向AMOVIESETUP_PIN结构的数组的指针,其中每个结构都具有指向AMOVEIESETUP_MEDIATYPE结构数组的指针。 综合起来,这些结构为 IFilterMapper2 接口提供了足够的信息来查找筛选器。 它们不是筛选器的完整说明。 例如,如果筛选器创建同一引脚的多个实例,则只应为该引脚声明一 个AMOVIESETUP_PIN 结构。 此外,不需要筛选器来支持它注册的每种媒体类型组合;也不需要注册它支持的每个媒体类型。

将设置结构声明为 DLL 中的全局变量。 以下示例演示了一个带有一个输出引脚的筛选器:

static const WCHAR g_wszName[] = L"Some Filter";

AMOVIESETUP_MEDIATYPE sudMediaTypes[] = {
    { &MEDIATYPE_Video, &MEDIASUBTYPE_RGB24 },
    { &MEDIATYPE_Video, &MEDIASUBTYPE_RGB32 },
};

AMOVIESETUP_PIN sudOutputPin = {
    L"",            // Obsolete, not used.
    FALSE,          // Is this pin rendered?
    TRUE,           // Is it an output pin?
    FALSE,          // Can the filter create zero instances?
    FALSE,          // Does the filter create multiple instances?
    &GUID_NULL,     // Obsolete.
    NULL,           // Obsolete.
    2,              // Number of media types.
    sudMediaTypes   // Pointer to media types.
};

AMOVIESETUP_FILTER sudFilterReg = {
    &CLSID_SomeFilter,      // Filter CLSID.
    g_wszName,              // Filter name.
    MERIT_NORMAL,           // Merit.
    1,                      // Number of pin types.
    &sudOutputPin           // Pointer to pin information.
};

筛选器名称声明为静态全局变量,因为它将再次在其他位置使用。

如何注册 DirectShow 筛选器