流媒体DASH协议详解
- 2019-09-27 15:35:00
- admin 原创
- 28548
DASH(MPEG-DASH)是 Dynamic Adaptive Streaming over HTTP的缩写,是国际标准组 MPEG 2014年推出的技术标准, 主要目标是形成IP网络承载单一格式的流媒体并提供高效与高质量服务的统一方案, 解决多制式传输方案(HTTP Live Streaming, Microsoft Smooth Streaming, HTTP Dynamic Streaming)并存格局下的存储与服务能力浪费、运营高成本与复杂度、系统间互操作弱等问题.
DASH是基于HTTP的动态自适应的比特率流技术,使用的传输协议是TCP(有些老的客户端直播会采用UDP协议直播, 例如YY, 齐齐视频等). 和HLS, HDS技术类似, 都是把视频分割成一小段一小段, 通过HTTP协议进行传输,客户端得到之后进行播放;不同的是MPEG-DASH支持MPEG-2 TS、MP4等多种格式, 可以将视频按照多种编码切割, 下载下来的媒体格式既可以是ts文件也可以是mp4文件, 所以当客户端加载视频时, 按照当前的网速和支持的编码加载相应的视频片段进行播放.
DASH的整个流程
-
主播直播流上传
-
服务器的编解码封装
-
流媒体分发器
-
mpd文件
-
切割后的媒体文件
-
-
客户端
-
客户端加载mpd文件
-
解析MPD文件, 组成文件下载链接
-
当前的网速和支持的编码加载相应的视频片段进行播放
-
MPD文件内容
MPD文件构成
-
MPD 标签
属性:
profiles: 不同的profile对应不同的MPD要求和Segment格式要求mediaPresentationDuration:整个节目的时长
minBufferTime: 至少需要缓冲的时间
type:点播对应static,直播对应dynamic
availabilityStartTime=2019-05-22T22:16:57Z:如果是直播流的话,则必须提供,代表MPD中所有Seg从该时间开始可以request了
minimumUpdatePeriod=PT10H:至少每隔这么长时间,MPD就有可能更新一次,只用于直播流 -
BaseURL 根目录
该元素可以在MPD\\Period\\AdaptationSet\\Representation同时出现,若同时出现,则层层嵌套;在每一层也可以出现多次,默认使用第一个BaseURL;
3. Period 区段
一条完整的mpeg dash码流可能由一个或多个Period构成,每个Period代表某一个时间段。比如某条码流有60秒时间,Period1从0-15秒,Period2从16秒到40秒,Period3从41秒到60秒。同一个Period内,意味着可用的媒体内容及其各个可用码率(Representation)不会发生变更。直播情况下,“可能”需要周期地去服务器更新MPD文件,服务器可能会移除旧的已经过时的Period,或是添加新的Period。新的Period中可能会添加新的可用码率或去掉上一个Period中存在的某些码率, 即上面的 Representation 字段
属性:
duration:Period的时长;
start:Period的开始时间
4. AdaptationSet 自适应子集
一个Period由一个或者多个Adaptationset组成。Adaptationset由一组可供切换的不同码率的码流(Representation)组成,这些码流中可能包含一个(ISO profile)或者多个(TS profile)media content components,因为ISO profile的mp4或者fmp4 segment中通常只含有一个视频或者音频内容,而TS profile中的TS segment同时含有视频和音频内容. 当同时含有多个media component content时,每个被复用的media content component将被单独描述。
属性:
segmentAlignment: 如果为true,则代表该AS中的segment互不重叠
startWithSAP: 每个Segment的第一帧都是关键帧
mimeType AdaptationSet 的媒体类型
minWidth 最小宽度
par 宽高比
contentType: 内容类型
5. media content component 媒体内容
一个media content component表示表示一个不同的音视频内容,比如不同语言的音轨属于不同的media content component,而同一音轨的不同码率(mpeg dash中叫做Representation)属于相同的media content component。如果是TS profile,同一个码率可能包括多个media content components。
6. SegmentTemplate 片段模板
组成下载 Representation 的URL 模板
属性:
media: 指定用来生成Segment列表的模板,可以包含的通配符有$RepresentaonID$,$Bandwidth$,$Number$, $Time$
7. Representation 媒体文件描述
每个Adaptationset包含了一个或者多个Representations,一个Representation包含一个或者多个media streams,每个media stream对应一个media content component。为了适应不同的网络带宽,dash客户端可能会从一个Representation切换到另外一个Representation
属性:
codecs=avc1.640028 解码器标准
bandwidth=3200000 需要带宽 3.2Mbps
8. segment 切片
每个Representation由一个或者多个segment组成,每个segment由一个对应的URL指定,也可能由相同的URL+不同的byte range指定。dash 客户端可以通过HTTP协议来获取URL(+byte range)对应的分片数据。MPD中描述segment URL的形式有多种,如Segment list,Segment template,Single segment。
单独介绍一个特殊的segment : Initialization Segment(初始化片段),
Representation的Segments一般都采用1个Init Segment+多个普通Segment的方式,还有一种形式就是Self Initialize Segment,这种形式没有单独的Init Segment,初始化信息包括在了各个Segment中。Init Segment中包含了解封装需要的全部信息,比如Representation中有哪些音视频流,各自的编码格式及参数。对于 ISO profile来说(容器为MP4),包含了moov box,H264的sps/pps数据等关键信息存放于此(avCc box)。
切片内容
fMP4(fragmented MP4),可以简单理解为分片化的MP4,是DASH采用的媒体文件格式,文件扩展名通常为(.m4s或直接用.mp4), 或者分别切分成mpa(音频), m4v(视频);
fMP4 由分片组成,可以按整个文件存储,也可以按分片存储:
如果按照单个文件存储,每个输出是一个m4s文件。
完整的fMP4视频可以描述为如下形式:
-
moov + (moof + mdat) * N
-
如果按照分片存储,每个分片是一个m4s文件,输出对应了多个m4s。
fMP4中的第一个分片,对应了DASH协议中Initialization Segment;其后的分片,则对应Media Segment。
注:
-
moov: Movie Box,它是一种container box,子box里包含了媒 体的metadata信息;
-
moof: moofbox,这个box是视频分片的描写叙述信息, 即分片(fragment)的标识
-
mdat: mdatbox 实际媒体数据。我们终于解码播放的数据都在这里面
前端工作
-
加载视频说明mpd文件
-
识别mpd内容
-
判断网速加载第一个适合该网速的视频片段, 解析视频数据
-
视频数据通过 MSE(Media Source Extensions) API 把视频数据传输给Video播放
-
不断通过加载视频片段大小/下载时间得出网速, 下载相应码率的视频
自己动手做DEMO
1. 下载MP4Box(切片工具)
https://gpac.wp.imt.fr/downloads/gpac-nightly-builds/
注: 安装后 application 中的 GPAC是个播放器, 我们需要的是它文件里的下面的MP4Box工具
-
执行命令
sudo /Applications/GPAC.app/Contents/MacOS/MP4Box -dash-strict 5000 -profile dashavc264:live -rap /Users/lijiancheng/Documents/mse/assert/foo.mp4#video /Users/lijiancheng/Documents/mse/assert/foo.mp4#audio -out index.mpd
-
引入Dash.js(开源库)
html
<script src="https://cdn.dashjs.org/latest/dash.all.min.js"></script> -
video src标明地址
html
<video data-dashjs-player autoplay src="./assert/index.mpd" controls></video>
别人的DASH DEMO
http://reference.dashif.org/dash.js/nightly/samples/dash-if-reference-player/index.html
http://demo.theoplayer.com/test-your-stream-with-statistics
https://bitmovin.com/demos/stream-test
DASH 切片工具
-
FFmpeg
-
MP4Box
Dash开源库
-
Dash.js 前端播放
联系人: | 北极星通公司 |
---|---|
电话: | 010-56545416 |
传真: | 010-82896426 |
Email: | support@bjsin.cn |
QQ: | 35338585 |
微信: | Aoku2017 | QQ群:241759321 |
地址: | 北京市中关村生命科学园创意园3-3-103 |