DASH

为什么选择DASH

YouTube采用DASH!其网页端及移动端APP都使用了DASH。DASH的其他采用者包括:Netflix, Hulu, …

什么是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)!


图1. MPD的层次示意图 (每个Rrepresentation使用fMP4文件格式)

fMP4

fMP4(fragmented MP4),可以简单理解为分片化的MP4,是DASH采用的媒体文件格式,文件扩展名通常为(.m4s或直接用.mp4)。


图2. 普通MP4与fMP4组织结构对比,fMP4与DASH 分片概念对照

图2说明:

普通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。

YouTube调研

一段15’ 720分辨率视频,YouTube有如下Representation: 
1. audio1 id:139 codec:HE-AAC 采样率22050 分片:5 
2. audio2 id:140 codec:AAC-LC 采样率44100 分片:5 
3. video1 id:133 codec:264 main profile level1.2 240p 分片:4 
4. video2 id:134 codec:264 main profile level2.0 360p 分片:4 
5. video3 id:135 codec:264 main profile level2.0 480p 分片:4 
6. video4 id:160 codec:264 main profile level1.1 144p 分片:4 
7. video5 id:136 codec:264 main profile level3.0 720p 分片:4

关注视频部分,4个分片包含:1个Init Seg,3个Media Seg,视频内容部分分别为5.12s 5.12s 4.76s。

正常顺序播放 

图3. 正常顺序播放的时序图

  1. 下载MPD
  2. 下载Init Seg
  3. 下载Media Seg(s) 
    在第6s已经完成所有视频分片的下载。

切换行为 

图4. 发生switch的时序图

切换前,Representation 0的所有分片已经下载完成,交互流程同上, 
第8s进行画质切换: 
1. 下载Representation 1的Init Seg # 每次切换都会先下载Init Seg 
2. 下载Representation 1 当前所在分片!Seg2 
3. 下载后续分片。

说明:YouTube在播放Rep0 Seg2期间发生切换,会下载Repr1的Seg2,这属于YouTube的播放策略。很多DASH播放器,此时会直接请求Repr1的Seg3。

DASH应用

1)FFmpeg 转码

FFmpeg支持DASH封装,仿YouTube格式的命令:

ffmpeg -hide_banner -y -threads 0 -i INPUT_VIDEO -filter_complex 'split=2[s0][s1];[s0]scale=480:-2[480s];[s1]scale=360:-2[360s]' -map '[480s]' -c:v:0 libx264 -crf 25 -preset veryslow -map '[360s]' -c:v:1 libx264 -crf 27 -preset veryslow -map a -c:a:0 libfdk_aac -ar:a:0 22050 -map a -c:a:1 libfdk_aac -ar:a:1 44100 -g 150 -sc_threshold 0 -b_strategy 0 -min_seg_duration 5000 -use_timeline 0 -use_template 1 -single_file  1 -window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" -f dash OUTPUT.mpd

  

输出:

  • mpd描述文件
  • m4s 输出文件 
    视频两个文件分别是480p crf25 和360p crf 27。 
    音频两个文件分别是22050采样率和44100采样率。 
    独立文件内部每个分片时长5s。

2)FFmpeg 转封装

若存在兼容普通mp4转码的需求,可以直接对已编码视频转封装得到DASH文件,避免重复编码。 
要点在于保证编码命令中的GOP length与DASH要求匹配,否则会发生卡顿问题,需要在播放器端做额外处理。

3) MP4Box 转封装

mp4box -dash 5000 -frag 5000 -rap -frag-rap -profile dashavc264:onDemand ld.mp4 hd.mp4 audio.m4a -out OUTPUT.mpd

  

4)DASH播放

使用开源的网页端DASH player dash.js可以播放,如下图。 

图5. 后台转码的实际播放效果

