使用视频显示控件
[此页中所述的组件增强的视频呈现器是一项旧功能。 它已被通过 MediaPlayer 和 IMFMediaEngine 组件公开的简单视频呈现器 (SVR) 取代。 若要播放视频内容,应将数据发送到其中一个组件,并允许它们实例化新的视频呈现器。 这些组件已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer 或较低级别的 IMFMediaEngine API 在 Windows 而不是 EVR 中播放视频媒体。 如果可能,Microsoft 建议应重写使用旧 API 的现有代码,以尽可能地使用新的 API。]
IMFVideoDisplayControl 接口控制增强的视频呈现器 (EVR) 如何在应用程序窗口中显示视频。 可以在 DirectShow 或媒体基础中使用此接口。 在内部,视频显示控件由 EVR 的默认演示器提供。 如果编写自定义演示器,可以提供相同的接口或定义自定义接口。
获取指向 IMFVideoDisplayControl 接口的指针的正确方法取决于使用的是 DirectShow 版本还是媒体基础版本的 EVR。 如果是媒体基础版 EVR,还取决于是直接使用 EVR 还是通过媒体会话(更典型)使用它。
若要获取指向 IMFVideoDisplayControl 接口的指针,请执行以下操作:
获取指向 IMFGetService 接口的指针。
如果使用 DirectShow EVR 筛选器,则在筛选器上调用 QueryInterface。
如果要直接使用 EVR 媒体接收器,则在媒体接收器上调用 QueryInterface。
如果使用媒体会话,则在媒体会话上调用 QueryInterface。
如果使用媒体会话,则等待媒体会话发送状态值为 MF_TOPOSTATUS_READY 的 MESessionTopologyStatus 事件。 (否则,跳过此步骤。)
调用 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。
窗口消息
在播放期间,应用程序应响应某些窗口消息,如下所示:
WM_PAINT:调用 IMFVideoDisplayControl::RepaintVideo 以重绘视频。 此外,请避免在播放视频时绘制目标矩形,因为这可能会导致闪烁。
WM_SIZE:可能需要调用 SetVideoPosition 来调整目标矩形的大小。
与 DirectShow 中的视频混合呈现器 (VMR) 筛选器不同,在收到 WM_DISPLAYCHANGE 消息时无需通知 EVR。
相关主题