流媒体DASH协议详解

2019-09-27 15:35:00
admin
原创
13848
摘要: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(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的整个流程



  1. 主播直播流上传

  2. 服务器的编解码封装

  3. 流媒体分发器

    1. mpd文件

    2. 切割后的媒体文件

  4. 客户端

    1. 客户端加载mpd文件

    2. 解析MPD文件, 组成文件下载链接

    3. 当前的网速和支持的编码加载相应的视频片段进行播放


MPD文件内容



MPD文件构成


  1. MPD 标签
    属性:  
    profiles: 不同的profile对应不同的MPD要求和Segment格式要求mediaPresentationDuration:整个节目的时长
    minBufferTime: 至少需要缓冲的时间
    type:点播对应static,直播对应dynamic
    availabilityStartTime=2019-05-22T22:16:57Z:如果是直播流的话,则必须提供,代表MPD中所有Seg从该时间开始可以request了
    minimumUpdatePeriod=PT10H:至少每隔这么长时间,MPD就有可能更新一次,只用于直播流

  2. BaseURL 根目录

该元素可以在MPD\\Period\\AdaptationSet\\Representation同时出现,若同时出现,则层层嵌套;在每一层也可以出现多次,默认使用第一个BaseURL;

  3. Period 区段

一条完整的mpegdash码流可能由一个或多个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视频可以描述为如下形式:  

  1. moov + (moof + mdat) * N  

  2. 如果按照分片存储,每个分片是一个m4s文件,输出对应了多个m4s。

    fMP4中的第一个分片,对应了DASH协议中Initialization Segment;其后的分片,则对应Media Segment。

注:

  1. moov: Movie Box,它是一种container box,子box里包含了媒 体的metadata信息;

  2. moof: moofbox,这个box是视频分片的描写叙述信息, 即分片(fragment)的标识

  3. mdat: mdatbox 实际媒体数据。我们终于解码播放的数据都在这里面

前端工作

  1. 加载视频说明mpd文件

  2. 识别mpd内容

  3. 判断网速加载第一个适合该网速的视频片段, 解析视频数据

  4. 视频数据通过 MSE(Media Source Extensions) API 把视频数据传输给Video播放

  5. 不断通过加载视频片段大小/下载时间得出网速, 下载相应码率的视频

自己动手做DEMO

1.   下载MP4Box( 切片工具)

https://gpac.wp.imt.fr/downloads/gpac-nightly-builds/


:     安装后  application   中的  GPAC 是个播放器,   我们需要的是它文件里的下面的MP4Box 工具


  1. 执行命令

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
  1. 引入Dash.js(开源库)
    html
    <script src="https://cdn.dashjs.org/latest/dash.all.min.js"></script>

  2. 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 切片工具

  1. FFmpeg

  2. MP4Box

Dash开源库

  1. Dash.js 前端播放


发表评论
评论通过审核后显示。
文章分类
联系我们
联系人: 北极星通公司
电话: 010-56545416
传真: 010-82896426
Email: support@bjsin.cn
QQ: 35338585
微信: Aoku2017 | QQ群:241759321
地址: 北京市中关村生命科学园创意园3-3-103