DASH
DASH介绍
DASH(Dynamic Adaptive Streaming over HTTP)全称为“基于HTTP的动态自适应流”,是一种自适应比特率流技术,
可以是高质量流媒体可以通过传统的HTTP网络服务器以互联网传递,支持TS profile和ISO profile。
类似的方案还有:
- Apple的HTTP Live Streaming(HLS)
- Adobe的HTTP Dynamic Streaming(HDS)
- Microsoft的Smooth Streaming(MSS)
1. DASH工作原理
- Server端将媒体文件切割一个个时间长度相等的切片(Segment),每个切片被编码为不同的码率/分辨率。
- Client端通过评估自身的性能和带宽情况,下载相应码率和分辨率的切片。带宽好,下载码率高的切片;带宽差,下载码率低的切片。
因为不同质量的切片在时间上是对齐的,所以在不同质量的切片之前切换的话,自然是顺畅的,从而达到无缝切换的效果。
2. DASH相比于HLS的优势:
- 更加通用且正式的码率切换流媒体协议,由MPEG组织制定,而非私人公司制定的。
- 相比广泛应用的HLS v3来说,可以减少多轨媒体的存储空间和传输带宽。
多轨媒体有不同的audio、video和字幕,如果要将它们组合的话,那会有很多种不同的组合,(多视角case会有不同的video track)
而FMP4是将audio、video和字幕分开的,没有封装在一起,那么就不需要将它们一一组合并存储以满足客户的不同需求。
客户需要什么版本的audio 或video或字幕,分开请求即可,从而减少服务器的存储空间。 - 基于模板的媒体描述文件相比m3u8文件,文件体积大大减小。
媒体描述文件
MPEG-DASH中也有类似HLS M3U8这种媒体描述文件,官方命名为MPD文件,实际上是一个XML文件。在这个XML文件中,官方定义了描述流媒体的tag。
- MPD
MPD(Media Presentation Description)全称为媒体呈现描述,是一个XML文件。
它完整的表示了视频的所有信息,包括视频长度,码率和分辨率等等。
请求DASH URL实际上就是获得一个MPD文件。 - Periods
时间段。一个或者多个Period组成一个MPD文件,每个Period表示一个时间段的媒体。
比如某个码流的长度为60秒,假如分为三个Periods:Period1->015s;Period2->1640s;Period3->41~60s。
在同一个Period内,可用的媒体内容及其各个可用码率都不会发生变更。
直播情况下,服务器周期性的从MPD文件中移除已过时的Period,并增添新的Period。 - AdaptationSet
自适应集合。描述同一时间段不同类型的媒体数据,如字幕,音频和视频。
自适应集合,一个或多个AdaptationSet组成一个Period,AdaptationSet包含了逻辑一致的媒体呈现的格式。
对于video来说,每个AdaptationSet由一组可供切换的不同码率/分辨率的码流组成。
而对于audio来说,每个audio AdaptationSet对应同一种语言的不同质量的音频。 - Representation
媒体表示。描述同一媒体数据类型的不同质量版本,即每个Representation仅码率、分辨率不同,其它都一样。
一组媒体内容版本可切换的Representation组成一个AdaptationSet。
比如视频有高质量、中质量、低质量三个版本,那么就对应三个Representation。 - Segment
片段,DASH媒体概念的最小单位,表示一段小的媒体片段。
每个Representation中的内容被切分成一段段Segments,使得客户端在播放时能够方便在不同的Representtation之间切换。
每个Segment由一个对应的URL指定,客户端通过访问该URL获得可播放的媒体数据。
Segment之间不允许相互覆盖,且是解码独立的,不依赖其它Segment。
对于承载ISO profile的segment,可分为Initialization Segment和Media Segment。
Initialization Segment包含MOOV,每个Representation只有一个。
Media Segment包含媒体数据(moof+mdat),每个RePresentation有若干个。
所以,DASH对媒体的描述如下图所示:
MPD文件夹解析
DASH中定义了3种类型的MPD文件,对应3种Segment URL的解析方式:
1. SegmentBase形式:
SegmentBase形式的MPD文件中,一种媒体类型只有一个URL,该URL对应的媒体文件就是 init segment + media segment,不再分段。
MPD文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
maxSubsegmentDuration="PT5.0S"
mediaPresentationDuration="PT9M57S"
minBufferTime="PT5.0S"
profiles="urn:mpeg:dash:profile:isoff-on-demand:2011,http://xmlns.sony.net/metadata/mpeg/dash/profile/senvu/2012"
type="static"
xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd">
<Period duration="PT9M57S" id="P1">
<!-- Adaptation Set for main audio -->
<AdaptationSet audioSamplingRate="48000" codecs="mp4a.40.5" contentType="audio" group="2" id="2" lang="en" mimeType="audio/mp4" subsegmentAlignment="true" subsegmentStartsWithSAP="1">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation bandwidth="64000" id="2_1">
<BaseURL>DASH_vodaudio_Track5.m4a</BaseURL>
</Representation>
</AdaptationSet>
...
上例中,audio Representation只有一个URL,对应文件名为:DASH_vodaudio_Track5.m4a。
请求该MPD文件的URL为:
http://example.com/test.mpd
那么请求该文件的URL则为:
http://example.com/DASH_vodaudio_Track5.m4a