投屏主流协议miracast、dlna简介
简介
现在想在电视上看剧,还是有点麻烦的,一般就算你有爱优腾的vip会员,没有电视上的vip会员,也没法投屏到电视上看;想把手机上的资源投屏到电视,一般也会被限制。
个人目前习惯的解决方式是,在电脑上找资源,想办法投屏到电视上看,核心需求就是:pc(windows)投屏到电视(基本是安卓)。
在讲解本篇涉及的串流技术之前,我尝试了不少投屏方式:
-
直接用windows电脑上的投屏功能,windows自带的这种投屏方式基于miracast协议,windows是作为miracst协议的客户端。服务端是谁呢,一般需要是安卓设备,比如电视这种,比如我家里是小米电视,就可以作为miracst服务端。
这种的问题在于,每次很麻烦,必须先在电视上找到投屏相关功能,然后打开,等待客户端连接,这样呢,服务端就算就绪了;
接下来,再来windows pc上搜索miracast的服务端,然后搜索也要个10多秒这种,有时候快有时候慢。搜出来之后,就是连接,连接又要花个10多秒。
这种方式的问题是每次很繁琐,不爱用,所以我们再看看其他办法。
-
各种投屏软件,这个的问题是,我没找到开源的软件,基本是商业的,要收钱,比如什么乐播投屏啥的,还不便宜;即使是破解版,资源也不好找
-
硬件类,自行在购物网站搜索:投屏,我没试过,网上评论貌似也一般
投屏协议
-
miracast协议,官方介绍:https://www.wi-fi.org/discover-wi-fi/miracast
Miracast是由Wi-Fi 联盟创建的无线通信标准,旨在将视频和声音从设备(例如笔记本电脑或智能手机)传输到显示接收器(例如电视、显示器或投影仪)。
Wi-Fi CERTIFIED Miracast™ 可在 Miracast® 设备之间无缝显示多媒体内容。Miracast 允许用户在 Wi-Fi 设备之间无线共享多媒体,包括高分辨率图片和高清 (HD) 视频内容,即使没有 Wi-Fi 网络也一样。
Miracast:
- 将移动设备上的内容投射到汽车信息娱乐系统
- 与会议室投影仪实时共享笔记本电脑屏幕
- 将高清和 4K 超高清电影从平板电脑传输到高清电视
- 将智能手机、电脑或平板电脑上的图片显示到大屏幕电视上
这种协议,一般效果就类似于屏幕镜像,pc上是啥,电视上就是啥,不局限于视频这类文件。
-
dlna协议,其实大家用的很多,这种协议只能投屏视频(mp4等格式)、音乐(mp3)、图片之类的,大家平时手机爱优腾、b站这类视频软件里的投屏,就是这种协议,这种投屏和上面的miracast主要的不同点在于,你在视频软件里投屏之后,你还可以干别的,切到别的app后,电视上的视频还在继续播放。
网上的介绍:
DNLA(Digital Living Network Alliance)是索尼、英特尔、微软等发起的一套 PC、移动设备、消费电器之间互联互通的协议。DLNA只能将手机上的流媒体文件投送到大屏幕中,不支持不支持word、PPT等非流媒体文件的传送
之前觉得挺神奇的,为了写这次文章,研究了下,发现也挺有意思的。后面讲解。
-
airplay,AirPlay协议是苹果开发的一种无线技术,可以通过WiFi将iPhone、iPad等iOS设备上的音视频、图片通过无线方式传输到支持AirPlay的 设备。随着AirPlay协议逐步普及,国内越来越多网络机顶盒,智能电视都集成了AirPlay。
这种一般就是,苹果手机里,一般有个屏幕镜像功能,这种的效果是,手机上是啥,电脑上就是啥,不能和dlna那样,切走去干别的事,和miracast类似的,可以理解成苹果自己搞的,适用于苹果系产品的投屏协议。
手机发起投屏呢,会去搜索支持airplay协议的设备,现在呢,一般不太老的智能电视都是支持的吧,比如我这个20年前的小米电视也是支持的。
-
其他私有协议,比如乐播投屏这类,需要在电视上装tv端app,在手机、pc上也需要安装软件,两方都是自己的产品,就可以自己定义私有协议来传输流,tv端再进行渲染即可。这类投屏不便宜,我也找过破解版,以我粗浅的认识,一般需要两端都装配套的破解版本才行。有点麻烦。
-
Chromecast:不了解,信息来自网络
- 技术特性:谷歌推出的无线投屏技术,需搭配小型硬件设备插入电视的HDMI接口,通过Wi-Fi与手机或电脑连接,实现视频、音乐、网页等内容的投屏。支持推送和镜像模式,具有智能化、云端化、开放性的特征。
- 优势:用户体验接近DLNA,但更灵活智能。
-
WiDi(Intel Wireless Display):不了解,信息来自网络
- 技术特性:由Intel公司研发的无线投屏技术,允许用户通过WiFi将电脑屏幕内容无线传输至支持WiDi的显示设备。
- 优势:无需安装软件,使用便捷。
- 限制:发射端设备需具备HDMI输出接口,限制了其适用范围。
pc上使用miracast投屏到电视
电视端
pc端
点右下角,然后点投屏:
这样基本就连上了。
miracast协议
虽然说目前对我家这个pc投屏电视看剧需求来说,有更适合我的串流方案,但miracast用途非常广泛。这里也找了些网上的资料,结合我的一点理解,来讲解下。
这边网上找到个资源:https://codezjx.com/archives/,还不错。
简单来说,投屏发起端,能够搜索到miracast接收端,搜索到后进行连接,连接成功后,进行数据传输。
Miracast可分为发送端与接收端。Source端为Miracast音视频数据发送端,负责音视频数据的采集、编码及发送。而Sink端为Miracast业务的接收端,负责接收Source端的音视频码流并解码显示,其中通过Wi-Fi Direct技术进行连接。
搜索阶段,要能互相发现,这部分不太了解,具体看上面发的链接吧,主要是通过广播报文实现的。
连接成功后,进行数据传输阶段,这部分采用的控制协议主要是RTSP、RTCP协议。
实时流协议
(Real Time Streaming Protocol,RTSP)
是一种网络应用协议,专为娱乐和通信系统的使用,以控制流媒体服务器。该协议用于创建和控制终端之间的媒体会话。媒体服务器的客户端发布VCR命令,例如播放,录制和暂停,以便于实时控制从服务器到客户端(视频点播)或从客户端到服务器(语音录音)的媒体流。流数据本身的传输不是RTSP的任务。大多数RTSP服务器使用实时传输协议(RTP)和实时传输控制协议(RTCP)结合媒体流传输。
这么说比较抽象,我自己也尝试了抓包,结果一抓就是一下午都没抓到。
我是在windows上投屏到电视,我在本地使用wireshark进行抓包,选择的网卡是wifi这个网卡,因为我电脑是192.168.3.156,电视是192.168.3.153,肯定是走这个网卡啊:
结果抓包,啥都没发现。网上也尝试了一些方法,都没效果。后来,我就开始尝试其他的网卡,没想到,就抓到包了,为什么会走到其他网卡呢,是什么网卡呢?
大家注意看,正常情况下,我只有下面6个网卡:
但是,连上电视后:
临时多了一个网卡,这个网卡看名字,就是wifi-direct,就是搜索miracast接收方时相关的服务发现协议。
通过这个临时网卡,pc和电视间直接访问对方,这估计就是wifi-direct的名字由来吧。
我们看看具体的包:
里面主要的协议种类就是RTSP/RTCP/MPEG TS。RTSP/RTCP负责传输控制报文,MPEG TS协议,负责向电视传输具体的流,电视侧根据这些流进行渲染。
dlna协议
dlna投屏软件
之前在尝试各种投屏软件时,下载了一个叫做简单投屏的软件。我之前以为这个东西和乐播投屏差不多,下载下来后,发现好像不是那么回事,但现在大概理解了,它主打的就是通过dlna协议来投屏(只能投音视频)。
下载链接:https://meta.appinn.net/t/topic/42035 (底部百度网盘)
我之前下的是老版本,打开后,大概长这样:
服务端发送ssdp报文
然后我们小米电视是作为dlna服务端的,需要找到如下配置:
在电视打开dlna的情况下,其一直在向239.255.255.250:1900发送报文(多播报文),向网络内通报自身的存在。
协议为ssdp(Simple Sever Discovery Protocol),传输协议为udp,这有一篇文章简单介绍这个的(https://www.cnblogs.com/Full--Stack/articles/11115438.html)
我们看下具体的ssdp报文:
NOTIFY * HTTP/1.1
HOST: 239.255.255.250:1900
CACHE-CONTROL: max-age=66
LOCATION: http://192.168.3.162:49152/description.xml
OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01
01-NLS: a6af788c-1dd1-11b2-9ce0-xxxxxxx
NT: urn:mi-com:service:RController:1
NTS: ssdp:alive
SERVER: Linux/3.14.29 HTTP/1.0
X-User-Agent: redsonic
USN: uuid:xxxxx-5638-722e-942b-xxxxx::urn:mi-com:service:RController:1
重点关注上述的location那行,猜测是小米电视自身暴露出来的url:
LOCATION: http://192.168.3.162:49152/description.xml
客户端推送视频url给电视
在接下来,我们点击软件的搜索(搜索dlna设备),此时,就会调用上述url:
GET /description.xml HTTP/1.1
Host: 192.168.3.162:49152
Content-Type: text/xml; charset="utf-8"
Content-Length: 0
返回报文如下:
搜索到设备后,接下来,可以选择将本地的视频或者互联网上的视频url,推送给电视。
我测试过将本地的视频(mp4这种视频)推送过去,点击推送后,抓包显示,会发起webservice调用:
首先的第一个调用如下:
POST /_urn:schemas-upnp-org:service:AVTransport_control HTTP/1.1
Host: 192.168.3.153:49152
SOAPAction: "urn:schemas-upnp-org:service:AVTransport:1#Stop"
Content-Type: text/xml; charset="utf-8"
Content-Length: 288
<?xml version="1.0" encoding="UTF-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:Stop xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID></u:Stop></s:Body></s:Envelope>
响应:
HTTP/1.1 200 OK
CONTENT-LENGTH: 243
CONTENT-TYPE: text/xml; charset="utf-8"
DATE: Sun, 22 Dec 2024 00:17:06 GMT
EXT:
SERVER: Linux/3.14.29 HTTP/1.0
X-User-Agent: redsonic
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body>
<u:StopResponse xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"></u:StopResponse>
</s:Body></s:Envelope>
再接下来,发起另一个调用:
我当时推送的就是这个17.mp3这样一个音频文件,但是,投屏是失败了,电视上没播出来,我就想,可能是这个url不对:http://192.169.56.1:11661/17.mp3
我和电视之间的局域网网段为:192.168.3.0/24,看来是这个投屏软件取错ip了(我电脑中有多个网卡)。
所以我先直接把这个ip对应的网卡禁掉了:
然后重试了下,这次ip果然就ok了,视频文件也能正常在电视播放了:
对报文的xml进行了格式化:
简单理解
我们可以发现,dlna的客户端(比如这里的简单投屏这个软件),只是把视频文件的url传给了dlna的服务端,服务端进行播放。所以才能够做到,电视上继续播放视频,而客户端可以继续干别的。
总结
今天简单介绍了下投屏协议的种类,以及其中的miracast、dlna协议,算是对投屏的认识更清晰了,也能够更好地处理生活中的一些问题吧。
今天内容太多了,下篇再讲下串流这种方式。