音视频处理(五):DLNA投屏技术详解

文章目录

一、前言

当下应用投屏技术使用很广泛,比如手机投屏到电视,大屏观看提升观看体验,本文将详细介绍DLNA的技术实现,投屏有两种路线(不同应用场景):

  • 屏幕镜像

整个屏幕截取投屏,实时共享屏幕。

  • 视频推送

仅推送视频流程,手机仍然可以干其他事不冲突。

1.1 投屏技术对比

下表对比三种主流投屏协议的核心特性,当然有很多视频应用厂商实现私有协议投屏如bilibili、爱奇艺等,这里不做介绍。

特性维度 DLNA AirPlay(苹果) Miracast
技术类型 媒体推送(URL方式) 推送与屏幕镜像双模式 纯屏幕镜像
核心原理 推送媒体URL,接收端直接播放 实时编码传输音视频流 实时捕获、编码并传输屏幕内容
生态开放性 开放标准,多厂商支持 封闭生态,苹果设备为主 开放标准,安卓/Win设备
典型延迟 较低(非实时传输) 低(约150ms) 中等(依赖网络条件)
网络要求 同一局域网即可 需WiFi网络 支持Wi-Fi Direct点对点
主要优势 跨平台兼容性好,功耗低 体验流畅,生态整合度高 无需路由器,实时同屏
主要局限 不支持屏幕镜像,交互性弱 限于苹果生态,设备成本高 功耗较高,兼容性问题
  • 技术差异解析
  1. DLNA采用"推流"模式:它仅将媒体文件的URL地址发送给渲染器,由渲染器直接获取并播放内容。这种方式效率高、功耗低,但不能传输设备本身的屏幕界面。
  2. AirPlay的混合架构:苹果AirPlay既支持类似DLNA的媒体推送,也支持实时屏幕镜像。在镜像模式下,它会将屏幕内容实时编码为H.264视频流,通过低延迟传输技术发送给接收端。AirPlay于DLNA类似,例如两种都是基于组播实现的设备发现,只不过DLNA基于SSDP(简单服务发现协议),而AirPlay基于mDNS(multicast DNS),甚至苹果曾经也是DLNA委员会的成员。相对DLNA,AirPlay提供了一套完善的官方标准实现,开发者只需要按照文档调用API即可,当然如果需要在第三方设备上实现AirPlay功能,需要自己实现一套与AirPlay兼容的功能,网上就有通过分析抓包实现的第三方AirPlay兼容库,包括发送端和接收端。
  3. Miracast的镜像本质:作为最纯粹的屏幕镜像方案,Miracast直接捕获设备屏幕的每一帧,进行编码压缩后通过Wi-Fi Direct传输,实现真正的"所见即所得"。

二、DLNA介绍

DLNA(Digital Living Network Alliance) (数字生活网络联盟)并非一个全新的技术,而是基于UPnP协议构建的一套设备互联规范,其核心思想是通过标准化协议实现家庭网络内数字媒体内容的无缝共享与播放。使用SSDP进行设备发现,使用HTTP(SOAP和GENA)等UPnP子协议实现视频流URL传输、控制与事件通知。DLNA系统包含三个基本角色:

  • DMS(Digital Media Server数字媒体服务器):存储媒体文件并提供内容的分发服务,通常是网络CDN服务器,也可以自己搭建视频源如NAS、个人电脑或智能手机。
  • DMR(Digital Media Renderer数字媒体渲染器):负责接收媒体流并进行解码播放,如智能电视、智能音箱或无线扬声器。通常DMP(Digital Media Player)与DMR是一体的,可以认为是一个角色。
  • DMC(Digital Media Controller数字媒体控制器):作为控制中枢,协调DMS和DMR之间的交互,例如手机上的投屏控制APP。

三、DLNA投屏使用

1、PC端安装macast工具:

Macast: 一个跨平台的DLNA投屏接收器,无打扰地运行在状态栏,支持手机向电脑投视频,快把你的电脑变成电视吧!

Release Macast v0.7 · xfangfang/Macast · GitHub

