(注:本文档主要包含DASH与点播相关的内容,对直播相关的部分涉及不多。)
DASH又称MPEG-DASH,全称为Dynamic Adaptive Streaming over HTTP(基于HTTP的动态自适应流)。
DASH的架构如下图所示[5.b],蓝色部分为标准指定内容,红色部分可以自由实现:
在DASH中,一个视频会被编码为多个不同的版本(称为Representation),通常对应不同的分辨率(如480p、720p、1080p)和平均码率(如1.85Mbps、2.85Mbps、4.3Mbps)。一个完整的视频被切分为多个视频块(称为segment/chunk/GoP),包含几秒的视频内容(通常2~5s,时长相等)。DASH使用MPD文件(Media Presentation Description)来描述视频信息。
所有视频内容与MPD文件保存于服务器上。在开启视频会话时,客户端首先请求并解析MPD文件,获取服务器上的视频信息。之后,客户端每次使用HTTP GET请求一个视频块,通过ABR算法(Adaptive Bitrate,自适应码率)决定所请求视频块的码率级别,下载相应视频块并使用播放器播放视频。
DASH标准的核心内容之一是对MPD文件格式的规范。MPD文件是一种用XML语言描述的分层结构,其结构如下图[5.b]:
关键字段:
一个真实的MPD文件内容如下。该视频由FFMpeg编码、GPAC(MP4Box)切片生成,总时长9m56.459s(“mediaPresentationDuration”, “duration”),每个视频块时长2s,帧率24fps,比例为16:9,共分为144p、240p、360p、480p、720p、1080p六个分辨率,对应六挡平均码率(“bandwidth”),格式为mp4。附带的音频只有一个版本。
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500S" type="static" mediaPresentationDuration="PT0H9M56.459S" maxSubsegmentDuration="PT0H0M2.458S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011,http://dashif.org/guidelines/dash264">
<ProgramInformation moreInformationURL="http://gpac.io">
<Title>bbb.mpd generated by GPACTitle>
ProgramInformation>
<Period duration="PT0H9M56.459S">
<AdaptationSet segmentAlignment="true" maxWidth="1920" maxHeight="1080" maxFrameRate="24" par="16:9" lang="und" startWithSAP="1" subsegmentAlignment="true" subsegmentStartsWithSAP="1">
<Representation id="1" mimeType="video/mp4" codecs="avc1.640028" width="1920" height="1080" frameRate="24" sar="1:1" bandwidth="4258031">
<BaseURL>BBB1920x1080_dashinit.mp4BaseURL>
<SegmentBase indexRangeExact="true" indexRange="916-4523">
<Initialization range="0-915"/>
SegmentBase>
Representation>
<Representation id="2" mimeType="video/mp4" codecs="avc1.64001F" width="1280" height="720" frameRate="24" sar="1:1" bandwidth="2847609">
<BaseURL>BBB1280x720_dashinit.mp4BaseURL>
<SegmentBase indexRangeExact="true" indexRange="915-4522">
<Initialization range="0-914"/>
SegmentBase>
Representation>
<Representation id="3" mimeType="video/mp4" codecs="avc1.64001F" width="896" height="504" frameRate="24" sar="1:1" bandwidth="1878775">
<BaseURL>BBB896x504_dashinit.mp4BaseURL>
<SegmentBase indexRangeExact="true" indexRange="915-4522">
<Initialization range="0-914"/>
SegmentBase>
Representation>
<Representation id="4" mimeType="video/mp4" codecs="avc1.64001E" width="640" height="360" frameRate="24" sar="1:1" bandwidth="1240660">
<BaseURL>BBB640x360_dashinit.mp4BaseURL>
<SegmentBase indexRangeExact="true" indexRange="915-4522">
<Initialization range="0-914"/>
SegmentBase>
Representation>
<Representation id="5" mimeType="video/mp4" codecs="avc1.640014" width="416" height="234" frameRate="24" sar="1:1" bandwidth="757000">
<BaseURL>BBB416x234_dashinit.mp4BaseURL>
<SegmentBase indexRangeExact="true" indexRange="915-4522">
<Initialization range="0-914"/>
SegmentBase>
Representation>
<Representation id="6" mimeType="video/mp4" codecs="avc1.64000D" width="256" height="144" frameRate="24" sar="1:1" bandwidth="294059">
<BaseURL>BBB256x144_dashinit.mp4BaseURL>
<SegmentBase indexRangeExact="true" indexRange="914-4521">
<Initialization range="0-913"/>
SegmentBase>
Representation>
AdaptationSet>
<AdaptationSet segmentAlignment="true" lang="und" startWithSAP="1" subsegmentAlignment="true" subsegmentStartsWithSAP="1">
<Representation id="7" mimeType="audio/mp4" codecs="mp4a.40.2" audioSamplingRate="48000" bandwidth="139642">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
<BaseURL>BBB_dashinit.mp4BaseURL>
<SegmentBase indexRangeExact="true" indexRange="856-4475">
<Initialization range="0-855"/>
SegmentBase>
Representation>
AdaptationSet>
Period>
MPD>
ABR算法的设计目标是提高用户的QoE(Quality of Experience,体验质量)。点播视频的QoE主要包括:
ABR算法将网络吞吐量及播放器Buffer时长等信息作为输入,输出下一个视频块的码率级别。DASH标准并没有规定ABR的实现方式,由客户端自由实现。ABR算法在DASH中的结构如下图所示(From Neural Adaptive Video Streaming with Pensieve | SIGCOMM’17):
最直观的ABR逻辑是选择不高于预测吞吐量的最高码率的视频,该方法称为Rate-based(RB)。关于ABR算法更详细的介绍参见本文3.3.1部分。
早期的视频编码方案均为CBR(Constant Bitrate,固定码率),即整个视频的所有片段的码率都几乎一致。
后来出现了VBR编码(Variable Bitrate,可变码率),可以根据画面变化对不同的帧进行压缩。AVC/H.264即为一种广泛应用的VBR编码方案。
如图所示,VBR编码后,一个GoP(Group of Pictures)内包含一个I帧和多个P帧(*可能还有B帧),I帧可以独立解码为完整图片,P帧则根据与I帧之间的差异生成,需要依赖I帧解码。VBR可以对相对静止或者复杂度较低的画面使用较少的字节进行编码,因此其优势在于降低了视频压缩的数据量。
下图展示了不同分辨率下VBR视频的块码率变化(From ABR Streaming of VBR-encoded Videos: Characterization, Challenges, and Solutions | CoNEXT’18):
对于VBR编码的视频而言,通常所说的视频码率指的是整个视频的平均码率。视频分辨率越高,平均码率越高。对于单个视频,其视频块大小的变化程度非常剧烈,因为视频块大小与其包含的画面复杂度呈正相关。
VBR编码对于ABR算法设计也提出了新的挑战:播放器Buffer的变化,既取决于网络的动态性,也取决于视频内容的动态性。
传统视频传输方案基于UDP,HAS(HTTP Adaptive Streaming)基于TCP进行视频传输。
设计对比 [5.b] :
架构对比[5.b] :
HAS的优势,首先在于HTTP用于媒体传输的优势[5.b] :
其次,HAS允许客户端根据网络变化请求不同码率的视频,提高了带宽利用率,带来了QoE的提高。
在DASH之前,HAS主要为各公司的私有方案:
这些方案的思路和技术大部分相同,但是无法互相兼容,增加了播放器的开发成本。为了解决这一问题,MPEG组织与微软、苹果、Netflix、高通、爱立信、三星和等公司联合推出了MPEG-DASH,使其成为开放的国际标准(ISO/IEC 23009-1 [2.a] )。相对于私有解决方案(尤其是较为广泛应用的HLS),MPEG-DASH的主要优势在于降低了兼容成本,简化了视频流系统的实现,提高了通用性和灵活性,包括:
在DASH之前,工业界也有一些其他非HAS的视频传输方案。但DASH很明显在灵活性和QoE上具有更好的表现。
国内点播视频的主流方案包括整段/分段FLV、整段MP4等。整段MP4的问题在于,对于长视频而言,其头部过于复杂,首帧加载很慢。
以下二图为国内主流视频传输方案的对比:
(From 我们为什么使用DASH | 哔哩哔哩)
(From DASH、HLS和MP4格式有什么播放体验区别? | 华为云)
尽管DASH可以同时应用于直播和点播场景,但受限于视频切片,DASH目前的劣势在于其应用于直播场景的时延较大(至少一个视频块的时长,如2s)。
下图对比了不同直播传输方案的时延差异(From 打造极致观看体验:超低时延直播技术探索与实践 | 2020阿里云云栖大会):
(注:DASH工业论坛 [2.a] 似乎最近在关注DASH应用于直播的问题)
*此部分内容可以参考:ABR研究综述 | A Survey on Bitrate Adaptation Schemes for Streaming Media Over HTTP(IEEE CST’18)阅读笔记
针对DASH(HAS)的相关研究主要分为以下几个方面[5.b]:
一个合理的DASH(HAS)机制应该能够实现:
但DASH(HAS)客户端独有的ON-OFF请求模式,为实现以上目标带来了挑战。
在一个视频流会话中,客户端会处于两种状态:buffer填充状态和稳定状态。在buffer填充状态下,客户端持续向服务器请求视频块,以快速填充buffer,使其达到目标值,从而进入稳定状态;而在稳定状态下,客户端仅在buffer低于目标值时才进行请求,导致实际的请求行为并不连续,将客户端进行请求的时间段称之为ON,不请求的时间段称之为OFF,可以看出,客户端的请求行为呈现出明显的ON-OFF周期性特征。
一个真实场景下的ON-OFF请求行为如下图。Request表明客户端向服务器发出请求但还未收到响应,Download表明客户端收到响应并开始下载,Idle表明客户端与服务器之间没有任何数据传输。
需要注意的是,若OFF的持续时间超过某一阈值(Linux默认值为200ms),对于CUBIC等拥塞控制算法(不包括BBR),其拥塞窗口会恢复到初始大小(Linux默认值为10),则稳定状态下每个视频块的请求都是一个独立的慢启动增窗过程。
由于ON-OFF周期的存在,若多个客户端共享瓶颈链路(各客户端的ON-OFF周期不重叠),或一个客户端与其他持续流共享瓶颈链路(慢启动导致客户端无法竞争到足够的可用带宽),一方面客户端很难准确估计真实的可用带宽,另一方面客户端无法获得公平的网络资源,导致客户端无法实现稳定、公平、高利用的目标。
视频流传输的目标之一是提供质量恒定的视频流,以避免频繁的质量切换影响QoE。过去的方案直接用视频码率表征视频质量,然而研究表明,视频质量(可以用PSNR、SSIM、VMAF等指标衡量)与视频码率之间呈非线性关系,如下图[5.b]所示:
可以看出,视频质量和视频码率的不一致性(非线性关系),既体现在单个视频中,也体现在不同视频的对比之中。网络的动态性与视频内容的动态性,为实现恒定质量的视频传输带来了挑战。
DASH客户端部署ABR算法(注:此外,还有一些非客户端的ABR方案,以及非ABR的QoE优化方案)以实现QoE的最大化。近些年来,学术界在此领域有非常丰富的研究。目前主流的ABR算法按照其决策依据主要分为:
为简便起见,目前ABR学术研究的QoE形式,是将其主要影响因素赋以权重后线性加和,形如下式(From A Control-Theoretic Approach for Dynamic Adaptive Video Streaming over HTTP | SIGCOMM’15):
等号右边四项,分别代表一个视频流会话中的:总视频质量、总视频质量切换、总卡顿时间、总启动时延。
然而,真实场景中的QoE则更为复杂。研究将影响QoE的因素分为两类:
视频流领域的一个主要挑战是缺乏统一的量化方法来衡量QoE。现有的工业和学术方案基于三方面的指标来衡量QoE:
*国际电信联盟(ITU-T)最近发布了两个系列的视频质量评估标准,分别为P.1203和P.1204,其性能优于PSNR、SSIM与VMAF,可参阅:ITU-T P.1203/P.1204视频质量评估标准介绍
不同用户同步观看视频的需求逐渐显现。在传统方案中,每个客户端仅根据自身的网络环境进行视频传输,并不考虑与其他客户端的同步。因此,如何为分布在不同地理位置的多个客户端实现播放状态同步,也成为了需要研究的问题,该问题称为目标间多媒体同步 (IDMS)。
目前DASH已经在诸多视频厂商的产品中得到广泛部署,国外厂商如Youtube、Netflix、Hulu等,国内厂商如Bilibili。
dash.js [3.a] 是DASH工业论坛[2.a]推荐的DASH标准播放器。dash.js基于Javascript实现,可以在HTML网页中实现DASH视频播放的功能。
基于Nginx(HTTP/1.1)与dash.js搭建DASH视频播放系统的个人实践:DASH视频系统(服务器&播放器)搭建
关于ABR算法的实际应用,可参考:dash.js的ABR逻辑;如何在dash.js中添加自定义ABR规则?