Quantcast
Channel: Intermédiaire
Viewing all articles
Browse latest Browse all 677

基于 Windows* 8.1 台式机的 Miracast*

$
0
0

Download PDF
 
Code Sample

要点综述

英特尔 WiDi 扩展库中的许多功能已迁移至微软实施的 Miracast 中,成为 Windows* 8.1 的一部分。 本白皮书讨论了使用英特尔® 媒体软件开发套件和 OpenGL* 为 Miracast 提供 Windows 8.1 台式机应用支持的多种技术。 本文不提供在 Windows 应用商店应用中支持 Miracast 的内容,因为它们需要完全不同的框架。

系统要求

示例代码使用 Visual Studio* 2013 编写,以便展示以下两项内容:  使用英特尔媒体软件开发套件的(1) Miracast 和 (2) 英特尔® 媒体软件开发套件 / OpenGL* 纹理共享, 其中解码平面无需进行复制即可与 OpenGL 纹理共享,进而显著提高了效率。 MJPEG 解码器面向第四代英特尔® 酷睿™ 处理器(代号:Haswell)及更高版本的处理器实施了硬件加速,以前版本的处理器中的英特尔媒体软件开发套件将会自动使用该软件解码器。 在任何情况下,它都需要与 MJPEG 兼容的摄像头(无论是板载还是 USB 摄像头)。

除了辨认 Miracast 连接类型以外,该示例代码和白皮书中使用的大部分技术都适用于 Visual Studio 2012。 该示例代码基于 Intel Media SDK 2014 for Client,可通过以下链接进行下载:http://software.intel.com/sites/default/files/MediaSDK2014Clients.zip。 安装英特尔媒体软件开发套件可为 Visual Studio 自动设置一套环境变量,以便为头文件和库查找正确的路径。

应用概述

该应用以摄像头为 MJPEG 输入,并对 MJPEG 视频解码,将视频流编码至 H264,然后再对 H264 进行解码。 MJPEG 摄像头视频流(解码后)和最终以 H264 标准解码的视频流将会在基于 MFC 的 GUI 上显示。 在 Haswell 系统上,2 个解码器和 1 个编码器(1080P 分辨率)将会按顺序运行以改进可读性,但是由于硬件加速,它们的速度非常快,这使得摄像头速度成为限制 fps 的因素。 在实际情况下,编码器和解码器将会在不同的线程中运行,性能不会成为障碍。

在单个显示器配置上,摄像头馈入将会在基于 OpenGL 的 GUI 中以 H264 标准解码的视频上方的 PIP 中显示(图 1)。 当 Miracast 连接时,软件将会自动辨认与 Miracast 相连的显示器,并使用全屏窗口播放以 H264 标准解码的视频,而 GUI 将显示原始摄像头视频,因此原始视频和加密视频之间的区别便清晰可见。 最后,查看->监控拓扑(View->Monitor Topology)菜单不仅能够以单选按钮的形式显示当前的显示器拓扑,还能够用来更改拓扑。 但是很可惜,它无法启动 Miracast 连接。 这些操作只能在 OS charm 菜单上完成(从右侧滑入-> 设备->项目),目前尚且没有能够创建 Miracast 连接的 API 。 有趣的是,通过将显示器拓扑设置为仅限内部使用可以将 Miracast 连接断开。 如果通过线路连接了多台显示器,菜单可以随时更改拓扑。


1.单个显示器拓扑。 MJPEG 摄像头视频流在右下角显示。 以 H264 标准加密的视频在 GUI 中播放。 当启用多台显示器(如 Miracast)时,该软件可检测到变化,MJPEG 摄像头视频和以 H264 加密的视频将会自动分至不同的显示器。

检测显示器拓扑变化

当检测到显示器配置变化时,如添加/删除外置显示器(Miracast 连接/断开),OS 将会在顶层窗口显示 WM_DISPLAYCHANGE 消息。 在样本代码中,顶层窗口是 CMainFrame 类,而且其 OnDisplayChange 类函数可处理该消息。 鉴于多台显示器播放时会出现较短的延迟,OnDisplayChange 处理程序将会先禁用所有更新内部数据结构的活动,如摄像头馈入及所有后续流程,然后启用定时器以便提供充足的时间切换显示器配置。 QueryDisplayConfig API 可用于了解拓扑,它可以提供一组显示器信息(包括每台显示器的位置和尺寸,如果希望在某个显示器上显示全屏窗口,了解这一信息非常重要)以及拓扑类型(内 置、复制、扩展、外置等)。 这些函数可在 CDisplayHelper 类中封装, OnDisplayChange 处理程序发起的 OnTimer 函数使用该类进行封装。 对拓扑进行重新配置后,处理程序将重启内置活动,恢复摄像头馈入。

更改显示器拓扑

如果想要更改显示器拓扑,你可以调用 SetDisplayConfig(不要调用 QueryDisplayConfig),这会生成一系列事件,如 WM_DISPLAYCHANGE,它由 WM_DISPLAYCHANGE 进行处理,如同显示器以物理方式连接/断开。 该函数封装在 CDisplayHelper::SetCurrentTopology 中。 比如,当用户点击单选菜单项目时,可以在 CMainFrame::OnMonitortopologyRange 处理程序中使用该函数。 

多显示器拓扑变更注意事项

理论上,在外置显示器中显示另一个窗口并根据拓扑变化检测对其进行控制似乎相当简单。 但是实际情况下,操作系统开始转换,完成显示器配置,以及显示内容都需要时间。 当结合使用编码器 / 解码器 / D3D / OpenGL 及其优势时,调试内置处理和 GUI 的时间将会非常复杂。 例如,如果摄像头进入视频播放、解码和编码管线,生成馈入,但是没有连接实际显示器,可能会致使系统崩溃,且难以修复。 本示例尝试重新使用切换过程中的大部分管线,但是关闭整个管线并重新启动将会更简单,因为添加显示器的 10 多秒钟的时间内可能会出现任何故障 — 甚至 HDMI 或 VGA 连接故障。

未来展望

本白皮书能够很好地处理多显示器(包括 Miracast)上的视频。 但是,当外置显示器自带扬声器时,它无法处理音频,一般情况下,Miracast 显示器是带有内置扬声器的大屏幕电视机。 我们计划在未来添加音频切换。

 

英特尔、Intel logo、英特尔标识、Core 和酷睿是英特尔在美国和/或其他国家的商标。
* 其他的名称和品牌可能是其他所有者的资产

英特尔公司© 2014 年版权所有。 所有权保留。

  • Dual Screen
  • Intel WiDi
  • Miracast
  • WindowsCodeSample
  • Développeurs
  • Microsoft Windows* 8
  • Intermédiaire
  • URL

  • Viewing all articles
    Browse latest Browse all 677

    Trending Articles



    <script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>