自定义混音器

本主题介绍如何为增强的视频呈现器 (EVR) 编写自定义混音器。 可以将自定义混音器与 Media Foundation EVR 媒体接收器或 DirectShow EVR 筛选器一起使用。 有关混音器和演示器的详细信息,请参阅 增强的视频呈现器

混音器是媒体基础转换 (MFT) , (引用流以及子流) 和一个输出。 输入流从上游接收样本。 输出流将示例传送到演示者。 EVR 负责在混音器上调用 IMFTransform::P rocessInput ,演示者负责调用 IMFTransform::P rocessOutput

EVR 混音器至少必须实现以下接口:

接口 说明
IMFTransform 提供基本 MFT 功能。
IMFTopologyServiceLookupClient 使混音器能够从 EVR 获取接口。
IMFVideoDeviceID 使混音器能够从 EVR 获取接口。
IMFAttributes 用于向 EVR 公开 MF_SA_D3D_AWARE 属性。

 

(可选)MFT 可以实现以下任何接口:

接口 说明
IEVRTrustedVideoPlugin 需要播放受保护的内容。
IMFGetService 向应用程序公开 IMFVideoMixerBitmapIMFVideoProcessor 等接口。
IMFQualityAdvise 使质量管理器能够调整视频质量。
IMFVideoMixerBitmap 使应用程序能够将静态位图混合到视频中。
IMFVideoPositionMapper 地图输出视频帧上的坐标,以在输入视频帧上坐标。
IMFVideoProcessor 向应用程序公开一些 DXVA 视频处理功能。

 

使用混音器进行格式协商的工作原理如下:

  1. EVR 在引用流上设置媒体类型。

  2. EVR 使用MFVP_MESSAGE_INVALIDATEMEDIATYPE消息在演示者上调用 IMFVideoPresenter::P rocessMessage

  3. 演示者在混音器的输出流上设置媒体类型。

  4. EVR 在子流上设置媒体类型。

如果引用流上的媒体类型发生更改,混音器的其他媒体类型将不再有效。 混音器的 IMFTransform::P rocessOutput 方法随后将失败并返回 MF_E_TRANSFORM_STREAM_CHANGE。 演示者此时不应执行任何操作。 EVR 将再次启动格式协商过程。

当任何输入流到达流的末尾时,EVR 会在混音器上调用 IMFTransform::P rocessMessage,并MFT_MESSAGE_NOTIFY_END_OF_STREAM。

混音器使用 EVR 的 IMediaEventSink 接口将以下事件发送到 EVR。 此接口记录在 DirectShow SDK 文档中。

事件 描述
EC_SAMPLE_NEEDED 混音器需要新的输入样本。

 

在流式处理开始之前,EVR 可能会在混音器上调用 ProcessOutput 。 混音器不应失败这些调用。 相反,它应使用黑色像素填充输出图面。 在收到 MFT_MESSAGE_NOTIFY_BEGIN_STREAMING 消息或调用 ProcessInput 方法之前,混音器应继续着色填充输出样本。 如果混音器收到 MFT_MESSAGE_NOTIFY_END_STREAMING 消息,则应切换回颜色填充模式。

实现 IMFVideoDeviceID

IMFVideoDeviceID 接口包含一个返回设备 GUID 的方法 GetDeviceID。 设备 GUID 可确保演示者和混音器使用兼容的技术。 如果设备 GUID 不匹配,则 EVR 无法初始化。

标准混音器和演示者都使用 Direct3D 9,设备 GUID 等于IID_IDirect3DDevice9。 如果要将自定义演示者与标准混音器一起使用,则必须IID_IDirect3DDevice9演示者的设备 GUID。 如果替换这两个组件,则可以定义新的设备 GUID。

实现 IMFTopologyServiceLookupClient

混音器必须实现 IMFTopologyServiceLookupClient 接口。 在流式处理开始之前,EVR 调用 IMFTopologyServiceLookupClient::InitServicePointers ,并传入指向 EVR 的 IMFTopologyServiceLookup 接口的指针。 混音器使用此指针从 EVR 获取接口指针。

至少,混音器必须查询以下接口:

当 EVR 调用 IMFTopologyServiceLookupClient::ReleaseServicePointers 时,混音器必须释放从调用 InitServicePointers 获取的任何指针。

Mixer属性

混音器应支持以下属性。

属性 说明
MF_SA_D3D_AWARE 指定混音器是否支持 DirectX 视频加速 (DXVA) 。
MF_SA_REQUIRED_SAMPLE_COUNT EVR 应为每个混音器流分配的视频样本数。 此属性适用于单个流;使用 IMFTransform::GetInputStreamAttributes 返回的属性存储。

 

在 EVR 上设置Mixer

若要在 EVR 上设置自定义混音器,请调用 IMFVideoRenderer::InitializeRenderer。 DirectShow EVR 筛选器和 EVR 媒体接收器都实现了此方法。

EVR 激活对象。 如果使用 EVR 激活对象,可以通过在 EVR 激活对象上设置以下属性之一来提供自定义混音器:

属性 说明
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_ACTIVATE 指向混音器的激活对象的指针。 激活对象必须实现 IMFActivate 接口。
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_CLSID 混音器的 CLSID。

 

增强的视频呈现器