Android Wi-Fi Display(Miracast)介绍

2012年11月中旬,Google发布了Android 4.2。虽然它和Android 4.1同属Jelly Bean系列,但却添加了很多新的功能。其中,在显示部分,Android 4.2在Project Butter基础上再接再厉,新增了对Wi-Fi Display功能的支持。由此也导致整个显示架构发生了较大的变化。

本文首先介绍Wi-Fi Display的背景知识,然后再结合代码对Android 4.2中Wi-Fi Display的实现进行介绍。

一背景知识介绍

Wi-Fi Display经常和Miracast联系在一起。实际上,Miracast是Wi-Fi联盟(Wi-Fi Alliance)对支持Wi-Fi Display功能的设备的认证名称。通过Miracast认证的设备将在最大程度内保持对Wi-Fi Display功能的支持和兼容。由此可知,Miracast考察的就是Wi-Fi Display(本文后续将不再区分Miracast和Wi-Fi Display)。而Wi-Fi Display的核心功能就是让设备之间通过Wi-Fi无线网络来分享视音频数据。以一个简单的应用场景为例:有了Wi-Fi Display后,手机和电视机之间可以直接借助Wi-Fi,而无需硬连线(如HDMI)就可将手机中的视频投递到TV上去显示[①]。以目前智能设备的发展趋势来看,Wi-Fi Display极有可能在较短时间内帮助我们真正实现多屏互动。

从技术角度来说,Wi-Fi Display并非另起炉灶,而是充分利用了现有的Wi-Fi技术。图1所示为Wi-Fi Display中使用的其他Wi-Fi技术项。

图1 Miracast的支撑体系结构

由图1可知,Miracast依赖的Wi-Fi技术项[②]有:

  • Wi-Fi Direct,也就是Wi-Fi P2P。它支持在没有AP(Access Point)的情况下,两个Wi-Fi设备直连并通信。
  • Wi-Fi Protected Setup:用于帮助用户自动配置Wi-Fi网络、添加Wi-Fi设备等。
  • 11n/WMM/WPA2:其中,11n就是802.11n协议,它将11a和11g提供的Wi-Fi传输速率从56Mbps提升到300甚至600Mbps。WMM是Wi-Fi Multimedia的缩写,是一种针对实时视音频数据的QoS服务。而WPA2意为Wi-Fi Protected Acess第二版,主要用来给传输的数据进行加密保护。

上述的Wi-Fi技术中,绝大部分功能由硬件厂商实现。而在Android中,对Miracast来说最重要的是两个基础技术:

  • Wi-Fi Direct:该功能由Android中的WifiP2pService来管理和控制。
  • Wi-Fi Multimedia:为了支持Miracast,Android 4.2对MultiMedia系统也进行了修改。

下边我们对Miracast几个重要知识点进行介绍,首先是拓扑结构和视音频格式方面的内容。

Miracast一个重要功能就是支持Wi-Fi Direct。但它也考虑了无线网络环境中存在AP设备的情况下,设备之间的互联问题。读者可参考如图2所示的四种拓扑结构。

图2  Miracast的四种拓扑结构

图2所示内容比较简单,此处就不再详述。另外,在Wi-Fi Display规范中,还存在着Source将Video和Audio内容分别传送给不同Render Device的情况。感兴趣的读者可参考Wi-Fi Display技术规范。

另外,Miracast对所支持的视音频格式也进行了规定,如表1所示。

表1  Miracast 视音频格式支持

分辨率

17种 CEA格式,分辨率从640*480到1920*1080,帧率从24到60

29种VESA格式,分辨率从800*600到1920*1200,帧率从30到60

12种手持设备格式,分辨率从640*360到960*540,帧率从30到60

视频

H.264高清

音频

必选:LPCM 16bits,48kHz采样率,双声道

可选:

LPCM 16bits,44.1kHz采样率,双声道

Advanced Audio coding

Dolby Advanced Codec 3

最后,我们简单介绍一下Miracast的大体工作流程。Miracast以session为单位来管理两个设备之间的交互的工作,主要步骤包括(按顺序):

通过对上面背景知识的介绍,读者可以发现:

二  Android 4.2 Miracast功能实现介绍

Miracast的Android实现涉及到系统的多个模块,包括:

由于篇幅原因,本文将重点关注SurfaceFlinger和DisplayManagerService以及Miracast的动态工作流程。

2.1  SurfaceFlinger对Miracast的支持

相比前面的版本,Android 4.2中SurfaceFlinger的最大变化就是增加了一个名为DisplayDevice的抽象层。相关结构如图3所示:

图3  SurfaceFlinger家族类图

