使用视频显示控件

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

IMFVideoDisplayControl 接口控制增强的视频呈现器 (EVR) 如何在应用程序窗口中显示视频。 可以在 DirectShow 或媒体基础中使用此接口。 在内部,视频显示控件由 EVR 的默认演示器提供。 如果编写自定义演示器,可以提供相同的接口或定义自定义接口。

获取指向 IMFVideoDisplayControl 接口的指针的正确方法取决于使用的是 DirectShow 版本还是媒体基础版本的 EVR。 如果是媒体基础版 EVR,还取决于是直接使用 EVR 还是通过媒体会话(更典型)使用它。

若要获取指向 IMFVideoDisplayControl 接口的指针,请执行以下操作:

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

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

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

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

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

  3. 调用 IMFGetService::GetService 以获取 IMFVideoDisplayControl 接口。 服务标识符是 MR_VIDEO_RENDER_SERVICE。

可以使用 IMFVideoDisplayControl 接口执行以下任务:

  • 设置剪辑窗口。

  • 设置源矩形和目标矩形。

  • 更新视频窗口以响应窗口消息。

  • 启用或禁用全屏模式。

剪辑窗口

应用程序必须提供 EVR 绘制视频的窗口。 若要设置剪辑窗口,请使用应用程序窗口的句柄调用 IMFVideoDisplayControl::SetVideoWindow

如果通过激活对象创建 EVR 媒体接收器,则不需要此步骤。 激活对象使用在 MFCreateVideoRendererActivate 函数中提供的窗口句柄自动调用 SetVideoWindow

源矩形和目标矩形

在播放期间,演示器会获取复合视频图像的一部分,并将其绘制到视频窗口的区域。 复合图像的部分是源矩形,视频窗口的区域是目标矩形

源矩形使用规范化坐标进行定义,其中点 (0.0, 0.0) 对应于视频左上角,(1.0, 1.0) 对应于视频右下角。 源矩形可以是此矩形中的任何区域。 目标矩形以像素为单位指定,相对于窗口的工作区。 默认源矩形是整个图像,默认目标矩形是空矩形。

若要设置源矩形和目标矩形,请调用 IMFVideoDisplayControl::SetVideoPosition

如果通过激活对象创建 EVR 媒体接收器,则不需要此步骤。 激活对象自动将目标矩形设置为等于窗口的整个工作区。 但是,如果要更改源矩形或设置其他目标矩形,则应调用 SetVideoPosition

窗口消息

在播放期间,应用程序应响应某些窗口消息,如下所示:

与 DirectShow 中的视频混合呈现器 (VMR) 筛选器不同,在收到 WM_DISPLAYCHANGE 消息时无需通知 EVR。

增强的视频呈现器