Android中开发DLNA,Miracast对比

Android中开发DLNA,Miracast对比

需求是在android 9.0上实现投屏,手机,高通平台。

主流的投屏技术:Miracast,DLNA,AirPlay。

Google主推的google cast,或者说Chrome cast,受限于google账号,及需google cast认证的不方便,国内支持的设备较少(这个原因属猜测,不排除是别的可能,但是国内支持这类技术的设备很少是事实)。

 

  1. AirPlay

是苹果开发的一种无线技术,可以通过WiFi将iPhone 、iPad、iPodtouch 等iOS 设备上的包括图片、音频、视频通过无线的方式传输到支持AirPlay 设备。

AirPlay具有镜像功能,可将iPhone 或iPad 上的画面无线传输到电视上,也就是说你设备显示的是什么,电视屏幕显示就就是什么,而不仅限于图片和视频。你可以拿着iPad 来当做方向盘,然后看着大屏玩游戏。

AirPlay镜像最牛地方是它可以实现双屏游戏,让你的游戏有更多的交互。比如,电视里显示的是游戏画面,而iPad上显示的是比赛的路线图。

目前,苹果的AirPlay更多的只适用于认证过的苹果设备,目前支持这一技术的主要是苹果自己的设备包括了iPad、iPhone、Apple TV等,此外还有一些苹果授权的合作伙伴的设备,如向Pioneer和Sony提供技术授权的音响。

 

2,DLNA

DNLA,Digital Living Network Alliance,是索尼、英特尔、微软等发起的一套 PC、移动设备、消费电器之间互联互通的协议,苹果早期也加入了,后来退出单干了。

DLNA与苹果的AirPlay功能比较类似,协议也大体相同,他们都可以让手机中的媒体内容投放到电视屏幕里。

不同的是手机上的DLNA 并没有类似AirPlay的镜像功能,也没有Apple TV 所支持的双屏体游戏体验。

目前DLNA更多只是能将手机的照片和视频投送到大屏幕中。

DLNA需将手机和电视或者盒子连接同一WiFi网络,这样所有设备都能够拥有独立的IP,从而具备相互通信的基础了。

DLNA只能投影流媒体文件(音乐、图片、视屏)的播放,不支持word、PPT等非流媒体文件的投影。

但是通过DLNA实现的流媒体文件投射画质会比miracast投影的要清晰。

DLNA是基于文件的,媒体文件可能有各种各样的编码格式,播放器这端必须能够处理这么多种编码格式。通常为了比较好的播放体验,DLNA会先缓存一小段时间。

 

  1. Miracast

Miracast是由Wi-Fi联盟于2012年所制定,以Wi-Fi直连为基础的无线显示标准。

支持此标准的设备可通过无线方式分享视频画面,例如手机可通过Miracast将影片或照片直接在电视或其他装置播放。

       Miracast 有类似于AirPlay 的镜像功能,可以将手机中屏幕内容直接投放到高清电视屏幕里,这样你也可以通过电视屏幕来玩游戏了。

Miracast可以同步显示手机画面,包含了流媒体文件(音乐、图片、视屏)的播放,同时可以将其他的非流媒体文件投影到显示设备,像word、PPT等。

Miracast只需将手机和盒子或者电视的WiFi打开就可以,不必要求在同一个网络下。

Miracast是实时的,它可以实时传输源端(Source)的输出。源端任何屏幕的操作都会被传输到接收(Sink)端。如果源端是播放媒体文件,源端负责先对媒体文件解码,然后再编码成H.264的格式。接收端只需要做H.264的解码就可以了。相对DLNA,Miracast对于WiFi通路的要求要更高一些。

 

 

以上是从使用角度列出三种投屏技术的特点。当然AirPlay不在后续的选择范围内,列出只是做个类比。

 

下面从技术实现角度看在Android平台上DLNA,Miracast的实现。只是核心步骤,不涉及技术细节。

  1. DLNA