由图3可知:

作为VIRTUAL的Miracast设备是如何通过DisplayDevice这一层抽象来加入到Surface系统中来的呢?下面这段代码对理解DisplayDevice的抽象作用极为重要。如图4所示。

图4  SurfaceFlinger代码片段

由图4代码可知:

凭着上面这两点不同,我们可以推测出如图5所示的DisplayDevice的作用

图5  DisplayDevice的隔离示意图

最后再来看一下SurfaceFlinger中混屏操作的实现,代码如图6所示:

图6  SurfaceFilnger的混屏操作

由图5可知,SurfaceFlinger将遍历系统中所有的DisplayDevice来完成各自的混屏工作。

2.2  Framework对Miracast的支持

为了彻底解决多显示设备的问题,Android 4.2干脆在Framework中新增了一个名为DisplayManagerService的服务,用来统一管理系统中的显示设备。DisplayManagerService和系统其它几个服务都有交互。整体结构如图7所示。

图7  DisplayManagerService及相关类图

由图7可知:

2.3  Android中Miracast动态工作流程介绍

当用户从Settings程序中选择开启Miracast并找到匹配的Device后[③],系统将通过WifiDisplayController的requestConnect函数向匹配设备发起连接。代码如图8所示:

图8  requestConnect函数实现

图8中,最终将调用connect函数去连接指定的设备。connect函数比较中,其中最重要的是updateConnection函数,我们抽取其中部分代码来看,如图9所示:

图9  updateConnection函数片段

在图8所示的代码中,系统创建了一个RemoteDisplay,并在这个Display上监听(listen)。从注释中可知,该RemoteDisplay就是和远端Device交互的RTP/RTSP通道。而且,一旦有远端Device连接上,还会通过onDisplayConnected返回一个Surface对象。

根据前面对SurfaceFlinger的介绍,读者可以猜测出Miracast的重头好戏就在RemoteDisplay以及它返回的这个Surface上了。

确实如此,RemoteDisplay将调用MediaPlayerService的listenForRemoteDisplay函数,最终会得到一个Native的RemoteDisplay对象。相关类图如图10所示。

图10  RemoteDisplay类图

由图10可知,RemoteDisplay有三个重要成员变量:

RemoteDisplay构造函数中,WifiDisplaySource的start函数将被调用。如此,一个类型为kWhatStart的消息被加到消息队列中。该消息最终被WifiDisplaySource处理,结果是一个RTSPServer被创建。代码如图11所示:

图11  kWhatStart消息的处理结果

以后,客户端发送的数据都将通过类型为kWhatRTSPNotify的消息加入到系统中来。而这个消息的处理核心在onReceiveClientData函数中,它囊括了设备之间网络交互的所有细节。其核心代码如图12所示:

图12  onReceiveClientData核心代码示意

图12的内容较多,建议读者根据需要自行研究。

根据前面的背景知识介绍,设备之间的交互将由Session来管理。在代码中,Session的概念由WifiSource的内部类PlaybackSession来表示。先来看和其相关的类图结构,如图13所示:

图13  PlaybackSession及相关类图

由图13可知:

当双方设备准备就绪后,MediaPull会通过kWhatPull消息处理不断调用MediaSource的read函数。在SurfaceMediaSource实现的read函数中,来自SurfaceFlinger的混屏后的数据经由BufferQueue传递到MediaPull中。代码如图14所示:

图14  MediaPull和SurfaceMediaSource的代码示意

从图13可知:

那么mBufferQueue的数据来自什么地方呢?对,正是来自图4的SurfaceFlinger。

当然,PlaybackSession拿到这些数据后还需要做编码,然后才能发送给远端设备。由于篇幅关系,本文就不再讨论这些问题了。

三总结

本文对Miracast的背景知识以及Android系统中Miracast的实现进行了一番简单介绍。从笔者个人角度来看,有以下几个点值得感兴趣的读者注意:

另外,Android的进化速度非常快,尤其在几个重要的功能点上。作者在此也希望国内的手机厂商或那些感兴趣的移动互联网厂商能真正投入力量做一些更有深度和价值的研发工作。


[①]苹果公司的Air Play技术和DLNA技术也实现了类似的应用场景。对它们感兴趣的读者可参考作者的一篇博文http://blog.csdn.net/innost/article/details/7078539。

[②]其他可选技术项还有TDLS和WMM Power Save。本文不讨论这两项内容

[③]这部分内容和WifiP2pService结合紧密,感兴趣的读者可自行研究。

