MPEG-DASH简介

DASH 简介

DASH (Dynamic Adaptive Streaming over HTTP)是一种基于HTTP的使用TCP传输协议的自适应比特率的流媒体传输技术。

客户端将根据当前网络条件自适应地选择下载和播放当前网络能够承载的最高比特率版本,这样既可以保证当前媒体的质量又能避免由于码率过高导致的播放卡顿。

类似HLS,DASH由描述文件(mpd)和多分辨率的媒体文件(fmp4)组成。

MPD文件 简介

MPD (Media Presentation Description)是一个XML文件,它完整描述了DASH内容的所有信息,包括各类音视频参数、内容分段时长、不同媒体分段的码率和分辨率以及对应的访问地址URL等等

image.png

Period

Period代表一段连续的视频片段, 一个DASH文件可以包含一个或多个Periods

AdaptationSet

一个Period由一个或多个AdaptationSets组成。每个AdaptationSet包含了逻辑一致的可供切换的不同码率的码流(Representation)。

Representation

每个Representation表示同一媒体内容但编码参数互不相同的音视频数据。包含了相同媒体内容的不同配置,即不同的分辨率、码率等,以供客户端根据自身的网络条件和性能限制来选择合适的版本下载播放。

Segment

每个Representation中的内容按时间或者其他规则被切分成一段段Segments,使得客户端在播放时能够灵活地在不同的Representations之间进行切换。每个Segment都有一个唯一的与之对应的URL地址,也可能由相同的URL与不同的byte range指定。DASH客户端可以通过HTTP协议来获取URL对应的分片数据。

Segments可以进一步划分为更小的Subsegments,Subsegments表示Segment中一些更小的access units。Segment index描述了Subsegments的presentation time range和byte position,客户端可以先获取Segment index,再通过HTTP 1.1的byte range requests去请求相应的Subsegment。

Representation中会包含(且仅包含)这几个选项之中的一个:
(1) 一个或多个SegmentList元素;
(2) 一个SegmentTemplate;
(3) 一个或多个BaseURL元素,最多一个SegmentBase元素,不含有SegmentTemplate或SegmentList元素。

(1) SegmentList

SegmentList包含了一个SegmentURL的列表,客户端按照segment列表元素在MPD文件中出现的顺序来请求和播放相应的Segments。SegmentURL即为每个Segment的地址,可以是绝对地址,也可以是相对地址,也可能是字节范围。看一个示例:


image.png

注:SegmentList duration表示每个Segment的目标长度为10S,Initialization sourceURL中包含了该Representation的初始化信息。

(2) SegmentTemplate

SegmentTemplate提供了一种通过给定的模板构造出一个segment list的机制,这意味着一些特定的标识符将被动态值取代。在SegmentList模式中为每个Segment构造一个URL,当Representation中分段较多时,会使得MPD文件变得很大,而SegmentTemplate模式则可以通过少数几行描述来构造出一系列segments。有两种形式的SegmentTemplate,一种是基于数字的SegmentTemplate,另一种是基于时间的SegmentTemplate。

基于数字的SegmentTemplate见如下示例:
image.png

上例中,通过“SegmentTemplate”元素中的地址和startNumber就可以构造出不同的segmentlist了,只需要短短几行表述,使得MPD文件更加简洁和紧凑。这种方式特别适用于含有多个Representations的长视频,能够有效压缩MPD文件的大小,提升客户端的下载速度和播放启动速度。

基于时间的SegmentTemplate见如下例子:
image.png

“SegmentTimeline”字段中描述了当前Representation中第一个Segment的起始时间,duration,以及段的repeat次数。

(3) SegmentBase

在MPEG-DASH中,SegmentBase是当Representation中只有一个media segment存在时使用的方式。举个例子


image.png

Representation内仅有一个Segment,BaseURL为http://cdn.bitmovin.net/bbb/video-1500k.mp4,SegmentBaseindexRange="0-834"表示SAP和其他初始化信息包含在开头的834字节中。

MPD文件举例

<?xml version="1.0"?>
<!-- MPD file Generated with GPAC version 0.7.2-DEV-rev452-g24e21d719-work  at 2018-04-17T08:38:52.245Z-->
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500S" type="static" mediaPresentationDuration="PT0H2M35.371S" maxSegmentDuration="PT0H0M7.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
 <ProgramInformation moreInformationURL="http://gpac.io">
  <Title>staging/dash-vod-single-segment/manifest-h264.mpd generated by GPAC</Title>
 </ProgramInformation>

 <BaseURL>service-location-0/</BaseURL>
 <BaseURL>service-location-1/</BaseURL>
 <Period duration="PT0H2M35.371S">
  <AdaptationSet segmentAlignment="true" lang="eng" subsegmentAlignment="true" subsegmentStartsWithSAP="1">
   <Representation id="140" mimeType="audio/mp4" codecs="mp4a.40.2" startWithSAP="1" bandwidth="191063">
    <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
     <SegmentList>
      <SegmentURL media="audio.mp4"/>
     </SegmentList>
   </Representation>
  </AdaptationSet>
  <AdaptationSet segmentAlignment="true" maxWidth="1920" maxHeight="1080" maxFrameRate="30" par="16:9" lang="eng" subsegmentAlignment="true" subsegmentStartsWithSAP="1">
   <Representation id="2" mimeType="video/mp4" codecs="avc1.4D401F" width="1280" height="720" frameRate="30" sar="1:1" startWithSAP="1" bandwidth="719635">
     <SegmentList>
      <SegmentURL media="video-avc-main-720.mp4"/>
     </SegmentList>
   </Representation>
   <Representation id="3" mimeType="video/mp4" codecs="avc1.4D4028" width="1920" height="1080" frameRate="30" sar="1:1" startWithSAP="1" bandwidth="1005252">
     <SegmentList>
      <SegmentURL media="video-avc-main-1080.mp4"/>
     </SegmentList>
   </Representation>
  </AdaptationSet>
 </Period>
</MPD>

备注:

在媒体播放过程中,虽然可以方便地在不同的码率(Representations)之间,但并不能做到在码流的任意点切换。需要注意的是,Segments之间不允许互相覆盖(overlap),而且Segments之间是解码独立的,也就是每个Segments可以单独解码,而不依赖其之前或之后的其他Segments,这就涉及到了Stream Access Point (SAP)的概念。SAP可以简单理解为I帧或IDR帧,一般每个Segments的起始帧都是IDR帧(H.264 / AVC),这样就保证了每个Segments传输完成之后,可以切换到其他的Representation。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容