DMO 包装器筛选器
[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayer、IMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayer、IMFMediaEngine 和 Media Foundation 中的音频/视频捕获,而不是 DirectShow。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]
DMO 包装器筛选器使 DirectShow 应用程序能够在筛选器图中使用 DirectX 媒体对象(DMO)。 筛选器包装 DMO 并处理使用 DMO 的所有详细信息,例如向 DMO 传入和传出数据。 此外,筛选器将聚合 DMO,因此应用程序可以查询筛选器以获取 DMO 公开的任何 COM 接口。
标签 | 价值 |
---|---|
筛选器接口 | IBaseFilter、IDMOWrapperFilter、IPersistStream |
输入引脚媒体类型 | 请参阅备注 |
输入引脚接口 | IMemInputPin、IPin、IQualityControl |
输出引脚媒体类型 | 请参阅备注 |
输出引脚接口 | IAMStreamConfig、IAMVideoCompression、IMediaPosition、IMediaSeeking、IPin、IQualityControl |
筛选 CLSID | CLSID_DMOWrapperFilter |
属性页 CLSID | 无属性页 |
可执行 | Qasf.dll |
优点 | 请参阅备注 |
筛选器类别 | 请参阅备注 |
言论
局限性
DMO 包装器具有以下限制:
- 它不支持具有零输入、多个输入或零输出的 DMO。 (它确实支持具有一个输入和输出的 DMO。
- 它不支持自定义传输。 所有数据传输都通过 IMemInputPin 接口完成。
- 它不使用 IMediaObjectInPlace 接口;所有处理都是使用 IMediaObject 方法完成的。
引 脚
对于 DMO 上的每个输入流,筛选器将创建相应的输入引脚。 对于每个输出流,它将创建相应的输出引脚。 每个引脚支持的媒体类型取决于 DMO
编码器接口
如果 DMO 是视频编码器或音频编码器,则输出引脚会公开 IAMStreamConfig 接口。 如果 DMO 是视频编码器,则输出引脚还会公开 IAMVideoCompression 接口。 在这两种情况下,如果 DMO 支持接口,则引脚委托给 DMO。 否则,引脚提供自己的实现。
流
筛选器使用 IMemInputPin 接口来处理所有流式处理。 它不支持 IAsyncReader 连接。 筛选器仅在从上游(包括流结束通知)接收数据时才对 DMO 调用 IMediaObject::P rocessOutput。 因此,它不支持具有零输入流的 DMO。
寻求
所有搜寻请求都通过 DMO 包装器上的第一个输入引脚传递到上游筛选器。 对于多输出 DMO,这意味着当应用程序查找图形时,上游筛选器可能会收到多个查找请求。
优点
DirectShow 为所有 DMO 分配默认值 MERIT_NORMAL + 0x800。 此值介于 MERIT_NORMAL 和 MERIT_PREFERRED之间。 解码器筛选器通常具有 MERIT_NORMAL的功绩值。 因此,筛选器图形管理器通常会在解码器筛选器上选择 DMO 解码器。 若要替代默认值,请在 HKEY_CLASSES_ROOT\CLSID中将注册表项添加到 DMO 的注册表项中。 包括一个名为“Merit”的 DWORD 值,其值指定了优点。
类别
DMO 包装器筛选器本身不会出现在任何类别中。 当它包装 DMO 时,它将显示在与 DMO 类别对应的 DirectShow 类别中,其名称为 DMO。
缓冲区
DMO 包装器筛选器将媒体缓冲区传递给 DMO,该 DMO 公开 IMediaBuffer 接口。
在 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 对其输出引脚的调用转换为 IDMOQualityControl::SetNow 调用 DMO。 SetNow 的 rtNow 参数计算为 TimeStamp 和 Quality 结构的成员之和。
在 GraphEdit 中使用 Fiter
在 GraphEdit 中,DMO 包装器筛选器不在其自己的名称下显示。 相反,每个已注册的 DMO 都列在相应的筛选器类别下。 通过 插入筛选器 对话框添加 DMO 时,GraphEdit 将创建 DMO 包装器筛选器并将其配置为使用该 DMO。
相关主题