什么是Dash
DASH,又叫MPEG DASH,DASH:Dynamic Adaptive Streaming over HTTP ,是由MPEG和ISO批准的独立于供应商的国际标准(ISO / IEC 23009-1),是一种在互联网上传送动态码率的Video Streaming技术,类似于苹果的HLS,DASH会通过media presentation description (MPD)将视频内容切片成一个很短的文件片段,每个切片都有多个不同的码率,DASH Client可以根据网络的情况选择一个码率进行播放,支持在不同码率之间无缝切换。
Dash格式详解
Dash流地址一般以mpd后缀结尾,内容是一个xml文件,描述了流的相关信息,有点类似Hls的m3u8文件,下图展示了它的基本结构:
<?xml version="1.0" encoding="UTF-8"?>
<!--Generated with https://github.com/google/shaka-packager version v2.5.1-9f11077-release-->
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" profiles="urn:mpeg:dash:profile:isoff-live:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT114.5999984741211S">
<Period id="0">
<AdaptationSet id="0" contentType="audio" segmentAlignment="true">
<Representation id="0" bandwidth="52672" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="48000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
<SegmentTemplate timescale="48000" initialization="audio/init.mp4" media="audio/$Number$.m4s" startNumber="1">
<SegmentTimeline>
<S t="48" d="307298"/>
<S t="307346" d="307200" r="15"/>
<S t="5222546" d="275505"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
<AdaptationSet id="1" contentType="video" maxWidth="2560" maxHeight="1440" frameRate="25000/1000" segmentAlignment="true" par="16:9">
<Representation id="1" bandwidth="3689452" codecs="avc1.640028" mimeType="video/mp4" sar="1:1" width="1920" height="1080">
<SegmentTemplate timescale="25000" initialization="video4/init.mp4" media="video4/$Number$.m4s" startNumber="1" duration="160000"/>
</Representation>
<Representation id="2" bandwidth="1562835" codecs="avc1.64001f" mimeType="video/mp4" sar="1:1" width="1280" height="720">
<SegmentTemplate timescale="25000" initialization="video3/init.mp4" media="video3/$Number$.m4s" startNumber="1" duration="160000"/>
</Representation>
<Representation id="3" bandwidth="367288" codecs="avc1.640015" mimeType="video/mp4" sar="1:1" width="426" height="240">
<SegmentTemplate timescale="25000" initialization="video1/init.mp4" media="video1/$Number$.m4s" startNumber="1" duration="160000"/>
</Representation>
<Representation id="4" bandwidth="770115" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" width="852" height="480">
<SegmentTemplate timescale="25000" initialization="video2/init.mp4" media="video2/$Number$.m4s" startNumber="1" duration="160000"/>
</Representation>
<Representation id="5" bandwidth="4579255" codecs="avc1.640032" mimeType="video/mp4" sar="1:1" width="2560" height="1440">
<SegmentTemplate timescale="25000" initialization="video5/init.mp4" media="video5/$Number$.m4s" startNumber="1" duration="160000"/>
</Representation>
</AdaptationSet>
</Period>
</MPD>
Dash是一个非常复杂的标准,mpd中的内容非常灵活,这里只展示了其中的一种情况,在这个mpd中:
1.只有一段视频2.分为两个AdaptationSet
,一个是音频的,一个是视频的3.音频是AAC编码,只有一种码率,分为18个片段,片段标准时长6.4s左右
SegmentTimeline标签中,分为三个S子标签,其中t代表起始时间,d代表时长,r代表该分片之后重复的个数,结合上面的mpd内容可知:分片数=1+1+15+1=18,片段标准时长=307200/48000=6.4s
4.视频是H264编码,有5个码率,分为18个片段,片段标准时长6.4s左右
视频没有SegmentTimeline标签,表示它的每个分片时长都一样=160000/25000=6.4s,总时长是114.6s(根据mediaPresentationDuration字段得来),因此总分片数=114.6/6.4=18片
从mpd中获取到这些关键信息后,播放器就可以进行相应的实现,达到各种播放效果,比如:
1.播放纯音频2.播放不同的清晰度3.根据用户带宽自适应码率并无缝切换4.无缝切换不同配音,如普通话/粤语(上面mpd中没有多语言配音,但是格式上是可以支持的)
Dash分片格式
Dash支持多种分片格式(包括hls常用的ts格式),其中较主流的是m4s,其实就是mp4。
分片形式也有两种方式:
•多文件分片,每个分片都是一个单独的文件•单文件分片,每个分片采用byte-range区分
其中,单文件分片较为主流,它具有以下优势:
•单体 m4s 比多个 m4s, 传输和缓存效率更高,可以减少计算和 IO 开销。•多个m4s 会产生多个 CDN 请求,一次播放有可能需要多次回源。单体 m4s 在 CDN 侧缓存整个文件,一次回源,后续访问都可以命中缓存。
下面也主要以单体m4s为例进行介绍如何解析分片。
mp4中的基本单位是Box,一个mp4文件就是由一定数量的Box组成,Box可以嵌套,每个Box都有一个类型,以四个字母标识,每个类型的Box都有其特定作用和数据结构,这些都定义在ISO规范中。
aligned(8) class Box (unsigned int(32) boxtype, optional unsigned int(8)[16] extended_type) {
unsigned int(32) size;
unsigned int(32) type = boxtype;
if (size==1) {
unsigned int(64) largesize;
} else if (size==0) {
// box extends to end of file
}
if (boxtype==‘uuid’) {
unsigned int(8)[16] usertype = extended_type;
}
}
一个典型的m4s单体文件结构如下:
•ftyp:m4s文件开头•moov:音视频描述信息,如编码、分辨率、采样率、sps、pps等信息都在这里•sidx:Segment Index Box,包含分片划分索引信息,据此可以计算每个分片的时长和位置•ssix:Subsegment Index Box,子片段的索引,作用不大无需解析•moof:媒体头,与mdat成对出现,描述mdat中的内容•mdat:媒体文件内容,如H264 nal单元等
一对moof
和mdat
,就可以当作是一个Dash分片。
通过解析mp4文件头,我们就可以得到每一个分片的时长以及在文件中的位置,从而可以通过byte请求快速访问到。
播放器对Dash的典型处理过程如下:
Dash直播
Dash也支持直播流,mpd文件中type="dynamic"
,表示这是一个直播流。
直播有一些专用的属性配置,播放器可以根据不同配置进行相应处理:
具体每个字段的含义可以参考下文链接,由于我们目前没有这块业务,这里不再赘述:
Understanding and configuring a Dynamic MPD (MPEG-DASH)[2]
Dash优缺点
优点
•支持自适应码率
- 支持音视频分离、多音轨、多码率
•封装、编码支持广泛
•mpd文件内容灵活,可扩展性强,文件体积小
•国际标准,开源
缺点
•标准较新,支持还不够广泛
References
[1]
我们为什么使用DASH: https://www.bilibili.com/read/cv855111/[2]
Understanding and configuring a Dynamic MPD (MPEG-DASH): https://docs.unified-streaming.com/documentation/live/configure-dynamic-mpd.html
作者:王兴伟
审稿:斗鱼流媒体技术委员会
原文:https://mp.weixin.qq.com/s/n2Fk-ZBNpY96kqrmBgErxg
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。