2、手机端打开夸克APP进行视频投屏

四、DLNA投屏原理

DLNA不传输视频流,只传输视频流url地址,由播放端DMR直接去服务器DMS上拉取,视频流url地址(通常是m3u8文件)共享是通过UPnP协议共享,其流程是UPnP的标准流程:

DLNA遵循UPnP标准流程:设备发现、服务描述、SOAP协议控制,DLNA扩展SOAP协议格式,支持传输url和播放控制。

  • 设备发现

  • 设备和服务描述信息获取

  • SOAP控制:视频流url共享

  • SOAP控制:播放控制

关键技术特点:

  • 推送模式:DLNA采用URL推送方式,媒体渲染器直接获取内容,手机可解放做其他操作。
  • 格式自适应:DLNA定义了必须支持的媒体格式列表,如H.264、MP3、JPEG等,确保基本兼容性。
  • 协议兼容性:由于基于开放的UPnP标准,DLNA具有很好的跨平台特性,不同厂商设备可实现互联。

可以简单理解DLAN=SSDP+HTTP(SOAP),SSDP协议用于设备发现,HTTP协议用于服务描述、视频流url传输、播放控制,HTTP内容格式是以SOAP的xml格式传递。UPnP即插即用设备还用于如路由器端口映射等功能,其核心是提供设备自动发现,定义了服务描述和控制协议。

1. 设备发现过程SSDP

DLNA的两个设备DMR和DMC需要在同一个局域网中,支持自动发现对方,通过SSDP协议实现,SSDP(简单服务发现协议)一种用于在本地网络中发现和公布设备及服务的协议,它是UPnP(Universal Plug and Play)协议栈的一部分,旨在使网络设备和服务能够自动发现和互操作。

  • SSDP的工作原理

SSDP利用HTTPU(HTTP over UDP)进行通信,允许设备在本地网络中相互发现并交换信息。SSDP消息分为设备查询消息(M-SEARCH)和设备通知消息(NOTIFY)两种。

NOTIFY消息

如下是DLNA设备发现的DMR发出的主动通知请求:

广播地址和端口,239.255.255.250是默认SSDP广播IP地址,1900是默认的SSDP端口。

  • HOST: 广播地址和端口。
  • NT: 通知类型: 表征是MediaRenderer设备。
  • NTS: 通知子类型。
  • USN: 唯一服务名称:MediaRenderer,提供DMR服务器。
  • LOCATION: 设备描述文档的URL:http://192.168.0.178:12758/description.xml

M-SEARCH消息

除了被动监听notify通知之外,还可以发送discover报文主动发现设备,M-SEARCH报文格式固定如下:

复制代码
M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 1
ST: ssdp:all

2. 设备描述

SSDP notify报文中最重要的是LOCATION,其中包含了目标设备的ip、upnp服务的端口、设备详细描述地址url,通过设备描述文件,就可以知道设备提供哪些服务信息。描述文件:192.168.0.178:12758/description.xml 内容如下,使用http协议的soap格式传输内容,端口号是非固定的。

DMC主动获取DMR的设备描述信息,http请求头如下:

内容如下:

复制代码
<root xmlns:dlna="urn:schemas-dlna-org:device-1-0" xmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<device>
<deviceType>urn:schemas-upnp-org:device:MediaRenderer:1</deviceType>
<UDN>uuid:8af7b544-8193-491b-8bf2-d51ae73da1c3</UDN>
<friendlyName>Macast(1057)</friendlyName>
<manufacturer>xfangfang</manufacturer>
<manufacturerURL>https://github.com/xfangfang</manufacturerURL>
<modelDescription>AVTransport Media Renderer</modelDescription>
<modelName>Macast</modelName>
<modelNumber>0.7</modelNumber>
<modelURL>https://xfangfang.github.io/Macast</modelURL>
<serialNumber>1024</serialNumber>
<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>
<controlURL>AVTransport/action</controlURL>
<eventSubURL>AVTransport/event</eventSubURL>
<SCPDURL>dlna/AVTransport.xml</SCPDURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:RenderingControl:1</serviceType>
<serviceId>urn:upnp-org:serviceId:RenderingControl</serviceId>
<controlURL>RenderingControl/action</controlURL>
<eventSubURL>RenderingControl/event</eventSubURL>
<SCPDURL>dlna/RenderingControl.xml</SCPDURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
<serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>
<controlURL>ConnectionManager/action</controlURL>
<eventSubURL>ConnectionManager/event</eventSubURL>
<SCPDURL>dlna/ConnectionManager.xml</SCPDURL>
</service>
</serviceList>
</device>
</root>
  • 设备描述:device标签

