使用视频混合器控件

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

EVR 混合器提供了多个接口,应用程序可以使用这些接口来控制混合器处理视频的方式。 可以在 DirectShow 或 Media Foundation 中使用这些接口。

接口 说明
IMFVideoMixerBitmap 接口 将静态位图图像通过 Alpha 值混合处理混合到视频中。
IMFVideoMixerControl 接口 控制 EVR 如何混合视频子流。
IMFVideoProcessor 接口 控制颜色调整、图像筛选器和其他视频处理功能。 此接口提供对图形驱动程序实现的功能的访问,因此其确切功能取决于用户的图形驱动程序。

 

获取指向这些接口的指针的正确方法取决于使用的是 DirectShow 版本还是媒体基础版本的 EVR。 如果是媒体基础版 EVR,还取决于是直接使用 EVR 还是通过媒体会话使用它。 (通常,应用程序通过媒体会话而非直接使用 EVR)。

若要获取指向其中任一接口的指针,请执行以下操作:

  1. 获取指向 EVR 上 IMFGetService 接口的指针。

    • 如果使用 DirectShow EVR 筛选器,则在筛选器上调用 QueryInterface

    • 如果要直接使用 EVR 媒体接收器,则在媒体接收器上调用 QueryInterface

    • 如果使用媒体会话,则在媒体会话上调用 QueryInterface

  2. 如果使用媒体会话,则等待媒体会话发送状态值为 MF_TOPOSTATUS_READY 的 MESessionTopologyStatus 事件。 (如果不使用媒体会话,则跳过此步骤。)

  3. 调用 IMFGetService::GetService 可获取混合器接口。 使用服务标识符MR_VIDEO_MIXER_SERVICE。

将位图通过 Alpha 值混合处理混合到视频中

可以使用 IMFVideoMixerBitmap 接口在播放期间将静态位图通过 Alpha 值混合处理混合到视频中。 可以将位图存储在 Direct3D 图面中,将其指定为 IDirect3DSurface9 指针,或使用 GDI 位图。

如果要将 Direct3D 图面用于位图,图面可包含每像素 alpha 数据,当混合器对图像进行 alpha 值混合处理时会使用该数据。 也可以定义颜色键,即当位图中的任何位置出现某种颜色时该颜色都会变透明。 此外,还可以指定要应用于整个图像的 alpha 值。 还可以设置一个源矩形来裁剪位图,以及一个目标矩形用于将位图放置在视频帧中。

要设置位图,则调用 IMFVideoMixerBitmap::SetAlphaBitmap。 此方法采用指向 MFVideoAlphaBitmap 结构的指针,该结构指定位图和 alpha 值混合处理参数。 有关示例代码,请参阅 SetAlphaBitmap 方法的参考主题。

设置位图后,可以通过调用 IMFVideoMixerBitmap::UpdateAlphaBitmapParameters 来更新混合处理参数,包括源和目标矩形。 此更新会在下一个视频帧生效。 必须播放视频才能使更新生效。 可以使用此方法在位图上实现简单动画效果。 (如果需要更复杂的效果,可考虑编写自定义 EVR 混合器。)

要清除位图,则调用 IMFVideoMixerBitmap::ClearAlphaBitmap

控制子流

EVR 可以将一个或多个视频子流混合到主视频流上。 要控制子流混合,则使用 IMFVideoMixerControl 接口。

视频处理器设置

EVR 混合器使用 DirectX 视频加速 (DXVA) 对输入流执行视频处理。 确切的处理功能取决于图形驱动程序。 通过使用 DXVA2_VideoProcessorCaps 结构来描述视频处理功能。 特定的一组功能称为视频处理模式,每个模式通过 GUID 进行标识。 有关预定义的 GUID 的列表,请参阅 IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids。 驱动程序还可能定义其他特定于供应商的 GUID,以表示不同的功能组合。