DASH简介及使用方法(FFmpeg, MP4Box)的更多相关文章

  1. NetCat简介与使用方法

    精品学习网考试频道小编应广大考生的需要,特为参加考试的考生策划了“NetCat简介与使用方法”专题等有关资料,供考生参考! 在入侵中它是最经典的工具之一 ,NetCat被所有的网络安全爱好者和研究者称 ...

  2. PHP Socket(套接字连接)扩展简介和使用方法

    PHP socket扩展是基于流行的BSD sockets,实现了和socket通讯功能的底层接口,它可以和客户端一样当做一个socket服务器. 使用这些函数时请注意,虽然他们中有很多和C函数同名的 ...

  3. nc之一:NetCat简介与使用方法

    精品学习网考试频道小编应广大考生的需要,特为参加考试的考生策划了“NetCat简介与使用方法”专题等有关资料,供考生参考! 在入侵中它是最经典的工具之一 ,NetCat被所有的网络安全爱好者和研究者称 ...

  4. How to install ffmpeg,mp4box,mplayer,mencoder,flvtool2,ffmpeg-php on centos

    1. Enable RPM Fusion yum repository The CentOS rpm packages of ffmpeg, mplayer, mencoder and MP4Box ...

  5. git简介及使用方法

    一.git简介及安装1.git简介 Git 是用于 Linux 内核开发的版本控制工具.与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持, ...

  6. Retrofit简介与使用方法(翻译)

    简介 Retrofit 是一个Square开发的类型安全的REST安卓客户端请求库.这个库为网络认证.API请求以及用OkHttp发送网络请求提供了强大的框架.Retrofit库让从web api下载 ...

  7. JavaScript简介与使用方法

    1.JavaScript简介 1.1.JavaScript简史 最初:网络通信很慢,网页上的数据要传送到数据库验证,然后再返回错误结果,找客观过程要等很久,于是,网景公司开发出一门新语言,当时Java ...

  8. SAP Web Service简介与配置方法

    [版权声明]本文为博主原创文章,转载请在明显位置注明出处. 一. SAP Web Service简介 二. SAP Web Service配置准备工作 1. 通过RZ10配置服务器名称和其他参数 2. ...

  9. Afinal简介和使用方法

    Afinal简介 Afinal 是一个android的sqlite orm 和 ioc 框架.同时封装了android中的http框架,使其更加简单易用: 使用finalBitmap,无需考虑bitm ...

随机推荐

  1. Simditor 富文本编辑器

    Simditor 是团队协作工具 Tower 使用的富文本编辑器. 相比传统的编辑器它的特点是: 功能精简,加载快速 输出格式化的标准 HTML 每一个功能都有非常优秀的使用体验 兼容的浏览器:IE1 ...

  2. MVC中@Html.Action的用法(类似自定义控件)

    MVC项目中如果有公共部分的代码就可以单独拿出来作为控件来用(比如头部和底部代码).跟ASP.NET中的ASCX实现的效果一样,但MVC比它方便的多. 一.@Html.Action的用法 @Html. ...

  3. JquerySession使用

    添加数据 $.session.set('key', 'value') 删除数据 $.session.remove('key'); 获取数据 $.session.get('key'); 清除数据 $.s ...

  4. web前端到底是什么?有前途吗

    web前端到底是什么? 某货: “前几年前端开发人员鱼目混杂,技术参差不齐,相对学习起来不规范,导致> 前端开发人员聚集,所以现在前端工种和工资还是没得到普遍重视,但近2年来,> > ...

  5. Educational Codeforces Round 32

    http://codeforces.com/contest/888 A Local Extrema[水] [题意]:计算极值点个数 [分析]:除了第一个最后一个外,遇到极值点ans++,包括极大和极小 ...

  6. 2017 CCPC 湘潭邀请赛

    都tm快一年了我还没补这套题……再不补怕是要留给退役后乐 Problem A 把$n * (n + 1)$的矩阵补成$(n + 1) * (n + 1)$的,然后高斯消元. Problem B 一看题 ...

  7. 模板—字符串—后缀自动机(后缀自动机+线段树合并求right集合)

    模板—字符串—后缀自动机(后缀自动机+线段树合并求right集合) Code: #include <bits/stdc++.h> using namespace std; #define ...

  8. python3 全栈开发 -- 面向对象 类的组合和封装

    一.类的组合 1.什么是组合 组合:描述的是类与类之间的关系,是一种什么有什么关系 一个类产生的对象,该对象拥有一个属性,这个属性的值是来自于另外一个类的对象 2.什么是继承(回顾一下) 继承:描述的 ...

  9. [COCI2015]JABUKE

    题目大意: 一个$n\times m(n,m\leq500)$的网格图中有若干个标记点,有$q(q\leq10^5)$个操作,每次新加入一个标记点,并询问和新加入点最近的点的距离. 思路: 记录对于每 ...

  10. thinkphp Auth认证类 比RBAC更好的权限认证方式(Auth类认证)

    thinkphp Auth认证类 比RBAC更好的权限认证方式(Auth类认证)    Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比 ...