DASH 流媒体协议 —— Dynamic Adaptive Streaming over HTTP,及相关内容
流媒体
DASH
-
DASH的起源——
MPEG(Moving Picture Experts Group,动态影像专家小组),源自ISO与IEC等国际组织的工作小组。MPEG-DASH技术由MPEG负责开发。
对DASH的工作始于2010年,2011年1月成为国际标准草案,2011年11月成为国际标准。
2012年4月,被MPEG制定,标准为ISO - ISO/IEC 23009-1:2019 - Information technology — Dynamic adaptive streaming over HTTP (DASH) — Part 1: Media presentation description and segment formats,后有两版较大更新(2014与2019年),最新标准于2019年提出。
制作DASH标准的目的,源于Adobe的HTTP Dynamic Streaming、Apple的HTTP Live Streaming(HLS)与微软的Smooth Streaming等协议无法兼容,阻碍了音视频向全世界推广的进程,故而需要一项标准加以规范。
而DASH本身,则是基于3GPP(3rd Generation Partnership Project,第三代合作伙伴计划)第9版的Adaptive HTTP Streaming(AHS),和Open IPTV Forum Release 2中的HTTP Adaptive Streaming(HAS)而产生的。(由于年代久远,对这两种方案有兴趣的可以自行查询)
DASH的发展流程导图——
DASH行业论坛(DASH-IF,DASH Industry Forum | Catalyzing the adoption of MPEG-DASH (dashif.org))则进一步促进和催化了MPEG-DASH的采用,并帮助其从规范转变为实际业务。主要的流媒体和媒体公司,包括微软、Netflix、Google、爱立信、三星、Adobe等都在实际业务中尝试使用,并为不同使用环境创建了DASH使用指南。
-
DASH的工作原理(概述)
- Server端将媒体文件分割为时间长度等长的片段(Segment),每个片段可以有不同的码率和分辨率;
- 客户端通常通过对网络带宽的评估或者是自身缓冲区的大小,选择不同参数的片段。通过符合HTTP标准的GET请求进行对应片段的下载。
客户端首先向服务器请求下载mpd文件,根据mpd文件和自身的条件,请求下载合适的媒体片段。由于在时间上,片段是对齐的,因此可以实现在不同片段间切换时,达到无缝切换的播放。
-
DASH标准(概述)
首先要解释的概念是MPD(Media Presentation Description,媒体表示描述)文件。
MPD为一个XML文件,他是用HTTP 中的URL(Uniform Resource Locators,统一资源定位器)表示媒体内容中不同质量和每种质量的各个段。其是一种分层的数据模型,见下图。
-
Period :
标注了视频的时长信息,也可以看做是更新mpd文件的最长时长。
一个Period通常表示一个媒体内容时期,包含一系列不同编码版本的的媒体组件,即不同视角或不同编解码器的视频,不同语言或者不同类型信息的音轨,字幕或标题等,这些组件具有某些特征,例如码率、帧率,音频通道等,这些特征在一个Period中是不会改变的。
在直播场景下,MPD文件会更新Period以保证旧的Period被移除。
客户端可以根据一个Period中可用的码率、分辨率、编解码器等进行调整。且Period可以用于分割内容,比如广告的插入,改变足球比赛的摄像机视角等。
-
AdaptationSet :
包含了媒体呈现的形式,(视频/音频/字幕)。
表示一个或多个逻辑相同的媒体内容组件的一系列可替换的编码版本,例如具有相同编解码器、语言、分辨率、音频通道格式等组件可以包含在同一个Adaptation Set中(但并非完全如此)。这种机制允许客户端消除一系列不满足其需求的多媒体组件。比如客户端只能解HEVC码流,自然不希望HEVC码流与AVC码流被封装在一个Adaptation Set中。
另外,Period还可以只包含一个Adaptation Set,以满足MPD创建者的意图。例如,他只想让你看具有5.1声道音频的高清视频内容。
如果有其他的媒体组件例如字幕等,也可以单独组合为一个Adaptation Set。
-
Representaiton :
包含不同的码率、编码方式、帧率等。
一个Representation描述一个或多个媒体内容组件的一个可交付的编码版本。
在使用的编解码器、解码复杂度以及因此需要的CPU资源或呈现技术方面等更为深远的特征下,Representation都可能有所不同。
Representation包含一个或者更多的媒体流(用于多路复用中的每个媒体内容组件,多路复用的意思指将多个信号组合成一个信号的过程)。
任何一个Representation都足以用于渲染包含的媒体内容组件。意味着客户端可以在一个Adaptation Set中动态的在Representation中进行无缝切换。
-
Segment :
Representation中每一个具体的片段,以便可以得当的访问与交付。
每个Segment通常具有相同的时间长度,按照媒体内容的呈现时间轴进行排列。MPEG-DASH不限制段长度或给出最佳长度的建议。长段意味着更有效的压缩,而短段用于实时场景和高度可变的带宽条件,如移动网络。
直播时的Segment还有一个“可用时间“的特征,表示在这个时间可以访问直播场景。
为了访问一个Segment,MPD中为每一个Segment提供一个URL,因此一个segment是通过单个HTTP请求检索的最大数据单元。
对于已经分段的Representation,包含两种小段(Subsegment)—— 初始化Segment和包含静态媒体数据的Segment。段中有一个段索引,描述子段的表示时间范围与字节范围,可以通过HTTP1.1字节范围请求提前下载子段以生成适当的子段请求。
为了实现在Representation中切换,MPEG-DASH引入了流接入点(Streaming Access Point)。例如,每个段通常以IDR帧开始,以便于可以在传输一个段之后切换不同的Representation。
简而言之,一个视频首先分为Period,Period中包含Adaptation Set或是字幕等媒体组件,一个Adaptation Set中包含具有不同码率\分辨率等特征的Representation,而客户端则通过请求Representation中具有URL的Segment进行媒体内容的解码与播放。
-
Segment参考方案:
制定标准为RFC3986
-
-
DASH相较于HLS的优势:
-
更加通用,由MPEG组织制定,属于公用的标准
-
相较于多轨媒体,减少了服务器的存储空间和传输带宽
即如果要组合不同码率的视频和音频,例如视频5种码率而音频有4种,则需要20个组合;但若使用DASH协议,服务器端仅需存储5种视频文件和4中音频文件,客户需要什么版本的音频或者视频,分别请求即可(这也满足 Youtube,Bilibili等流媒体网站的播放模式)
-
相较于HLS分段的m3u8格式,文件体积大大减小
-
-
DASH的实现
-
Exoplayer —— 开源项目,使得MPEG-DASH在Android上原生使用
-
目前,Youtube Netflix已支持MPEG-DASH,且可以使用多种Mpeg-DASH播放器。国内,Bilibili已经支持DASH。
虽然HTML5不直接支持MPEG-DASH,但是一些JavaScript可以通过HTML5的Media Source Extensions(MSE)使用MPEG-DASH。
当与WebGL结合,MPEG-DASH基于HTML5的自适应比特率流还可实现360°视频的实时和按需的高效流式传输。This demo shows the Bitmovin Player displaying a 360° video with VR
-
客户端与库(注:字体加粗项为我曾使用过)
- Dash.js是Dash行业论坛官方参考和生产播放器。Dash-Industry-Forum/dash.js: A reference client implementation for the playback of MPEG DASH via Javascript and compliant browsers. (github.com)
- Shaka是出自Google的开源dash播放器。Meet Shaka Player, Google's HTML5 Video Player for Low Bandwidth Conditions (softpedia.com)
- VLC多媒体播放器3.0将为MP4/MPEG和实时流媒体发布一个新客户端插件。官方下载:VLC media player,最棒的开源播放器 - VideoLAN
- 跨平台FOSS多媒体框架GStreamer自从至少1.4版本以来支持MPEG-DASH和WebM DASH。GStreamer: open source multimedia framework。现已更新到1.20版本(2022年10月17日)
- 开源程序库libdash独立于平台,可在Android、iOS、Windows Phone等移动平台上运行。bitmovin/libdash: MPEG-DASH Access Library - Official ISO/IEC MPEG-DASH Reference Implementation (github.com)
- bitmovin为HTML5和Flash提供了bitdash MPEG-DASH播放器。
- Viblast Player支持HTML5中的MPEG-DASH,并为iOS和Android提供SDK。[30]
- 巴黎电信学院中GPAC的OSMO4支持MPEG-DASH。GPAC | Multimedia Open Source Project (imt.fr)
- 克拉根福大学ITEC中的DASH-JS支持MPEG-DASH。ITEC – Dynamic Adaptive Streaming over HTTP (aau.at)
-
服务器(注:字体加粗项为我曾使用过)
- Brightcove Zencoder已支持MPEG-DASH transmuxing/transcoding。
- Elemental Technologies视频处理解决方案支持DASH。
- Helix Universal Server已支持各种模式下的DASH。
- nginx-rtmp-module支持生成MPEG-DASH实时流。基于HTTP的动态自适应流#cite_note-35)但在1.2.0版本以前,只能使用dash.js的修改版本和bitdash播放。
- nginx-ts-module支持实时MPEG-DASH
- Nimble Streamer有实时和点播MPEG-DASH的支持。对点播来说,它支持H.265和H.264编解码器
- Unified Origin支持MPEG-DASH。
-
DASH内容生成器(注:字体加粗项为我曾使用过)
- ITEC的DASHEncoder。slederer/DASHEncoder: Tool to generated DASH content (github.com)
- MP4Box及其来自Telecom ParisTech的GPAC的多媒体框架MP4Box · gpac/gpac Wiki (github.com)
- 巴黎电讯的dashcast支持MPEG-DASH实时流
- MediaGoom MPEG-DASH PackagerPackaging for MPEG-DASH — Unified Streaming (unified-streaming.com)
- Bento4开源工具和SDKBento4;MPEG-DASH Getting Started - Bento4
-
不同的流媒体协议
小结——
协议类型 | HLS协议 | DASH协议 | RTMP协议 |
---|---|---|---|
连接方式 | 短连HTTP | 短连HTTP | 长连HTTP |
推广公司 | Apple | ISO,Open | Adobe |
切片工具 | FFmpeg | MP4Box Beno4-mp4dash FFmpeg |
- |
索引文件 | m3u8,m3u | mpd | - |
分片文件 | TS | mp4/cmfv/cmfa/m4s | Message |
播放方式 | 本地播放 | 本地播放 | 实时播放 |
视频编码 | AVC/HEVC... | AVC/HEVC... | AVC/VP9... |
音频编码 | AAC | AAC/mp3... | AAC/mp3... |
原理 | 分片,更新索引文件 | 同左 | 即收即发 |
延时(?) | 10-30s | <HLS,灵活 | >2s |
HTTP
-
HTTP协议基础:
-
网络传输方式:
-
文件下载
-
HTTP渐进式下载
-
HTTP流式传输
-
实时流媒体传输
HTTP渐进式传输——
边下载边播放,
-
-
采用HTTP协议作为媒体流的推送协议的总结
- HTTP流媒体作为一种网络视频传输形式正在广泛传播。
- 在开放互联网上使用HTTP作为多媒体传输的主要协议是一个明显的趋势。
- 基于http的传输通过避免NAT和防火墙的穿越问题,使流媒体服务变得简单和轻松
- 由于HTTP和底层TCP/IP协议得到了广泛的实现和部署,基于HTTP的交付提供了可靠性和部署简便性。
- 基于HTTP的传输提供了使用标准HTTP服务器和标准HTTP缓存(通常是廉价的服务器)来传递内容的能力,这样就可以从CDN或任何其他标准服务器群传递内容。可拓展性强。
- 基于http的传输提供了将“流会话”的控制完全搬移到客户端的能力。客户端基本上只打开一个或多个到一个或多个标准HTTP服务器或缓存的TCP连接。(例如现如今可以同时打开多个视频端口)
- 基于http的传输为客户端提供了自动选择初始内容速率来匹配初始可用带宽的能力,而无需与流媒体服务器进行协商。
- 基于http的传输提供了一种简单的方法,在给定的内容或服务时,根据可用带宽的变化实时无缝地更改内容速率,而不需要与流媒体服务器协商。
- 基于http的流媒体有潜力加速视频流服务的固定-移动融合,因为基于http的CDN可以用作一个通用的交付平台。
参考文章
流媒体协议:互联网视频分发协议介绍(渐进式、HLS、DASH、HDS、RTMP协议) - 简书 (jianshu.com)
ITEC – Dynamic Adaptive Streaming over HTTP (aau.at)
标准小组官方网站,提供了一系列最新研究,工具,白皮书、视频序列的下载等
基于HTTP的动态自适应流 - 维基百科,自由的百科全书 (wikipedia.org)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)