DASH(Dynamic Adaptive Streaming over HTTP)是在2011年底由MPEG和ISO共同制定的标准,通过HTTP共同影音档案通讯协定,可使高品质影音内容通过网路传送到联网电视、机顶盒及移动终端设备。在MPEG-DASH之前,市场上已有Apple的HLS、Microsoft的Smooth Streaming以及Adobe的Dynamic Streaming等渐进式流媒体协议,但彼此并不相容,MPEG-DASH整合了这三种流媒体协议,同时支持TS profile和ISO profile,更具通用性。
DASH
一种服务端、客户端的流媒体解决方案:
服务端:
将视频内容分割为一个个分片,每个分片可以存在不同的编码形式(不同的codec、profile、分辨率、码率等);
播放器端:
就可以根据自由选择需要播放的媒体分片;可以实现adaptive bitrate streaming技术。不同画质内容无缝切换,提供更好的播放体验。
DASH中的重要概念
- MPD
媒体文件的描述文件(manifest),作用类似HLS的m3u8文件。MPD文件以XML格式组织,其层次结构参图1。 - Representation
对应一个可选择的输出(alternative)。如,480p video,720p video, 44100采样 audio,22050采样audio,都使用Representation描述。 - Segment(分片)
每个Representation会划分为多个Segment。Segment分为4类,其中,最重要的是:Initialization Segment(每个Representation都包含1个Init Seg),Media Segment(每个Representation的媒体内容包含若干Media Seg) - fMP4
fMP4(fragmented MP4),可以简单理解为分片化的MP4,是DASH采用的媒体文件格式,文件扩展名通常为(.m4s或直接用.mp4)。普通MP4 由索引文件头文件moov box和媒体数据mdat box组成。
fMP4 由分片组成,可以按整个文件存储,也可以按分片存储,如果按照单个文件存储,每个输出是一个m4s文件。 完整的fMP4视频可以描述为如下形式: moov + (moof + mdat) * N 其中moof box是分片(fragment)的标识, mdat box存放的是当前分片的媒体数据;如果按照分片存储,每个分片是一个m4s文件,输出对应了多个m4s。fMP4中的第一个分片,对应了DASH协议中Initialization Segment;其后的分片,则对应Media Segment。
DASH自适应码率下载
HTTP Server端将媒体文件切分成一个个时间长度相等的小分片(Segments),每个分片被编码为不同的码率和分辨率;这些分片可以通过GET请求下载,客户端通过评估自身的性能和带宽情况,下载相应码率和分辨率的切片。码率切换以Segment为单位,当自身带宽较好时,在下载下一个切片时,就可以请求对应码率的较高分辨率的切片;而当带宽变差时,则当前切片下载完成后,可以下载码率和分辨率较低的下一个切片。由于不同质量的切片在时间上都是对齐的,因此,在不同质量的切片之间切换时,是自然流畅的。
描述Segments之间在时间和结构上的关系
MPEG-DASH引入了Media Presentation Description (MPD)的概念。MPD是一个XML文件,它完整表示了视频的所有信息,包括视频长度,不同Segments的码率和分辨率、分片时长以及对应的URL等等,客户端通过首先下载并解析MPD文件,可获取到与自身性能和带宽最匹配的切片序列。
-
Periods
一个MPD文件可以包含一个或多个Periods,每个Period代表某一个时间段,比如某条码流有60s长,Period1为015s,Period2为1640s,Period3为41~60s。在同一个Period内,可用的媒体内容及其各个可用码率(Representation)不会发生变更。直播情况下,可能需要周期性地去服务器请求新的MPD文件,服务器可能会移除已过时的Period,添加新的Period,而新的Period中可能会添加新的可用码率,或去掉上一个Period中存在的某些码率。 -
AdaptationSet
一个Period由一个或多个AdaptationSets组成,AdaptationSet包含了逻辑一致的媒体呈现的格式,例如,相同的codec、language、resolution,以及音频通道数(5.1,stereo等)的媒体内容可以组成一个AdaptationSet。每个AdaptationSet由一组可供切换的不同码率的码流(Representation)组成,这些码流中可能包含一个(ISO profile)或多个(TS profile)media content components,因为ISO profile的mp4或fmp4 segment中通常只含有一个视频或者音频内容,而TS profile中的TS segment同时含有视频和音频内容,当同时含有多个media component content时,每个被复用的media contentcomponent将被单独描述。 -
Representation
一个AdaptationSet由一组媒体内容版本可切换的Representations构成。每个Representation包含了相同媒体内容的不同版本,即不同的分辨率、码率等,以供客户端根据自身的网络条件和性能限制来选择合适的版本下载播放。 -
Segment
每个Representation中的内容都被切分成一段段Segments,使得客户端在播放时能够方便在不同的Representations之间切换。每个Segment由一个对应的URL指定,也可能由相同的URL与不同的byte range指定。DASH客户端可以通过HTTP协议来获取URL对应的分片数据。MPD中描述Segment URL的形式包括Segment list,Segment template,Single segment。 -
Subsegment
Segments可以进一步划分为更小的Subsegments,Subsegments表示Segment中一些更小的access units。Segment index描述了Subsegments的presentation time range和byte position,客户端可以先获取Segment index,再通过HTTP 1.1的byte range requests去请求相应的Subsegment。
SAP (Stream Access Point)
在媒体播放过程中,虽然可以方便地在不同的码率(Representations)之间,但并不能做到在码流的任意点切换。需要注意的是,Segments之间不允许互相覆盖(overlap),而且Segments之间是解码独立的,也就是每个Segments可以单独解码,而不依赖其之前或之后的其他Segments。
SAP可以简单理解为I帧或IDR帧,一般每个Segments的起始帧都是IDR帧(H.264 / AVC),这样就保证了每个Segments传输完成之后,可以切换到其他的Representation。
Segment URL的几种形式
Representation中会包含(且仅包含)这几个选项之中的一个
(1) 一个或多个SegmentList元素;
(2) 一个SegmentTemplate;
(3) 一个或多个BaseURL元素,最多一个SegmentBase元素,不含有SegmentTemplate或SegmentList元素。
-
SegmentList
SegmentList包含了一个SegmentURL的列表,客户端按照segment列表元素在MPD文件中出现的顺序来请求和播放相应的Segments。SegmentURL即为每个Segment的地址,可以是绝对地址,也可以是相对地址,也可能是字节范围。 -
SegmentTemplate
SegmentTemplate提供了一种通过给定的模板构造出一个segment list的机制,这意味着一些特定的标识符将被动态值取代。在SegmentList模式中为每个Segment构造一个URL,当Representation中分段较多时,会使得MPD文件变得很大,而SegmentTemplate模式则可以通过少数几行描述来构造出一系列segments。有两种形式的SegmentTemplate,一种是基于数字的SegmentTemplate,另一种是基于时间的SegmentTemplate。
基于数字的SegmentTemplate: 通过“SegmentTemplate”元素中的地址和startNumber就可以构造出不同的segmentlist了,只需要短短几行表述,使得MPD文件更加简洁和紧凑。这种方式特别适用于含有多个Representations的长视频,能够有效压缩MPD文件的大小,提升客户端的下载速度和播放启动速度。
基于时间的SegmentTemplate:“SegmentTimeline”字段中描述了当前Representation中第一个Segment的起始时间,duration,以及段的repeat次数(个人理解,应该是具有相同duration的segments的个数,这样读取完一个Segment之后,就可以根据该数值直接去读取下一个Segment,而不需要重新去读取一遍MPD)。 -
SegmentBase
在MPEG-DASH中,SegmentBase是当Representation中只有一个media segment存在时使用的方式。