投屏主流协议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年前的小米电视也是支持的。

    image-20241222084019996

  • 其他私有协议,比如乐播投屏这类,需要在电视上装tv端app,在手机、pc上也需要安装软件,两方都是自己的产品,就可以自己定义私有协议来传输流,tv端再进行渲染即可。这类投屏不便宜,我也找过破解版,以我粗浅的认识,一般需要两端都装配套的破解版本才行。有点麻烦。

  • Chromecast:不了解,信息来自网络

    • 技术特性:谷歌推出的无线投屏技术,需搭配小型硬件设备插入电视的HDMI接口,通过Wi-Fi与手机或电脑连接,实现视频、音乐、网页等内容的投屏。支持推送和镜像模式,具有智能化、云端化、开放性的特征。
    • 优势:用户体验接近DLNA,但更灵活智能。
  • WiDi(Intel Wireless Display):不了解,信息来自网络

    • 技术特性:由Intel公司研发的无线投屏技术,允许用户通过WiFi将电脑屏幕内容无线传输至支持WiDi的显示设备。
    • 优势:无需安装软件,使用便捷。
    • 限制:发射端设备需具备HDMI输出接口,限制了其适用范围。

pc上使用miracast投屏到电视

电视端

image-20241222102616730

image-20241222102630312

image-20241222102653016

pc端

点右下角,然后点投屏:

image-20241222102725216

image-20241222102818198

image-20241222102840910

这样基本就连上了。

miracast协议

虽然说目前对我家这个pc投屏电视看剧需求来说,有更适合我的串流方案,但miracast用途非常广泛。这里也找了些网上的资料,结合我的一点理解,来讲解下。

这边网上找到个资源:https://codezjx.com/archives/,还不错。

image-20241222103220007

简单来说,投屏发起端,能够搜索到miracast接收端,搜索到后进行连接,连接成功后,进行数据传输。

Miracast可分为发送端与接收端。Source端为Miracast音视频数据发送端,负责音视频数据的采集、编码及发送。而Sink端为Miracast业务的接收端,负责接收Source端的音视频码流并解码显示,其中通过Wi-Fi Direct技术进行连接。

image-20241222103554645

搜索阶段,要能互相发现,这部分不太了解,具体看上面发的链接吧,主要是通过广播报文实现的。

连接成功后,进行数据传输阶段,这部分采用的控制协议主要是RTSP、RTCP协议。

实时流协议(Real Time Streaming Protocol,RTSP)是一种网络应用协议,专为娱乐和通信系统的使用,以控制流媒体服务器。该协议用于创建和控制终端之间的媒体会话。媒体服务器的客户端发布VCR命令,例如播放,录制和暂停,以便于实时控制从服务器到客户端(视频点播)或从客户端到服务器(语音录音)的媒体流。

流数据本身的传输不是RTSP的任务。大多数RTSP服务器使用实时传输协议(RTP)和实时传输控制协议(RTCP)结合媒体流传输。

这么说比较抽象,我自己也尝试了抓包,结果一抓就是一下午都没抓到。

我是在windows上投屏到电视,我在本地使用wireshark进行抓包,选择的网卡是wifi这个网卡,因为我电脑是192.168.3.156,电视是192.168.3.153,肯定是走这个网卡啊:

image-20241222104319166

结果抓包,啥都没发现。网上也尝试了一些方法,都没效果。后来,我就开始尝试其他的网卡,没想到,就抓到包了,为什么会走到其他网卡呢,是什么网卡呢?

大家注意看,正常情况下,我只有下面6个网卡:

image-20241222104722637

但是,连上电视后:

image-20241222104922008

临时多了一个网卡,这个网卡看名字,就是wifi-direct,就是搜索miracast接收方时相关的服务发现协议。

通过这个临时网卡,pc和电视间直接访问对方,这估计就是wifi-direct的名字由来吧。

我们看看具体的包:

image-20241222105241933

里面主要的协议种类就是RTSP/RTCP/MPEG TS。RTSP/RTCP负责传输控制报文,MPEG TS协议,负责向电视传输具体的流,电视侧根据这些流进行渲染。

dlna协议

dlna投屏软件

之前在尝试各种投屏软件时,下载了一个叫做简单投屏的软件。我之前以为这个东西和乐播投屏差不多,下载下来后,发现好像不是那么回事,但现在大概理解了,它主打的就是通过dlna协议来投屏(只能投音视频)。

下载链接:https://meta.appinn.net/t/topic/42035 (底部百度网盘)

我之前下的是老版本,打开后,大概长这样:

image-20241223195458578

服务端发送ssdp报文

然后我们小米电视是作为dlna服务端的,需要找到如下配置:

image-20241223195703415

在电视打开dlna的情况下,其一直在向239.255.255.250:1900发送报文(多播报文),向网络内通报自身的存在。

image-20241223200208797

协议为ssdp(Simple Sever Discovery Protocol),传输协议为udp,这有一篇文章简单介绍这个的(https://www.cnblogs.com/Full--Stack/articles/11115438.html)

image-20241223200304037

我们看下具体的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

返回报文如下:

image-20241223201112705

搜索到设备后,接下来,可以选择将本地的视频或者互联网上的视频url,推送给电视。

image-20241223201253925

我测试过将本地的视频(mp4这种视频)推送过去,点击推送后,抓包显示,会发起webservice调用:

image-20241223201544786

首先的第一个调用如下:

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>

再接下来,发起另一个调用:

image-20241223201753015

我当时推送的就是这个17.mp3这样一个音频文件,但是,投屏是失败了,电视上没播出来,我就想,可能是这个url不对:http://192.169.56.1:11661/17.mp3

我和电视之间的局域网网段为:192.168.3.0/24,看来是这个投屏软件取错ip了(我电脑中有多个网卡)。

所以我先直接把这个ip对应的网卡禁掉了:

image-20241223202129065

然后重试了下,这次ip果然就ok了,视频文件也能正常在电视播放了:

image-20241223202238625

对报文的xml进行了格式化:

image-20241223202530707

简单理解

我们可以发现,dlna的客户端(比如这里的简单投屏这个软件),只是把视频文件的url传给了dlna的服务端,服务端进行播放。所以才能够做到,电视上继续播放视频,而客户端可以继续干别的。

总结

今天简单介绍了下投屏协议的种类,以及其中的miracast、dlna协议,算是对投屏的认识更清晰了,也能够更好地处理生活中的一些问题吧。

今天内容太多了,下篇再讲下串流这种方式。

posted @ 2024-12-23 20:34  三国梦回  阅读(0)  评论(0编辑  收藏  举报