EVR 媒体类型协商
[此页中所述的组件增强的视频呈现器是一项旧功能。 它已被通过 MediaPlayer 和 IMFMediaEngine 组件公开的简单视频呈现器 (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 设备是否支持该子流格式以及为引用流选择的呈现器目标格式。 因此,可用的子流格式可能会根据引用流而更改。
下面是详细过程。 这些详细信息对于大多数应用程序并不重要,但如果要编写自定义混合器或演示器,则可能会有所帮助。
对于引用流,协商将按如下方式进行:
EVR 在混合器上调用 IMFTransform::SetInputType。
混合器使用 DXVA2_VideoDesc 结构将媒体类型转换为 DXVA 2.0 说明。
混合器调用 IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids 以获取视频处理器 GUID 列表。
对于每个视频处理器 GUID,混合器调用 IDirectXVideoProcessorService::GetVideoProcessorRenderTargets 以获取支持的呈现器目标格式。
EVR 使用 MFVP_MESSAGE_INVALIDATEMEDIATYPE 消息在演示器上调用 IMFVideoPresenter::ProcessMessage。 此消息会让演示器选择新格式。
演示器调用 IMFTransform::GetOutputAvailableType 以从混合器获取可用输出格式的列表。 混合器通过从步骤 4 中获取的格式生成此列表。
演示器选择格式并在混音器上调用 IMFTransform::SetOutputType。
对于子流,该过程更简单:
EVR 在混合器上调用 IMFTransform::SetInputType。
混合器调用 IDirectXVideoProcessorService::GetVideoProcessorSubStreamFormats 以获取可用子流格式的列表。
如果建议的格式包含在此列表中,EVR 将接受输入类型。
相关主题