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

Android中开发DLNA,Miracast对比相关推荐

  1. 在android系统中开发DLNA

     内容目录 Part 1. 前言:DLNA简介 Part 2. 主体:DLNA在android中的开发流程 Part 2. 关于DLNA的其他知识 Part 1. 前言:DLNA简介 DLNA,D ...

  2. Android中开发需要的高效助推的命令总结

    原文:http://blog.csdn.net/jiangwei0910410003/article/details/73385819 ​Android 开发中我们有时候需要借助一些命令帮助更好的高效 ...

  3. Android中开发习惯

    我觉得首先是命名规范.命名规范这种东西每个人都有自己的风格,Google 也有自己的一套规范(多看看 Android 系统源码就明白了).好的规范可以有效地提高代码的可读性,对于将来接手代码的小伙伴也 ...

  4. android中AsyncTask和Handler对比

    1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可 ...

  5. android 读卡器监听,在Android中开发智能卡读卡器

    我们开发了一个带有微控制器的原型板,它可以与SmartCard通信(它可以读取ATR,发出和读取对APDU命令的响应等).现在我想将这个硬件与Android手机或平板电脑一起使用.我们的电路板具有US ...

  6. Android Wi-Fi Display(Miracast)介绍

    Android Wi-Fi Display(Miracast)介绍 2012年11月中旬,Google发布了Android 4.2.虽然它和Android 4.1同属Jelly Bean系列,但却添加 ...

  7. Android相机开发那些坑

    最近我负责开发了一个跟Android相机有关的需求,新功能允许用户使用手机摄像头,快速拍摄特定尺寸(1:1或3:4)的照片,并支持在拍摄出的照片上做贴纸相关的操作.由于之前没有接触过Android相机 ...

  8. android nfc ndef mifareclassic,Android NFC开发-实践篇

    Android NFC开发-实践篇 https://blog..net/_GYG/article/details/72899417 在Android NFC开发-理论篇中,我们了解了在Android中 ...

  9. Android NFC开发-实践篇

    Android NFC开发-实践篇 在Android NFC开发-理论篇中,我们了解了在Android中开发NFC的一些理论知识,这篇我们继续应用我们上一篇学到的知识,实现对NDEF格式标签和Mifa ...

最新文章

  1. mysql主键始终从小到大_Mysql从入门到入神之(四)B+树索引
  2. python 一个文本是否包含另一字符串 in find是区分大小写的
  3. 在配置文件(.settings、.config)中存储自定义对象
  4. 【PHP-FPM】配置,优化性能
  5. BZOJ3476 : [Usaco2014 Mar]The Lazy Cow
  6. Python reload() 函数
  7. 【OS学习笔记】三十 保护模式九:段页式内存管理机制概述
  8. android 属性动画还原,属性动画和补间动画
  9. 基于postman的api自动化测试实践
  10. border做三角形
  11. Linux服务器上安装node.js
  12. jpg、jpeg、png... 的区别
  13. [源码解析] TensorFlow 分布式环境(6) --- Master 动态逻辑
  14. 容量治理-扩容、限流和降级
  15. android手机内存什么东西,清理手机必须要知道,这些文件夹里都装了些什么?...
  16. 鼠标跟随flash代码_Flash动画设计之 MTV实例创作《不说再见》
  17. TPshop商城——windows部署(保姆级)
  18. 【地图】高德静态地图(页面展示和导出Word)
  19. 【Python】小甲鱼Python学习总结——代码版
  20. 【蓝桥杯选拔赛真题50】Scratch小猫跑步 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解

热门文章

  1. 什么是nginx?什么是nginx的反向代理和正向代理又是什么?nginx反向代理的作用?
  2. R语言空间数据分析学习笔记1——读取矢量数据并可视化
  3. 3.进制——进制转换和计算机存储单位
  4. 如何使得pytorch的代码可以复现
  5. 吉林银行采用ManageEngine保障数据中心畅通运行
  6. 企业为什么需要文档管理
  7. 我的世界最后战线怎么下java_我的世界最后战线整合包
  8. Python编程从入门到实践-读书心得
  9. 为什么json转化有斜杠_json 带斜杠时如何解析的实现
  10. TDOA定位中的广义相关(Generalized Cross Correlation)算法仿真