Android Wi-Fi Display(Miracast)介绍相关推荐

  1. Wi-Fi Display协议介绍

    Wi-Fi Display协议介绍 Wi-Fi Display协议介绍 1.WFD架构 2.Source/Sink端 3.AV数据流模型 4.Session模型 5.WFD连接拓扑结构 5.1 WiF ...

  2. Android Qcom lcd display 学习(3)

    Android Display整体架构 Android 图形组件 Android Graphic analyze display:高通display overview MDP(mobile displ ...

  3. [原创]Android Monkey测试工具使用介绍

    [原创]Android Monkey测试工具使用介绍 1 Android Monkey介绍 Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件 ...

  4. Android 热修复之DexPatch 介绍

    简介:Android 热修复之DexPatch 介绍 1. 方案介绍 为了解决Native模块上线后的问题,mPaas[1] 提供了热修复功能,实现不发布客户端apk场景下的热修复.目前Android ...

  5. Android应用的基本组件介绍

    Android应用的基本组件介绍 Activity和View Activity是Android应用中负责与用户交互的组件--大致上可以把它想象成Swing变成中的JFrame控件.不过它与JFrame ...

  6. wifi频率和zigbee干扰_浅谈ZigBee和Wi—Fi的共存和干扰

    龙源期刊网 http://www.qikan.com.cn 浅谈 ZigBee 和 Wi - Fi 的共存和干扰 作者:姜伟 朱凯 刘童 来源:<科技视界> 2013 年第 16 期 [摘 ...

  7. Android系统性能调优工具介绍

    经作者授权,发表Tieto某青年牛的一篇<程序员>大作. Android系统性能调优工具介绍 在软件开发过程中,想必很多读者都遇到过系统性能问题.而解决系统性能问题的几个主要步骤是: 测评 ...

  8. Android 高级开发 JNI NDK 介绍与使用

    Android 高级开发 JNI & NDK 介绍与使用 前言 对于没接触过的领域,即是挑战也是机遇,不仅能够提升自己的能力.还能够学习到新的技术知识 而学习新的技术的时候,最好是从头开始按照 ...

  9. 比较802.11ac(Wi‑Fi 5)和802.11ax(Wi‑Fi 6)

    MIMO 802.11ac仅在下行模式下,支持多用户MIMO. 802.11ax不仅下行链路:也在上行链路支持MIMO功能,因此多个用户可以同时上传视频. 调制方法 802.11ax具有更高的调制方案 ...

  10. android 根文件系统,Android根文件系统相关应用介绍

    我们将会针对Android根文件系统的相关目录结构等方面的问题进行一个详细的讲解,以帮助大家快速掌握这方面的知识. 我们曾经在一篇文章中为大家详细介绍过Android文件系统的一些基本概念,相信大家已 ...

最新文章

  1. django ContentType使用方法
  2. Python教程:作用域与嵌套函数
  3. Web自适应布局你需要知道的所有事儿
  4. 操作系统的线程和进程的区别_进程,线程,协程,有何区别?
  5. linux route命令的使用详解
  6. BZOJ.1007.[HNOI2008]水平可见直线(凸壳 单调栈)
  7. 无法在WEB服务器上启动调试,Web 服务器配置不正确 解决
  8. 深入认识Tigase XMPP Server(上)
  9. struts2 拦截器_Struts 2拦截器示例
  10. java rpg对战_java实现模拟RPG格斗
  11. CentOs7 中安装 guetzli 详细教程
  12. 手把手教你写一篇价值十万的软文
  13. 第6周作业3-Fibonacci数列(网络131黄宇倩)
  14. Replacing TCP Wrappers in RHEL 8
  15. 将ubuntu光盘作为安装源_从光盘安装ubuntu
  16. html5 画布绘制时钟
  17. 端游与页游之战:微端网游突出重围
  18. 系统封装Win10专业版1803
  19. C#如何实现多窗口切换
  20. 输入git stash后如何恢复代码

热门文章

  1. qq计算机无法启动程序丢失MS,Win10无法运行QQ怎么回事 QQ提示缺少MSVCR100.dll解决方法...
  2. Web前端大作业——基于HTML+CSS+JavaScript仿英雄联盟LOL游戏网站
  3. 红米手机5获取Root超级权限的步骤
  4. pr中创建镜像效果,并用渐变进行过渡
  5. 计算机怎样保存文件格式,word文档怎样保存为pdf格式
  6. php如何把word转图片
  7. 稀里糊涂的准备开始了……
  8. 基于Python的信用评分卡建模分析
  9. 苹果2014WWDC亮点之个人浅见
  10. 扇贝python骗局_北斗揭獐子岛扇贝骗局:27条采捕船数万航行数据还原轨迹