自定义混音器

[此页上所述的组件 增强的视频呈现器,是一项旧功能。 它已被通过 MediaPlayer 公开的简单视频呈现器(SVR)取代,IMFMediaEngine 组件。 若要播放视频内容,应将数据发送到其中一个组件,并允许它们实例化新的视频呈现器。 这些组件已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayer 或较低级别的 IMFMediaEngine API 在 Windows 而不是 EVR 中播放视频媒体。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]

本主题介绍如何为增强的视频呈现器(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 接口包含一种方法,GetDeviceID,该方法返回设备 GUID。 设备 GUID 可确保演示者和混音器使用兼容的技术。 如果设备 GUID 不匹配,EVR 将无法初始化。

标准混音器和演示者都使用 Direct3D 9,设备 GUID 等于IID_IDirect3DDevice9。 如果打算将自定义演示者与标准混音器一起使用,则演示者的设备 GUID 必须IID_IDirect3DDevice9。 如果替换这两个组件,则可以定义新的设备 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 上设置混音器

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

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

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

 

增强的视频呈现器