MPEG-DASH简介

1. DASH介绍

DASH的全称是Dynamic Adaptive Streaming over HTTP。DASH是一种新的视频传输协议,由微软、苹果、Adobe等公司共同主导完成,该标准于2012年制定完成,是一种自适应码率的流媒体技术,其主要特点是视频切片基于HTTP传输,可以利用现有的HTTP网络架构(专门的服务器和CDN等)传输流媒体。

MPEG-DASH简介_第1张图片

2. DASH基本结构

DASH将媒体文件切分成小的视频片段,每个小的片段都编码成几种不同的码率,甚至会存在不同的分辨率,以满足不同客户端的网络需求。比如,DASH可以根据当前的网络状况,来下载合适的码率的视频片段,从而避免停顿或重新缓冲。

MPEG-DASH简介_第2张图片

如上图所示,DASH整个系统可以分成服务器和客户端两个模块,视频片段的封装格式,支持MPEG-2 TS、MP4等多种格式,并且,可以使用h.265,H.264,AVS,VP9等多种编码器进行编码。服务器端通过MPD(media presentation description)文件来描述媒体信息,包括,是直播还是点播、视频切片的大小,有几种不同的码率以及每个视频片段对应的URL地址等。客户端通过MPD文件就可以知道整个将要播放的媒体信息。

3.1 切分和播放示例

如下图所以,将一段1080p,10s的视频切分成5种码率5个片段,每个片段2s的视频。

MPEG-DASH简介_第3张图片

在播放时候,可以按照下图的请求方式来播放,当然以这种请求方式进行请求的话,分辨率切换这么快,观看体验肯定很差。

MPEG-DASH简介_第4张图片

3.2 MPD介绍

MPD(media presentation description)是一种XML文件,描述了视频的所有信息,在白皮书的Part1部分有详细的介绍。MPD通过不同的标签,层次化的描述媒体信息,层次结构可以见下图,
MPEG-DASH简介_第5张图片

MPD主要标签简介,

Period : 一段连续的视频片段,标注了视频的时长信息,也可以看做是更新mpd文件的最长时长。

AdaptationSet : 每个Period包含多个音频、视频内容的集合。视频内容可以是音频视频混合的,这样一个Adaptation Set就足够了。或者,也可以用基本流(Elemental Stream),以支持多语言音频功能。

Representaiton : 每一个Adaptation Set含多个Representation,每个Representation代表一个独立的流。比如,一个Representation可以是640X480 @ 800Kbps的一个流,而另一个Representation 代表640X480 @ 500kbps的一个流。通过这样不同的Representation, DASH来达到自适应码率的目的。Representaiton这个标签描述了视频分辨率、码率、编码方式、帧率信息等。

Segment :每一个Representation由一系列的媒体段(Segment)组成。

实际播放的时候,视频会在一个AdaptationSet中的不同Representaiton 之间切换码率,会依次请求该Representaiton下不同Segment序列。

3.3 MPD代码

一个常见的mpd文件如下,可以清楚的看到各个字段是如何描述的。