要查找支持的模式和每个模式的功能,则执行以下操作:

  1. 调用 IMFGetService::GetService 可获取指向混合器的 IMFVideoProcessor 接口的指针。

  2. 调用 IMFVideoProcessor::GetAvailableVideoProcessorModes。 此方法返回 GUID 数组,可标识可用的视频处理器模式。 该列表按质量降序返回,质量最高的模式显示在列表之首。 列表内容会因视频格式而有所不同。

  3. 为列表中的每个 GUID 调用 IMFVideoProcessor::GetVideoProcessorCaps,以查找相应视频处理器模式的功能。 该方法使用功能说明填充 DXVA2_VideoProcessorCaps 结构。

  4. 要选择一个模式,则调用 IMFVideoProcessor::SetVideoProcessorMode。 否则,EVR 会在流式处理开始时自动选择模式。 在这种情况下,可调用 IMFVideoProcessor::GetVideoProcessorMode 来查找所选模式。

DXVA2_VideoProcessorCaps 结构中的大多数字段描述低层级的驱动程序行为,在典型应用程序中不太重要。 以下字段较为重要:

  • DeviceCaps。 此字段指示是否在硬件或软件中执行视频处理,以及图形驱动程序是否为较旧的 DXVA 1.0 驱动程序。

  • DeinterlaceTechnology。 此字段在一定程度上指示当源视频存在交错时可预期的去交错质量水平。

  • ProcAmpControlCaps。 此字段指定有哪些可用的颜色调整控件。 有关可能的颜色调整的列表,请参阅 ProcAmp 设置。 如果驱动程序无法执行颜色调整,此字段为零。

  • VideoProcessorOperations。 此字段包含描述其他视频处理功能的标志。 尤其重要的两个标志是 DXVA2_VideoProcess_SubStreams 标志和 DXVA2_VideoProcess_SubStreams 标志。 须至少存在其中一个标志,EVR 才能将子流混合到引用视频流。 如果两个标志都不存在,EVR 只能处理一个视频流。

  • NoiseFilterTechnology。 此字段指示图形驱动程序支持哪些干扰筛选器。 如果驱动程序不支持干扰筛选,该值为 DXVA2_NoiseFilterTech_Unsupported。

  • DetailFilterTechnology。 此字段指示图形驱动程序支持哪些详细信息筛选器。 如果驱动程序不支持干扰筛选,该值为 DXVA2_DetailFilterTech_Unsupported。

颜色调整和图像筛选

图形驱动程序可能支持颜色调整(也称为过程放大ProcAmp)和图像筛选。 当 GPU 执行颜色调整和图像筛选时,可实现实时执行,且无需 CPU 开销。

要使用这些功能,则执行以下步骤:

  1. 按上一部分所述,选择视频处理模式。

  2. 调用 IMFVideoProcessor::GetVideoProcessorCaps 可查找上一部分所述的视频处理功能。 该方法填充 DXVA2_VideoProcessorCaps 结构,该结构描述功能,包括驱动程序是否支持颜色调整和图像筛选器。

  3. 对于驱动程序支持的每个颜色调整,调用 IMFVideoProcessor::GetProcAmpRange 可查找该设置的可能值范围。 此方法还返回设置的默认值。 调用 IMFVideoProcessor::GetProcAmpValues 可查找设置的当前值。 这些值未指定单位。 值范围由驱动程序定义。

  4. 调用 IMFVideoProcessor::SetFilteringValue 可设置颜色调整值。

  5. 如果驱动程序支持图像筛选,则每个筛选器类型(干扰和详细信息)在色度和亮度上都支持三个设置:级别、半径和阈值。 (请参阅 DXVA 图像筛选器设置。)对于每个设置,调用 IMFVideoProcessor::GetFilteringRange 可获取可能值的范围,调用 IMFVideoProcessor::GetFilteringValue 可获取当前值。

  6. 若要更改图像筛选器设置,可调用 IMFVideoProcessor::SetFilteringValue

增强的视频呈现器