EVR 媒体类型协商

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

本主题介绍增强的视频呈现器 (EVR) 如何验证媒体类型。

  • 对于 DirectShow EVR 筛选器,当筛选器的引脚连接时,会发生类型协商。

  • 对于 EVR 媒体接收器,媒体类型是通过流接收器上的 IMFMediaTypeHandler 接口设置的。 通常,拓扑加载器会协商媒体类型,但应用程序也可以直接设置媒体类型。

EVR 不报告任何首选媒体类型。 客户端必须测试媒体类型,直到找到可接受的类型。 必须先设置引用流的媒体类型,然后才能在任何子流上设置类型。

对于引用流,EVR 混合器会获取兼容的 DirectX 视频加速 (DXVA) 呈现器目标格式的列表。 EVR 演示器将使用此列表来选择 Direct3D 交换链的格式。 如果找不到兼容的呈现器目标格式,EVR 将拒绝媒体类型。

对于子流,EVR 混合器会查询 DXVA 设备是否支持该子流格式以及为引用流选择的呈现器目标格式。 因此,可用的子流格式可能会根据引用流而更改。

下面是详细过程。 这些详细信息对于大多数应用程序并不重要,但如果要编写自定义混合器或演示器,则可能会有所帮助。

对于引用流,协商将按如下方式进行:

  1. EVR 在混合器上调用 IMFTransform::SetInputType

  2. 混合器使用 DXVA2_VideoDesc 结构将媒体类型转换为 DXVA 2.0 说明。

  3. 混合器调用 IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids 以获取视频处理器 GUID 列表。

  4. 对于每个视频处理器 GUID,混合器调用 IDirectXVideoProcessorService::GetVideoProcessorRenderTargets 以获取支持的呈现器目标格式。

  5. EVR 使用 MFVP_MESSAGE_INVALIDATEMEDIATYPE 消息在演示器上调用 IMFVideoPresenter::ProcessMessage。 此消息会让演示器选择新格式。

  6. 演示器调用 IMFTransform::GetOutputAvailableType 以从混合器获取可用输出格式的列表。 混合器通过从步骤 4 中获取的格式生成此列表。

  7. 演示器选择格式并在混音器上调用 IMFTransform::SetOutputType

对于子流,该过程更简单:

  1. EVR 在混合器上调用 IMFTransform::SetInputType

  2. 混合器调用 IDirectXVideoProcessorService::GetVideoProcessorSubStreamFormats 以获取可用子流格式的列表。

  3. 如果建议的格式包含在此列表中,EVR 将接受输入类型。

增强的视频呈现器