Android Wi-Fi Display(Miracast)介绍

上传人:无*** 文档编号:161669829 上传时间:2022-10-14 格式:DOC 页数:19 大小:1.28MB
收藏 版权申诉 举报 下载
Android Wi-Fi Display(Miracast)介绍_第1页
第1页 / 共19页
Android Wi-Fi Display(Miracast)介绍_第2页
第2页 / 共19页
Android Wi-Fi Display(Miracast)介绍_第3页
第3页 / 共19页
资源描述:

《Android Wi-Fi Display(Miracast)介绍》由会员分享,可在线阅读,更多相关《Android Wi-Fi Display(Miracast)介绍(19页珍藏版)》请在装配图网上搜索。

1、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联系在一起。实

2、际上,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上去显

3、示。以目前智能设备的发展趋势来看,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设备等。 1

4、1n/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:为了支持Mira

5、cast,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技术规范。另外,M

6、iracast对所支持的视音频格式也进行了规定,如表1所示。表1 Miracast视音频格式支持分辨率17种 CEA格式,分辨率从640*480到1920*1080,帧率从24到6029种VESA格式,分辨率从800*600到1920*1200,帧率从30到6012种手持设备格式,分辨率从640*360到960*540,帧率从30到60视频H.264高清音频必选:LPCM 16bits,48kHz采样率,双声道可选:LPCM 16bits,44.1kHz采样率,双声道Advanced Audio codingDolby Advanced Codec 3最后,我们简单介绍一下Miracast的大

7、体工作流程。Miracast以session为单位来管理两个设备之间的交互的工作,主要步骤包括(按顺序): Device Discovery:通过Wi-Fi P2P来查找附近的支持Wi-Fi P2P的设备。 Device Selection:当设备A发现设备B后,A设备需要提示用户。用户可根据需要选择是否和设备B配对。 Connection Setup:Source和Display设备之间通过Wi-Fi P2P建立连接。根据Wi-Fi Direct技术规范,这个步骤包括建立一个Group Owner和一个Client。此后,这两个设备将建立一个TCP连接,同时一个用于RTSP协议的端口将被创建

8、用于后续的Session管理和控制工作。 Capability Negotiation:在正式传输视音频数据前,Source和Display设备需要交换一些Miracast参数信息,例如双方所支持的视音频格式等。二者协商成功后,才能继续后面的流程。 Session Establishment and streaming:上一步工作完成后,Source和Display设备将建立一个Miracast Session。而后就可以开始传输视音频数据。Source端的视音频数据将经由MPEG2TS编码后通过RTP协议传给Display设备。Display设备将解码收到的数据,并最终显示出来。 User

9、Input back channel setup:这是一个可选步骤。主要用于在传输过程中处理用户发起的一些控制操作。这些控制数据将通过TCP在Source和Display设备之间传递。 Payload Control:传输过程中,设备可根据无线信号的强弱,甚至设备的电量状况来动态调整传输数据和格式。可调整的内容包括压缩率,视音频格式,分辨率等内容。 Session teardown:停止整个Session。通过对上面背景知识的介绍,读者可以发现: Miracast本质就是一个基于Wi-Fi的网络应用。这个应用包括服务端和客户端。 服务端和客户端必须支持RTP/RTSP等网络协议和相应的编解码技

10、术。 二 Android 4.2 Miracast功能实现介绍Miracast的Android实现涉及到系统的多个模块,包括: MediaPlayerService及相关模块:原因很明显,因为Miracast本身就牵扯到RTP/RTSP及相应的编解码技术。 SurfaceFlinger及相关模块:SurfaceFlinger的作用是将各层UI数据混屏并投递到显示设备中去显示。现在,SurfaceFlinger将支持多个显示设备。而支持Miracast的远端设备也做为一个独立的显示设备存在于系统中。 WindowManagerService及相关模块:WindowManagerService用于

11、管理系统中各个UI层的位置和属性。由于并非所有的UI层都会通过Miracast投递到远端设备上。例如手机中的视频可投递到远端设备上去显示,但假如在播放过程中,突然弹出一个密码输入框(可能是某个后台应用程序发起的),则这个密码输入框就不能投递到远端设备上去显示。所以,WindowManagerService也需要修改以适应Miracast的需要。 DisplayManagerService及相关模块:DisplayManagerService服务是Android 4.2新增的,用于管理系统中所有的Display设备。由于篇幅原因,本文将重点关注SurfaceFlinger和DisplayMana

