在 DirectShow 中使用 DME

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

基于 DirectShow 的应用程序可以通过 DMO 包装器 筛选器在筛选图中使用 DMO。 此筛选器聚合 DMO 并处理使用 DMO 的所有详细信息,例如将数据传入和传出 DMO、分配 IMediaBuffer 对象等。

由于 DMO 由筛选器聚合,因此应用程序可以查询筛选器以查找 DMO 公开的任何 COM 接口。 但是,应用程序应允许筛选器处理 DMO 上的所有流式处理操作。 例如,不要设置媒体类型、处理任何缓冲区、刷新 DMO、锁定 DMO、启用或禁用质量控制或设置视频优化。

如果知道要使用的特定 DMO 的类标识符 (CLSID) ,则可以使用该 DMO 初始化 DMO 包装器筛选器,如下所示:

  1. 调用 CoCreateInstance 创建 DMO 包装器筛选器。
  2. 查询 IDMOWrapperFilter 接口的 DMO 包装器 筛选器。
  3. 调用 IDMOWrapperFilter::Init 方法。 指定 DMO 的 CLSID 和 DMO 类别的 GUID。 有关 DMO 类别的列表,请参阅 DMO GUID

以下代码演示了这些步骤:

// Create the DMO Wrapper filter.
IBaseFilter *pFilter;
HRESULT hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, 
    CLSCTX_INPROC_SERVER, IID_IBaseFilter, 
    reinterpret_cast<void**>(&pFilter));

if (SUCCEEDED(hr)) 
{
    // Query for IDMOWrapperFilter.
    IDMOWrapperFilter *pDmoWrapper;
    hr = pFilter->QueryInterface(IID_IDMOWrapperFilter, 
        reinterpret_cast<void**>(&pDmoWrapper));

    if (SUCCEEDED(hr)) 
    {     
        // Initialize the filter.
        hr = pDmoWrapper->Init(CLSID_MyDMO, DMOCATEGORY_VIDEO_EFFECT); 
        pDmoWrapper->Release();

        if (SUCCEEDED(hr)) 
        {
            // Add the filter to the graph.
            hr = pGraph->AddFilter(pFilter, L"My DMO");
        }
    }
    pFilter->Release();
}

DMOEnum 函数枚举注册表中的 DMO。 此函数使用一组不同于用于 DirectShow 筛选器的类别 GUID。

将系统设备枚举器与 DME 配合使用

可以使用 系统设备枚举器,而不是直接创建 DMO,它可以枚举 DMOEnum 方法支持的任何 DMO 类别。 系统设备枚举器在枚举某些 DirectShow 筛选器类别时还包括 D 莫。 下表显示了 DMO 类别和 DirectShow 类别之间的映射。

Label
DMO 类别 DirectShow 等效项
DMOCATEGORY_AUDIO_ENCODER CLSID_AudioCompressorCategory
DMOCATEGORY_AUDIO_DECODER CLSID_LegacyAmFilterCategory
DMOCATEGORY_VIDEO_ENCODER CLSID_VideoCompressorCategory
DMOCATEGORY_VIDEO_DECODER CLSID_LegacyAmFilterCategory

 

系统设备枚举器返回名字对象列表。 如果名字对象表示 DMO, 则 IMoniker::BindToObject 方法会自动创建 DMO 包装器筛选器,并使用该 DMO 对其进行初始化。 因此,涉及 DMO 的事实对应用程序是透明的。 有关使用系统设备枚举器的详细信息,请参阅 使用系统设备枚举器

限制

在 DirectShow 中使用 DTO 时存在一些限制:

  • DMO 包装器筛选器不支持具有零输入、多个输入或零输出的 DMO。
  • DMO 包装器筛选器上的所有引脚连接都使用 IMemInputPin 接口。
  • DirectShow 编辑服务不支持基于 DMO 的效果或过渡。

使用 DME