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. win7下提权代码

    inline BOOL SetPrivilege() { HANDLE hProcess, hToken; TOKEN_PRIVILEGES NewState; LUID luidPrivilegeL ...

  2. 【原创】Oracle 11g R2 Client安装配置说明(多图详解)

    1. 准备工作 安装Oracle11gR2client的时候,如果刚从网上下载的Oracle client,可能无法再2008 R2或者2012 R2的服务器上面运行. 报错:[INS-13001]环 ...

  3. 浅谈正则表达式-PHP为例

    第一次比较系统的学习正则表达式,本篇文章以PHP语言为例来学习. 基本概念 正则表达式=普通字符(如a-z)+分隔符(正斜线(/).hash符号(#) 以及取反符号(~))+特殊字符(称为元字符) 两 ...

  4. 解决win10下微信开发者工具点击错位问题

    在系统设置->显示->更改文本.应用等项目的大小选项中将百分比改为100%即可.

  5. (11)oracle触发器

    触发器是特殊的存储过程. 每当一个特定的数据操作语句(inster,update,delete)在指定的表上触发时,Oracle自动的地执行触发器中定义的语句序列. create trigger 触发 ...

  6. spark-join算子

  7. 分析dump

    一.使用jmap工具生成dump文件 二.MAT工具的下载和安装 三.使用MAT工具进行内存泄露分析  -- Step 1 :  ps –ef | grep <process> (whic ...

  8. 「JXOI2018」游戏

    注意输出的应该是 所有方案的和,,而不是期望. 我们不妨把依赖关系建图,可以发现 所有没有入度的点都被查水表了一次 是 游戏结束的 充要条件. 于是我们只需要知道有多少没有入度的点,然后再排列算一算就 ...

  9. MySQL中in子查询会导致无法使用索引问题(转)

    MySQL的测试环境 测试表如下 create table test_table2 ( id int auto_increment primary key, pay_id int, pay_time ...

  10. 设计模式之中介者模式(php实现)

    github地址:https://github.com/ZQCard/design_pattern /** * 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性. ...