12、gerService以及Miracast的动态工作流程。2.1 SurfaceFlinger对Miracast的支持相比前面的版本,Android 4.2中SurfaceFlinger的最大变化就是增加了一个名为DisplayDevice的抽象层。相关结构如图3所示:图3 SurfaceFlinger家族类图由图3可知: Surface系统定义了一个DisplayType的枚举,其中有代表手机屏幕的DISPLAY_PRIMARY和代表HDMI等外接设备的DISPLAY_EXTERNAL。比较有意思的是,作为Wi-Fi Display,它的设备类型是DISPLAY_VIRTUAL。 再来看Sur

13、faceFlinger类,其内部有一个名为mDisplays的变量,它保存了系统中当前所有的显示设备(DisplayDevice)。另外,SurfaceFlinger通过mCurrentState和mDrawingState来控制显示层的状态。其中,mDrawingState用来控制当前正在绘制的显示层的状态,mCurrentState表示当前所有显示层的状态。有这两种State显示层的原因是不论是Miracast还是HDMI设备,其在系统中存在的时间是不确定的。例如用户可以随时选择连接一个Miracast显示设备。为了不破坏当前正在显示的内容,这个新显示设备的一些信息将保存到CurrentS

14、tate中。等到SurfaceFlinger下次混屏前再集中处理。 mCurrentState和mDrawingState的类型都是SurfaceFlinger的内部类State。由图3可知,State首先通过layerSortedByZ变量保存了一个按Z轴排序的显示层数组(在Android中,显示层的基类是LayerBase),另外还通过displays变量保存了每个显示层对应的DisplayDeviceState。 DisplayDeviceState的作用是保存对应显示层的DisplayDevice的属性以及一个ISurfaceTexure接口。这个接口最终将传递给DisplayDevi

15、ce。 DisplayDevice代表显示设备,它有两个重要的变量,一个是mFrameBufferSurface和mNativeWindow。mFrameBufferSurace是FrameBufferSurface类型,当显示设备不属于VIRTUAL类型的话,则该变量不为空。对于Miracast来说,显示数据是通过网络传递给真正的显示设备的,所有在Source端的SurfaceFlinger来说,就不存在FrameBuffer。故当设备为VIRTUAL时,其对应的mFrameBufferSurface就为空。而ANativeWindow是Android显示系统的老员工了。该结构体在多媒体的视

16、频I/O、OpenGL ES等地方用得较多。而在普通的UI绘制中,ISurfaceTexture接口用得较多。不过早在Android 2.3,Google开发人员就通过函数指针将ANativeWindow的各项操作和ISurfaceTexture接口统一起来。作为VIRTUAL的Miracast设备是如何通过DisplayDevice这一层抽象来加入到Surface系统中来的呢?下面这段代码对理解DisplayDevice的抽象作用极为重要。如图4所示。图4 SurfaceFlinger代码片段由图4代码可知: 对于非Virtual设备,DisplayDevice的FrameBufferSur

17、face不为空。而且SurfaceTextureClient的构造参数来自于FrameBufferSurface的getBufferQueue函数。 如果是Virtual设备,SurfaceTextureClient直接使用了State信息中携带的surface变量。凭着上面这两点不同,我们可以推测出如图5所示的DisplayDevice的作用图5 DisplayDevice的隔离示意图最后再来看一下SurfaceFlinger中混屏操作的实现,代码如图6所示:图6 SurfaceFilnger的混屏操作由图5可知,SurfaceFlinger将遍历系统中所有的DisplayDevice来完成

18、各自的混屏工作。2.2 Framework对Miracast的支持为了彻底解决多显示设备的问题,Android 4.2干脆在Framework中新增了一个名为DisplayManagerService的服务,用来统一管理系统中的显示设备。DisplayManagerService和系统其它几个服务都有交互。整体结构如图7所示。图7 DisplayManagerService及相关类图由图7可知: DisplayManagerService主要实现了IDisplayManager接口。这个接口的大部分函数都和Wi-Fi Display操作相关。 另外,DisplayManagerService和

19、WindowManagerService交互紧密。因为WindowManagerService管理系统所有UI显示,包括属性,Z轴位置等等。而且,WindowManagerService是系统内部和SurfaceFlinger交互的重要通道。 DisplayManagerService通过mDisplayAdapters来和DisplayDevice交互。每一个DisplayDevice都对应有一个DisplayAdapter。 系统定义了四种DisplayAdapter。HeadlessDisplayAdapter和OverlayDisplayAdapter针对的都是Fake设备。其中Ove

20、rlayDisplay用于帮助开发者模拟多屏幕之用。LocalDisplayAdapter代表主屏幕,而WifiDisplayAdapter代表Wi-Fi Display。2.3 Android中Miracast动态工作流程介绍当用户从Settings程序中选择开启Miracast并找到匹配的Device后,系统将通过WifiDisplayController的requestConnect函数向匹配设备发起连接。代码如图8所示:图8 requestConnect函数实现图8中,最终将调用connect函数去连接指定的设备。connect函数比较中,其中最重要的是updateConnection