首先DLNA是一个解决方案,整合了多项技术。

在DLNA投屏的过程中,Android设备充当的角色是控制点,它初始化并配置好DMS和DMR设备之间的连接,并不直接参与真正的内容传输,内容传输由DMS和DMR完成,支持投屏播放的设备的设备类型主要为DMR。而电视或者机顶盒则扮演的是渲染设备或播放设备。

DLNA是基于Upnp协议的,但是直接依据协议原理去做开发是很困难的,通常会去借鉴一些优秀的开源框架。

简单说下什么是UPnP协议栈:

UPnP为即插即用的缩写(Universal Plug and Play)是一套网络协议。

UPnP是由“通用即插即用论坛”(UPnP Forum)推广的一套网络协议,它的目标是实现设备间网络互联。

实现Upnp协议的开源框架主要有:

Cling: 纯Java的开源项目,可以直接用源码编译成jar包来使用,尽管官方github上说已停止维护,但是应该不影响他的使用。并且近1个月内还有人提交,应该是有热心人士在维护。

Platinum:是一个跨平台的C++库,他的优点是可以编译成应用于多个平台的库,如Windows,IOS,Android,Web等。所以编译流程也会比较复杂,Android平台在使用时要用到JNI。有很多大厂在用这个sdk,如:XMBC,Iwedia,Pioneer Digital Design,MediaMonkey等。

CyberGarage:也是纯java的开源库,可以将源码编译成Android库,java库直接使用。

 

等等还有别的开源库,见底部链接,不在列举。

 

单纯做java开发,从使用复杂度看,首选CyberGarage,网上有说海思平台用的是这个sdk。如果考虑后期的跨平台,非纯Java开发,首选是Platinum,跟着大厂的选择走,应该是明智的。

 

2,Miracast

   Miracast,是Wifi alliance对支持Wifidisplay功能的设备的认证名称。

   这套api是目前多数支持投屏的智能终端都支持的,当然苹果系列除外,因为这是从Android4.2加入后,直到Android8.0一直都是系统标配,并且Android为了支持这个投屏技术,还在在显示系统模块添加了对wifidisplay,对窗口的管理。在发送、接收端设备都是经过wifi alliance认证过的情况下,即使没有wifi网络,也是可以正常连接的。

 

Miracast的使用场景也很多:

投影移动设备的内容到汽车的信息娱乐系统。

与会议室投影仪实时共享笔记本屏幕。

投射从平板电脑到高清电视的高清流和4K超高清流。

将手机、计算机、平板电脑中图片显示到更大屏幕的电视上。

支持多种音视频格式,延长移动设备的电池寿命。

Miracast也支持优质内容,如蓝光电影,电视直播,体育节目,和其他受版权保护的优质内容,让你随心所欲观看自己想看的内容。

  

   如邮件沟通,高通平台本身使用的投屏,加入了它自己闭源的代码,这块我们很难拿到,尤其在Ja310上,更没可能。而且高通的这套投屏在他自己的平台上也是选择性支持的,至少msm8610 mpq8092 msm_bronze msm8909 msm8952这些平台是被Disable的,这个可以从他的配置属性中看到定义。

 

   如果考虑使用Miracast,只能从Android8.0的代码移植,这个工作量涉及wifi模块,多媒体模块,显示模块,由于我目前对这些了解有限,不好准备评估。

   另外,找了mms8940 Android O的版本,打开wfd功能,也没能正常搜索到设备,所以对Android 8.0上的是不是所有子版本都正常,不敢肯定。

  

 

Google Cast 基本工作原理:

发送端app使用SDK,将需要投屏的媒体内容发送到谷歌的服务器,由服务器通知接收端播放(所以发送端和接收端必须都可以访问谷歌服务器才行)。接收端运行的是一个浏览器,它会根据发送端的app ID和媒体信息,载入对应的一个网页,这个网页由发送端 app 的开发者提供的,负责播放相应的媒体内容。即使接收端是 Chromecast Audio 之类只能播放音频的硬件,这个网页也是会载入并渲染的。

