DMO 包装器筛选器

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

DMO 包装器筛选器使 DirectShow 应用程序能够在筛选器图中使用 DirectX 媒体对象 (DMO) 。 筛选器包装 DMO 并处理使用 DMO 的所有详细信息,例如将数据传入和传出 DMO。 此外,筛选器会聚合 DMO,因此应用程序可以查询筛选器以查找 DMO 公开的任何 COM 接口。

Label
筛选器接口 IBaseFilterIDMOWrapperFilterIPersistStream
输入引脚媒体类型 请参阅备注
输入引脚接口 IMemInputPinIPinIQualityControl
输出引脚媒体类型 请参阅备注
输出引脚接口 IAMStreamConfigIAMVideoCompressionIMediaPositionIMediaSeekingIPinIQualityControl
筛选器 CLSID CLSID_DMOWrapperFilter
属性页 CLSID 无属性页
可执行文件 Qasf.dll
优点 请参阅备注
筛选器类别 请参阅备注

 

备注

限制

DMO 包装器具有以下限制:

  • 它不支持具有零输入、多个输入或零输出的 DSO。 (它确实支持具有一个输入和多个输出的 DSO。)
  • 它不支持自定义传输。 所有数据传输都通过 IMemInputPin 接口完成。
  • 它不使用 IMediaObjectInPlace 接口;所有处理都是使用 IMediaObject 方法完成的。

锁定

对于 DMO 上的每个输入流,筛选器会创建相应的输入引脚。 对于每个输出流,它会创建相应的输出引脚。 每个引脚支持的媒体类型取决于 DMO

编码器接口

如果 DMO 是视频编码器或音频编码器,则输出引脚会公开 IAMStreamConfig 接口。 如果 DMO 是视频编码器,则输出引脚还会公开 IAMVideoCompression 接口。 在这两种情况下,如果 DMO 支持 接口,则引脚将委托给 DMO。 否则,引脚会提供其自己的实现。

流式处理

筛选器使用 IMemInputPin 接口来处理所有流式处理。 它不支持 IAsyncReader 连接。 仅当筛选器从上游 ((包括流结束通知) )接收数据时,才调用 DMO 上的 IMediaObject::P rocessOutput。 因此,它不支持具有零输入流的 DSO。

寻求

所有搜寻请求都通过 DMO 包装器上的第一个输入引脚传递到上游筛选器。 对于多输出 DSO,这意味着当应用程序查找图形时,上游筛选器可能会收到多个查找请求。

优点

DirectShow 为所有 DDO 分配默认优点值为 MERIT_NORMAL + 0x800。 此值介于 MERIT_NORMALMERIT_PREFERRED 之间。 解码器筛选器的优点值通常为 MERIT_NORMAL。 因此,筛选器图管理器通常会在解码器筛选器上选择 DMO 解码器。 若要替代默认优点值,请在 HKEY_CLASSES_ROOT\CLSID 中向 DMO 的注册表项添加注册表项。 包括名为“Merit”的 DWORD 值,其值指定优点。

类别

DMO 包装器筛选器本身不出现在任何类别中。 包装 DMO 时,它将显示在与 DMO 类别对应的 DirectShow 类别中,并位于 DMO 的名称下。

缓冲区

DMO 包装器筛选器将媒体缓冲区传递给公开 IMediaBuffer 接口的 DMO

在 Windows Vista 或更高版本中,媒体缓冲区还会公开 IServiceProvider 接口。 DMO 可以使用此接口获取指向与缓冲区关联的媒体示例的指针。 使用 服务标识符IID_IMediaSample。 视频 DMO 可以使用媒体示例的 IMediaSample2 接口在示例上设置隔行标志。 以下代码演示如何获取指向媒体示例的指针:

IServiceProvider *pSp = NULL;
IMediaSample2 *pSample2 = NULL;
HRESULT hr = S_OK;

hr = pBuffer->QueryInterface(IID_IServiceProvider, (void**)&pSp);
if (SUCCEEDED(hr))
{
    hr = pSp->QueryService(
        IID_IMediaSample,  // Service identifier.
        IID_IMediaSample2, // Interface identifier.
        (void**)&pSample2
        );
    if (SUCCEEDED(hr))
    {
        // Set flags (not shown).
        pSample2->Release();
    }
    pSp->Release();
}

有关每个样本交错标志的详细信息,请参阅 AM_SAMPLE2_PROPERTIES 结构

质量控制

如果 DMO 公开 IDMOQualityControl 接口,筛选器会将其输出引脚上的 IQualityControl::Notify 调用转换为 DMO 上的 IDMOQualityControl::SetNow 调用。 SetNowrtNow 参数计算为 Quality 结构的 TimeStampLate 成员的总和。

在 GraphEdit 中使用调整器

在 GraphEdit 中,DMO 包装器筛选器不会在其自己的名称下显示。 相反,每个已注册的 DMO 都列在相应的筛选器类别下。 通过“ 插入筛选器 ”对话框添加 DMO 时,GraphEdit 会创建 DMO 包装器筛选器,并将其配置为使用该 DMO。

DirectShow 筛选器

DirectX 媒体对象