<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H12M14.17S" profiles="urn:mpeg:dash:profile:isoff-live:2011">
<ProgramInformation moreInformationURL="http://gpac.sourceforge.net">
<Title>
dashed/TearsOfSteel_4s_simple_2014_05_09.mpd generated by GPAC
Title>
ProgramInformation>
<Period duration="PT0H12M14.17S">
<AdaptationSet segmentAlignment="true" maxWidth="1920" maxHeight="1080" maxFrameRate="24" par="16:9">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<SegmentTemplate timescale="24000" media="tos_$Bandwidth$bps/TearsOfSteel_4s_$Number$.m4s" startNumber="1" duration="96000" initialization="tos_$Bandwidth$bps/TearsOfSteel_4s__init.mp4"/>
<Representation id="1920x1080 10.0Mbps" mimeType="video/mp4" codecs="avc1.4d4029" width="1920" height="1080" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="10045361"/>
<Representation id="1920x1080 6.0Mbps" mimeType="video/mp4" codecs="avc1.4d4028" width="1920" height="1080" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="6025488"/>
<Representation id="1920x1080 4.0Mbps" mimeType="video/mp4" codecs="avc1.4d4028" width="1920" height="1080" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="4011653"/>
<Representation id="1920x1080 3.0Mbps" mimeType="video/mp4" codecs="avc1.4d4028" width="1920" height="1080" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="3004351"/>
<Representation id="1280x720 2.4Mbps" mimeType="video/mp4" codecs="avc1.4d401f" width="1280" height="720" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="2416099"/>
<Representation id="1280x720 1.5Mbps" mimeType="video/mp4" codecs="avc1.4d401f" width="1280" height="720" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="1506971"/>
<Representation id="640x360 807.0kbps" mimeType="video/mp4" codecs="avc1.4d401e" width="640" height="360" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="807450"/>
<Representation id="640x360 505.0kbps" mimeType="video/mp4" codecs="avc1.4d401e" width="640" height="360" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="504741"/>
<Representation id="480x270 253.0kbps" mimeType="video/mp4" codecs="avc1.4d4015" width="480" height="270" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="253270"/>
AdaptationSet>
<AdaptationSet segmentAlignment="true" bitstreamSwitching="true">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<SegmentTemplate timescale="48000" media="tos_$Bandwidth$bps/TearsOfSteel_4s_$Number$.m4s" startNumber="1" duration="191472" initialization="TearsOfSteel_4s_simple_2014_05_09_set2_init.mp4"/>
<Representation id="audio 48000kHz 66.0kbps" mimeType="audio/mp4" codecs="mp4a.40.2" audioSamplingRate="48000" startWithSAP="1" bandwidth="65509"/>
<Representation id="audio 48000kHz 130.0kbps" mimeType="audio/mp4" codecs="mp4a.40.2" audioSamplingRate="48000" startWithSAP="1" bandwidth="129510"/>
<Representation id="audio 48000kHz 192.0kbps" mimeType="audio/mp4" codecs="mp4a.40.2" audioSamplingRate="48000" startWithSAP="1" bandwidth="191511"/>
AdaptationSet>
<AdaptationSet segmentAlignment="true" lang="eng">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="subtitle"/>
<SegmentTemplate timescale="1000" media="tos_$Bandwidth$bps/TearsOfSteel_4s_$Number$.m4s" startNumber="1" duration="4000" initialization="tos_$Bandwidth$bps/TearsOfSteel_4s__init.mp4"/>
<Representation id="subtitles" mimeType="video/mp4" codecs="wvtt" startWithSAP="1" bandwidth="101"/>
AdaptationSet>
Period>
MPD>

4. 播放器开源开发平台

ITEC公示了一些关于(dash的开发平台),下面对几个用过的做一下介绍(链接都需要科学上网方式),

ExoPlayer是google开源的android平台上的DASH播放器。

DASH-JS
用javascript写的dash播放器,只需要几行代码就可以将播放器嵌入到你的网页中,现在有两种自适应算法,一种基于预测带宽的,一种BOLA的方式。两种效果经过测试都一般(不知道测试的准不准确)。

libdash
用C++ + QT开发的Windows桌面版版本,没有内置的自适应算法,代码中大量用到了Observer设计模式,还有工厂模式等,是学习C++面向对象思想以及设计模式的 很好示例。

Dataset
我使用是就是这个数据集,包含了几个经典的视频。

5. 优缺点评价

Bitmovion发布了一个DASH同HLS等其他HAS传输协议的对比文章,见参考文献2,贴一张对比图,可以清晰的看出其区别来,

MPEG-DASH简介_第6张图片

可见DASH优点很多,而且还是国际标准,但是,现在业界的主流还是HLS,一方面由于其推广的较早,还有一方面在于苹果生态圈的庞大。新生的DASH标准,在Youtube等平台已经有了应用,而且在VR视频传输中有很大的潜力。

参考文献

1. MPEG-DASH 流媒体技术介绍(上)

2. MPEG-DASH vs. Apple HLS vs. Microsoft Smooth Streaming vs. Adobe HDS

3. encoding.com

4. ITEC

5. 微软DASH介绍


last modified: 2017-8-8
by. Tony ([email protected])

你可能感兴趣的:(HAS)