Google Cast 和苹果的 AirPlay 或者DLNA 的不同之处在于,一是依赖谷歌的服务器,也就是说必须连接到Internet 才可以用,如果只有一个局域网是不行的。二是后两个的接收端播放器接收端本身提供的,开发者只需要提供要播放的内容就可以,但是Google Cast 则是需要提供自己的接收端 app,这样的好处是开发者可以高度定制(比如可以定制UI,或者加入弹幕、歌词滚动、音乐可视化之类复杂功能),虽然接收端往往运行的并不是Android这样的开放操作系统,但是因为接收端 app的本质是网页,所以开发难度并不高。

 

ChromeCast和Google Cast

从Google Cast的官网说明我们可以看到Google Cast的作用在于把小屏幕(诸如手机、平板、笔记本)的内容通过无线(WIFI)方式发送到大屏设备(google TV、chromeCast)进行播放,概括一下也即提供小屏设备到大屏设备的多屏互动功能。Google Cast所做的便在于基于不同的平台提供提供为应用开支这种功能的SDK,这些平台即有发送端的也有接收端的,发送端的有IOS、android、chrome浏览器,接收端的有google TV, chromeCast等,可以说这一套解决方案是比较大而全的(就其涵盖的平台)。

 

而chromeCast其实是对Google Cast这套机制的具体实现,这种实现的特点是接收端的chromeCast dongle是google自己提供的,开发者的负担只局限与发送端平台的应用开发,当然这种发送端的灵活性也是局限于google所提供的Google Cast API的。

总结一下Google Cast 和 Chrome Cast的关系,其实就是Google Cast提供了一套进行设备之间互联互通的API,而chromeCast技术则是对这一套API的具体实现,这种实现的优点在于为应用开发者提供了使用Google Cast API进行开发的灵活性(当然这也可以认为是该技术不能支持所有app的局限性)。

 

 

参考链接:

https://github.com/plutinosoft/Platinum

基于Platinum库的DMR实现(android)

http://www.aiuxian.com/article/p-142953.html

DLNA主流开源库介绍

https://elinux.org/DLNA_Open_Source_Projects

DLNA的开源库主要是UPNP协议的实现,下面是UPNP主流开源库的官网及SDK地址

1、platinum

官网: http://www.plutinosoft.com/platinum/

SDK:https://sourceforge.net/projects/platinum/files/platinum/

 

2、cling

官网: http://4thline.org/projects/cling/

SDK:https://github.com/4thline/cling

 

3、cybergarage

 

官网:http://www.cybergarage.org/

SDK:https://github.com/cybergarage/

 

 

4、libupnp

官网:http://pupnp.sourceforge.net/

SDk:https://sourceforge.net/projects/pupnp/files/

 

5、GUPNP

官网:https://wiki.gnome.org/Projects/GUPnP

SDK:http://download.gnome.org/sources/

 

6、ushare

官网:http://ushare.geexbox.org/

SDK:http://ushare.geexbox.org/releases/ushare-1.1a.tar.bz2

 

https://blog.csdn.net/gebitan505/article/details/19497545

https://blog.csdn.net/bao_jinyu/article/category/1149905

https://blog.csdn.net/sunmc1204953974/article/details/39611357

https://www.cnblogs.com/lijunamneg/archive/2013/08/14/3256722.html

https://www.jianshu.com/p/e3d5c7e20923

https://www.jianshu.com/p/19934892a235

https://www.jianshu.com/p/5a260182cc82

https://github.com/4thline/cling

https://blog.csdn.net/white_cloth/article/details/52870233

https://www.jianshu.com/p/bce3f4047a65

https://www.awind.com.cn/news/shownews.php?id=86

 

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值