deviceType: MediaRenderer:表示是一个DMR设备。

friendlyName:设备的展示名

UDN:设备识别码,其中包含了UUID信息。

  • 服务描述:serviceList标签

投屏设备一般支持如下3个服务类型

1)AVTransport、

2)RenderingControl、

3)ConnectionManager

投屏过程中主要使用前两种服务器,SCPDURL为服务描述地址,请求会返回该服务的详细描述,包括服务支持的指令及其参数等信息。controlURL是服务的控制地址,指令的发送就是往这个地址发的,eventSubURL是用来向目标设备订阅该服务。

3. 视频流url推送

投屏使用的报文格式如下,使用controlURL发送HTTP POST请求,AVTransport服务发送SetAVTransportURI指令,通知播放的视频流的地址信息,通常是m3u8文件,也可以是flv、mp4等格式。m3u8文件是一个视频流描述文件,DMR下载m3u8文件然后再去对应的视频流服务器拉流。m3u8文件介绍可以见此:音视频处理(三):hls协议和m3u8详解和视频下载爬虫实战

绝大多数电视取视频URL都是使用CurrentURI标签提供的URL,而三星电视则是从CurrentURIMetaData标签取得视频URL,如果元数据设置不对的话,很可能导致三星这种电视无法正常播放。

xml中特殊字符编码:

原字符 转义字符
& &amp;
" &quot;
< &lt;
> &gt;
空格 &nbsp;
' '

获取到m3u8之后可以通过ffplay工具或者vlc等播放。

复制代码
ffplay -i https://vodcnd01.rsfcxq.com/20241208/vvc30Dkr/index.m3u8 

4. 视频流控制

DMC通过AVTransport/action的controlUrl来控制视频流的启停,如下SOAPACTION的STOP方法报文示例,同时也可以控制播放进度、音量等。

五、参考资料

DLNA 协议分析及应用 |

dlna-cling 开源库

DLNA 与 UPnP 初探 - 简书

DLNA Guidelines --- SpireSpark International

DLNA投屏实现与技术解析-CSDN博客

相关推荐
极智-99621 小时前
视频文件格式?【图文详解】视频文件后缀名?视频文件格式转换?
音视频·视频文件格式·视频文件后缀名·视频文件格式转换
Android系统攻城狮21 小时前
Android16音频之设置HDMI音频setHdmiSystemAudioSupported:用法实例(一百一十六)
音视频·android16·音频进阶·hdmi音频
aqi001 天前
FFmpeg开发笔记(九十)采用FFmpeg套壳的音视频转码百宝箱FFBox
ffmpeg·音视频·直播·流媒体
颜颜yan_1 天前
基于昇腾CANN的智能视频分析系统落地实践
架构·音视频·昇腾
顾道长生'1 天前
(Arxiv-2025)ID-COMPOSER:具有分层身份保持的多主体视频合成
计算机视觉·音视频·composer
aqi002 天前
FFmpeg开发笔记(八十九)基于FFmpeg的直播视频录制工具StreamCap
ffmpeg·音视频·直播·流媒体
Ghost Face...2 天前
Linux音频控制神器:amixer完全指南
linux·chrome·音视频
八月的雨季 最後的冰吻2 天前
FFmepg--28- 滤镜处理 YUV 视频帧:实现上下镜像效果
ffmpeg·音视频
aqi002 天前
FFmpeg开发笔记(九十二)基于Kotlin的开源Android推流器StreamPack
android·ffmpeg·kotlin·音视频·直播·流媒体