21、函数,我们抽取其中部分代码来看,如图9所示:图9 updateConnection函数片段在图8所示的代码中,系统创建了一个RemoteDisplay,并在这个Display上监听(listen)。从注释中可知,该RemoteDisplay就是和远端Device交互的RTP/RTSP通道。而且,一旦有远端Device连接上,还会通过onDisplayConnected返回一个Surface对象。根据前面对SurfaceFlinger的介绍,读者可以猜测出Miracast的重头好戏就在RemoteDisplay以及它返回的这个Surface上了。确实如此,RemoteDisplay将调用Medi

22、aPlayerService的listenForRemoteDisplay函数,最终会得到一个Native的RemoteDisplay对象。相关类图如图10所示。图10 RemoteDisplay类图由图10可知,RemoteDisplay有三个重要成员变量: mLooper,指向一个ALooper对象。这表明RemoteDisplay是一个基于消息派发和处理的系统。 mNetSession指向一个ANetWorkSession对象。从它的API来看,ANetworkSession提供大部分的网络操作。 mSource指向一个WifiDisplaySource对象。它从AHandler派生,故

23、它就是mLooper中消息的处理者。注意,图中的M1、M3、M5等都是Wi-Fi Display技术规范中指定的消息名。RemoteDisplay构造函数中,WifiDisplaySource的start函数将被调用。如此,一个类型为kWhatStart的消息被加到消息队列中。该消息最终被WifiDisplaySource处理,结果是一个RTSPServer被创建。代码如图11所示:图11 kWhatStart消息的处理结果以后,客户端发送的数据都将通过类型为kWhatRTSPNotify的消息加入到系统中来。而这个消息的处理核心在onReceiveClientData函数中,它囊括了设备之间

24、网络交互的所有细节。其核心代码如图12所示:图12 onReceiveClientData核心代码示意图12的内容较多,建议读者根据需要自行研究。根据前面的背景知识介绍,设备之间的交互将由Session来管理。在代码中,Session的概念由WifiSource的内部类PlaybackSession来表示。先来看和其相关的类图结构,如图13所示:图13 PlaybackSession及相关类图由图13可知: PlaybackSession及其内部类Track都从AHandler派生。故它们的工作也依赖于消息循环和处理。Track代表视频流或音频流。 Track内部通过mMediaPull变量指

25、向一个MediaPull对象。而MediaPull对象则保存了一个MediaSource对象。在PlaybackSession中,此MediaSource的真正类型为SurfaceMediaSource。它表明该Media的源来自Surface。 BufferQueue从ISurfaceTexure中派生,根据前面对SurfaceFlinger的介绍,它就是SurfaceFlinger代码示例中代表虚拟设备的State的surface变量。当双方设备准备就绪后,MediaPull会通过kWhatPull消息处理不断调用MediaSource的read函数。在SurfaceMediaSource

26、实现的read函数中,来自SurfaceFlinger的混屏后的数据经由BufferQueue传递到MediaPull中。代码如图14所示:图14 MediaPull和SurfaceMediaSource的代码示意从图13可知: 左图中,MediaPull通过kWhatPull消息不断调用MediaSource的read函数。 右图中,SurfaceMediaSource的read函数由通过mBufferQueue来读取数据。那么mBufferQueue的数据来自什么地方呢?对,正是来自图4的SurfaceFlinger。当然,PlaybackSession拿到这些数据后还需要做编码,然后才能

27、发送给远端设备。由于篇幅关系,本文就不再讨论这些问题了。三总结本文对Miracast的背景知识以及Android系统中Miracast的实现进行了一番简单介绍。从笔者个人角度来看,有以下几个点值得感兴趣的读者注意: 一定要结合Wi-Fi的相关协议去理解Miracast。重点关注的协议包括Wi-Fi P2p和WMM。 Android Miracast的实现中,需要重点理解SurfaceFlinger和RemoteDisplay模块。这部分的实现不仅代码量大,而且类之间,以及线程之间关系复杂。 其他需要注意的点就是DisplayManagerService及相关模块。这部分内容在SDK中有相关API。应用开发者应关注这些新API是否能帮助自己开发出更有新意的应用程序。另外,Android的进化速度非常快,尤其在几个重要的功能点上。作者在此也希望国内的手机厂商或那些感兴趣的移动互联网厂商能真正投入力量做一些更有深度和价值的研发工作。 苹果公司的Air Play技术和DLNA技术也实现了类似的应用场景。对它们感兴趣的读者可参考作者的一篇博文其他可选技术项还有TDLS和WMM Power Save。本文不讨论这两项内容这部分内容和WifiP2pService结合紧密,感兴趣的读者可自行研究。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!