目录
1. 投屏方法
2. 投屏计划
3. DLNA协议详解
1. 投屏方法
-
依照投屏后,展现端的数据来历,能够划分红两种首要的方法:推送投屏(Screencasting)和镜像投屏(ScreenMirroring)
-
经过一个表格看看两者的差异
推送投屏 镜像投屏 数据源 发送端向展现端发送url,此后由展现端从服务器获取媒体数据。 展现端从发送端获取数据,实时展现发送端画面。 优缺点 投屏后,手机运用不受约束,能够脱离当时页面进行其他活动。但部分资源如文本等或许无法投屏。 实时展现手机画面,能够打破资源运用约束。但是手机不能脱离当时页面。 运用场景 投屏多为音视频资源,首要应用在文娱场景。如爱奇艺视频投屏等app内置投屏。 因不受资源约束,能够进行ppt展现等,首要应用在办公场景。如mac镜像等。
2. 投屏计划
-
2.1 Airplay
-
Airplay
是Apple推出的无线显示标准,因而其应用首要局限于Apple的生态之中。国内也有电视厂商完结了对Airplay
的破解,使得Apple设备能够投屏到安卓电视上。 - 支撑推送投屏和镜像投屏。
-
-
2.2 DLNA
-
DLNA(Digital Living Network Alliance)
是Sony于2003年建议的非营利性标准化安排,旨在制定在局域网内部进行多媒体文件及其信息共享的通讯协议标准。DLNA的应用规模比较广泛,涵盖数字媒体设备、数字电视、车载文娱等领域。大部分App内置投屏就是用的这个计划。 - 支撑推送投屏。
-
-
2.3 Miracast
-
Miracast
是2012年首次由WiFi Alliance发布,其底层选用了WiFi Direct
技能(点对点无线技能),因而不需求经过路由器,能够直接在两个设备之间建立P2P衔接。目前对Miracast
支撑最好的生态就是MircoSoft的Windows
系统了。 - 支撑镜像投屏。
-
-
2.4 Chromecast
- Google推出了
Chromecast
,Chromecast
是一款插在电视机HDMI接口上的无线设备,内置WIFI,能够经过WIFI与其他设备衔接以及拜访外网,类似一个迷你机顶盒。为了推行Chromecast
,Google还专门推出GoogleCastSDK
帮助APP开发者整合Chromecast
的推送功用。不过GoogleCastSDK
依靠于Google服务,在国内受到约束。 - 支撑推送投屏。
- Google推出了
-
2.5 乐播投屏
- 乐播投屏是一套投屏技能计划,据官网称市面上90%的电视已选用乐播乐联协议,App开发者只需求接入乐播发送端SDK,即可同时支撑
Airplay
,DLNA
,乐联(lelink)
等协议,兼容程度较高。但从2022年5月30日起,乐播投屏停止对旧版SDK的维护,新版SDK需求收费,按投屏日活进行收费。 - 详细内容可上官网查看:乐播
- 乐播投屏是一套投屏技能计划,据官网称市面上90%的电视已选用乐播乐联协议,App开发者只需求接入乐播发送端SDK,即可同时支撑
3. DLNA详解
DLNA(Digital Living Network Alliance)
是一个安排并不是一个协议,这个安排定义了一套由根底协议组成的标准,所以常用DLNA
指代投屏的一种完结计划。
DLNA
是目前大部分电视机支撑的投屏计划,不需求收费且有一些老练的开源结构支撑开发者接入,支撑的投屏方法为推送投屏,满足App投屏的需求。下面从几个视点详细介绍DLNA
。
-
3.1 中心协议
DLNA
依靠UPnP协议
来完结发现设备、描绘设备、操控设备;而UPnP协议
依靠于SSDP协议
来完结发现设备。下面简略了解下这两个协议。-
UPnP
UPnP
是一种网络协议,其全称为“通用即插即用协议”(Universal Plug and Play
)。它是一种根据TCP/IP
协议栈的协议。它的首要意图是让网络中的不同设备能够主动发现和衔接其他设备,然后完结网络设备间的通讯和协作。UPnP
的应用场景包含打印共享、音视频传输、远程操控等,适用于各种不同类型的网络设备,包含计算机、路由器、打印机、摄像头、音频设备等。UPnP
的中心是定义了一系列标准化的协议和接口,包含设备发现
、服务描绘
、设备操控
等,让支撑协议的设备能够主动发现和衔接其他设备。 -
SSDP
SSDP
是一种根据UDP协议的网络协议,全称为“简略服务发现协议”(Simple Service Discovery Protocol
)。它的首要意图是让网络中的设备能够主动发现和衔接其他设备,然后完结设备间的通讯和协作。SSDP
适用于各种不同类型的网络设备,应用场景包含UPnP、AirPlay等。SSDP
的中心是经过播送音讯来完结设备的发现和服务的注册。
-
-
3.2 中心人物 利用
DLNA
的体系,咱们能够衔接不同的网络设备(下面简称CP(Control Point)
)。在不同CP
间进行数据传输、展现,这个过程中就分化出不同的人物:发送操控端DMC
、接纳端DMR
、数据存储服务端DMS
。-
DMR
:Digital Media Render
顾名思义就是烘托展现媒体数据的一端,比如咱们的电视机。 -
DMS
:Digital Media Server
用于保存音视频文件的存储服务器,归于比较范的一个概念。 -
DMC
:Digital Media Controller
用于发现和操控的中间设备,发现局域网中存在的DMR
,然后把DMS
上的资源推送到DMR
上进行播映。
假如要把手机上的相片、视频文件推动到局域网内的电视上播映出来,手机就承担了
DMS
+DMC
的人物,而电视则是一个DMR
设备;而假如要在手机上操控电视播映B站的视频,手机就是
DMC
的人物,而电视就是DMR
设备。 -
-
3.3 投屏的首要步骤 了解中心协议、中心人物后,咱们接下来以投屏为例,从
DMC
的视点动身,看看DMC
如何发现、操控DMR
,完结投屏。-
发现设备 当一个新的
CP
参加一个局域网时,为了获取当时网段里都有哪些智能设备,CP
需求遵从SSDP
向默认多播IP和端口发送获取信息的恳求。恳求的格局如下:M-SEARCH * HTTP/1.1 MX: 1 //最大时刻距离数 ST: upnp:rootdevice //搜索的设备类型 MAN: "ssdp:discover" User-Agent: iOS 10.2.1 product/version Connection: close Host: 239.255.255.250 //多播地址
假如恳求成功则回来如下信息:
HTTP/1.1 200 OK Cache-control: max-age=1800 Date: Thu, 16 Feb 2017 09:09:45 GMT LOCATION: http://10.2.9.152:49152/TxMediaRenderer_desc.xml //URL for UPnP description for device ... 省掉不重要的信息 ST: upnp:rootdevice //device type
其间
LOCATION
代表一个xml
文件的链接,这个文件详细描绘了当时局域网内CP
的信息。至此投屏的第一步完结,新参加的
CP
能够发现其他CP
。 -
描绘设备 在上一步中,咱们得到了一个
xml
链接,xml
文件的内容如下:<root xmlns="urn:schemas-upnp-org:device-1-0" xmlns:dlna="urn:schemas-dlna-org:device-1-0" configId="499354"> ... <device> <deviceType>urn:schemas-upnp-org:device:MediaRenderer:1</deviceType> <friendlyName>卧室的创维盒子Q+</friendlyName> ... <dlna:X_DLNADOC xmlns:dlna="urn:schemas-dlna-org:device-1-0">DMR-1.50</dlna:X_DLNADOC> <serviceList> <service> <serviceType>urn:schemas-upnp-org:service:AVTransport:1</serviceType> <serviceId>urn:upnp-org:serviceId:AVTransport</serviceId> <SCPDURL>/AVTransport/9c443d47158b-dmr/scpd.xml</SCPDURL> ... </service> ... </serviceList> </device> <device> ... </device> </root>
-
device
device
描绘了一个CP
的信息,每个device
对应局域网内的一个CP
。device
下的deviceType
描绘了当时CP
的类型,MediaRenderer
代表当时CP
能够作为DMR
用于展现媒体资源。 -
service
service
描绘了当时CP
支撑的服务,一般会有多个。service
的SCPDURL
指向另外一个xml
文件,这个文件描绘了当时service
下支撑的操作,如暂停、播映、快进等。
至此投屏的第二步完结,咱们获取到
CP
的详细描绘,包含设备的类型、支撑的服务等。 -
device
-
操控设备 在上一步中,咱们得到了
SCPDURL
这个xml
链接,xml
文件的内容如下:<scpd xmlns="urn:schemas-upnp-org:service-1-0"> ... <actionList> <action> <name>SetAVTransportURI</name> <argumentList> <argument> <name>InstanceID</name> <direction>in</direction> <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable> </argument> <argument> <name>CurrentURI</name> <direction>in</direction> <relatedStateVariable>AVTransportURI</relatedStateVariable> </argument> <argument> <name>CurrentURIMetaData</name> <direction>in</direction> <relatedStateVariable>AVTransportURIMetaData</relatedStateVariable> </argument> </action> ... </scpd>
-
action 每个
action
代表一个操作,action
的argument
代表当时操作支撑的参数。如上面的SetAVTransportURI
就是设置媒体的url。
履行这些
action
,需求按要求建议恳求,恳求的格局能够参阅根据DLNA的移动端网络视频投屏技能初探。至此投屏的第三步完结,咱们知道目标
CP
支撑哪些操作,利用这些操作便能够完结咱们的投屏及操控。这个过程中建议投屏的CP
就是DMC
,展现媒体资源的CP
就是DMS
。 -
action 每个
-
-
3.4 相关开源结构 前面咱们了解了
DLNA
的原理,DLNA
涉及的协议还是比较复杂的,人为的处理这些恳求和响应,是比较费事的。所以社区中也有一些根据DLNA
的第三方结构可供咱们运用,如:-
Platinum 是根据
UPnP
的C++
结构。 -
cling 是根据
UPnP
的java
结构,对UPnP
进行了简略的封装,不支撑纯ipv6的网络。 -
cybergarage-upnp 是根据
UPnP
的java
结构,对UPnP
进行了简略的封装,不过代码结构不如cling
且存在getAction方法回来一向为空的问题,需求自己把jar包拉下来,然后修正其间的代码。 -
DLNA-Cast 这个是目前发现比较完善的结构,是对
cling
的进一步封装,运用体会更好,目前还有在更新迭代,推荐运用。
-
Platinum 是根据
-
3.5 安全性问题
- 投屏的时分,会把App的资源链接推送出去,或许涉及安全性。安全性问题怎么说呢?只能说防正人不防小人,即使像爱奇艺这样老练的产品,还是会被盗取视频资源,只能经过一些手法提高盗取的本钱。能够参阅这个讨论,或许能找到一些思路。
- 在投屏这块,爱奇艺是用m3u8作为资源格局的:
setAVTransportURI: currentURI=
http://cache.m.iqiyi.com/mus/8077509274258301/0d2705c1ebed7831f58740f5149ceeee/afbe8fd3d73448c9/0/20230723/b1/b5/ca0afc30d7b7c53ce52ad8398cda4b8a.m3u8?XXXXX
留意:DLNA根据
UPnP
,需求进行组内播送。假如某WIFI环境下一向搜不到设备,或许是WIFI不支撑播送,能够切换WIFI环境再测验。
参阅文章
- The difference between wireless screen sharing, screen mirroring and screencasting
- 主流无线投屏技能对比
- 根据DLNA的移动端网络视频投屏技能初探