目录:DASH介绍

DASH(Dynamic Adaptive Streaming over HTTP)全称为“基于HTTP的动态自适应流”,是一种自适应比特率流技术,

可以是高质量流媒体可以通过传统的HTTP网络服务器以互联网传递,支持TS profile和ISO profile。

类似的方案还有:

Apple的HTTP Live Streaming(HLS)

Adobe的HTTP Dynamic Streaming(HDS)

Microsoft的Smooth Streaming(MSS)

1. DASH工作原理

Server端将媒体文件切割一个个时间长度相等的切片(Segment),每个切片被编码为不同的码率/分辨率。

Client端通过评估自身的性能和带宽情况,下载相应码率和分辨率的切片。带宽好,下载码率高的切片;带宽差,下载码率低的切片。

因为不同质量的切片在时间上是对齐的,所以在不同质量的切片之前切换的话,自然是顺畅的,从而达到无缝切换的效果。

2. DASH相比于HLS的优势:

更加通用且正式的码率切换流媒体协议,由MPEG组织制定,而非私人公司制定的。

相比广泛应用的HLS v3来说,可以减少多轨媒体的存储空间和传输带宽。

多轨媒体有不同的audio、video和字幕,如果要将它们组合的话,那会有很多种不同的组合,(多视角case会有不同的video track)

而FMP4是将audio、video和字幕分开的,没有封装在一起,那么就不需要将它们一一组合并存储以满足客户的不同需求。

客户需要什么版本的audio 或video或字幕,分开请求即可,从而减少服务器的存储空间。

基于模板的媒体描述文件相比m3u8文件,文件体积大大减小。

音视频开发教学视频:【免费】FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发-学习视频教程-腾讯课堂

sdn网络的基本模型(流媒体网络协议)(1)

企鹅群994289133领取资料

sdn网络的基本模型(流媒体网络协议)(2)

企鹅群994289133领取资料

媒体描述文件

MPEG-DASH中也有类似HLS M3U8这种媒体描述文件,官方命名为MPD文件,实际上是一个XML文件。在这个XML文件中,官方定义了描述流媒体的tag。

MPD

MPD(Media Presentation Description)全称为媒体呈现描述,是一个XML文件。

它完整的表示了视频的所有信息,包括视频长度,码率和分辨率等等。

请求DASH URL实际上就是获得一个MPD文件。

Periods

时间段。一个或者多个Period组成一个MPD文件,每个Period表示一个时间段的媒体。

比如某个码流的长度为60秒,假如分为三个Periods:Period1->015s;Period2->1640s;Period3->41~60s。

在同一个Period内,可用的媒体内容及其各个可用码率都不会发生变更。

直播情况下,服务器周期性的从MPD文件中移除已过时的Period,并增添新的Period。

AdaptationSet

自适应集合。描述同一时间段不同类型的媒体数据,如字幕,音频和视频。

自适应集合,一个或多个AdaptationSet组成一个Period,AdaptationSet包含了逻辑一致的媒体呈现的格式。

对于video来说,每个AdaptationSet由一组可供切换的不同码率/分辨率的码流组成。

而对于audio来说,每个audio AdaptationSet对应同一种语言的不同质量的音频。

Representation

媒体表示。描述同一媒体数据类型的不同质量版本,即每个Representation仅码率、分辨率不同,其它都一样。

一组媒体内容版本可切换的Representation组成一个AdaptationSet。

比如视频有高质量、中质量、低质量三个版本,那么就对应三个Representation。

Segment

片段,DASH媒体概念的最小单位,表示一段小的媒体片段。

每个Representation中的内容被切分成一段段Segments,使得客户端在播放时能够方便在不同的Representtation之间切换。

每个Segment由一个对应的URL指定,客户端通过访问该URL获得可播放的媒体数据。

Segment之间不允许相互覆盖,且是解码独立的,不依赖其它Segment。

对于承载ISO profile的segment,可分为Initialization Segment和Media Segment。

Initialization Segment包含MOOV,每个Representation只有一个。

Media Segment包含媒体数据(moof mdat),每个RePresentation有若干个。

所以,DASH对媒体的描述如下图所示:

MPD文件夹解析

DASH中定义了3种类型的MPD文件,对应3种Segment URL的解析方式:

1. SegmentBase形式:

SegmentBase形式的MPD文件中,一种媒体类型只有一个URL,该URL对应的媒体文件就是 init segment media segment,不再分段。

MPD文件如下:

<?xml version="1.0" encoding="UTF-8"?> <MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" maxSubsegmentDuration="PT5.0S" mediaPresentationDuration="PT9M57S" minBufferTime="PT5.0S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011,http://xmlns.sony.net/metadata/mpeg/dash/profile/senvu/2012" type="static" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd"> <Period duration="PT9M57S" id="P1"> <!-- Adaptation Set for main audio --> <AdaptationSet audioSamplingRate="48000" codecs="mp4a.40.5" contentType="audio" group="2" id="2" lang="en" mimeType="audio/mp4" subsegmentAlignment="true" subsegmentStartsWithSAP="1"> <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/> <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/> <Representation bandwidth="64000" id="2_1"> <BaseURL>DASH_vodaudio_Track5.m4a</BaseURL> </Representation> </AdaptationSet> ...

上例中,audio Representation只有一个URL,对应文件名为:DASH_vodaudio_Track5.m4a。

请求该MPD文件的URL为:

http://example.com/test.mpd

那么请求该文件的URL则为:

http://example.com/DASH_vodaudio_Track5.m4a

2. SegmentList形式:

SegmentList包含了若干个Segment URL的列表,客户端按照segment列表元素在MPD文件中出现的顺序来请求和播放相应的Segments

Segment URL就是每个Segment的地址,可以是绝对地址,可以是相对地址,也可以是字节范围。

Segment有分Initialize Segment和Media Segment。

这种形式的MPD文件的URL组合方式类似于HLS。MPD文件如下:

<?xml version="1.0" encoding="UTF-8"?> <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" publishTime="2021-03-28T08:52:08.008Z" mediaPresentationDuration="PT10M53.75S" minBufferTime="PT1.5S"> <ProgramInformation> <Title>ElephantsDream/ElephantsDream.smil</Title> </ProgramInformation> <Location>http://wowzaec2demo.streamlock.net/vod/_definst_/ElephantsDream/smil:ElephantsDream.smil/manifest_mvlist_w606759032.mpd</Location> <Period id="0" start="PT0.0S"> <AdaptationSet id="0" group="1" mimeType="video/mp4" lang="en" maxWidth="1280" maxHeight="720" par="16:9" frameRate="24" segmentAlignment="true" startWithSAP="1" subsegmentAlignment="true" subsegmentStartsWithSAP="1"> <Representation id="p0va0br2962000" codecs="avc1.64401f" width="1280" height="720" sar="1:1" bandwidth="2962000"> <SegmentList presentationTimeOffset="0" timescale="90000" duration="900000" startNumber="1"> <Initialization sourceURL="segment_ctvideo_ridp0va0br2962000_cinit_w606759032_mpd.m4s"/> <SegmentURL media="segment_ctvideo_ridp0va0br2962000_cn1_w606759032_mpd.m4s"/> <SegmentURL media="segment_ctvideo_ridp0va0br2962000_cn2_w606759032_mpd.m4s"/> <SegmentURL media="segment_ctvideo_ridp0va0br2962000_cn3_w606759032_mpd.m4s"/> <SegmentURL media="segment_ctvideo_ridp0va0br2962000_cn4_w606759032_mpd.m4s"/> <SegmentURL media="segment_ctvideo_ridp0va0br2962000_cn5_w606759032_mpd.m4s"/> <SegmentURL media="segment_ctvideo_ridp0va0br2962000_cn6_w606759032_mpd.m4s"/> ... </SegmentList> </Representation> ...

上例中,Initialization segment url的文件名为:

segment_ctvideo_ridp0va0br2962000_cinit_w606759032_mpd.m4s

media segment的文件名为:

segment_ctvideo_ridp0va0br2962000_cn1_w606759032_mpd.m4s segment_ctvideo_ridp0va0br2962000_cn2_w606759032_mpd.m4s …

请求该MPD文件的URL为:

http://example.com/test.mpd

那么,

[init segment]: http://example.com/segment_ctvideo_ridp0va0br2962000_cinit_w606759032_mpd.m4s [media segment]: http:// example.com/segment_ctvideo_ridp0va0br2962000_cn1_w606759032_mpd.m4s http:// example.com/segment_ctvideo_ridp0va0br2962000_cn2_w606759032_mpd.m4s

3. SegmentTemplate形式:

SegmentTemplate提供了一种通过给定的模板构造出segment url的机制,提供切片的文件名模板,替换其中的变量就可以得到实际的切片url文件名。这种形式可以大大的减小MPD文件大小。

有两种形式的SegmentTemplate:

基于数字的SegmentTemplate,MPD文件如下:

<?xml version="1.0" encoding="UTF-8"?> <MPD mediaPresentationDuration="PT634.566S" minBufferTime="PT2.00S" profiles="urn:hbbtv:dash:profile:isoff-live:2012,urn:mpeg:dash:profile:isoff-live:2011" type="static" xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd"> <BaseURL>./</BaseURL> <Period> <AdaptationSet mimeType="video/mp4" contentType="video" subsegmentAlignment="true" subsegmentStartsWithSAP="1" par="16:9"> <SegmentTemplate duration="120" timescale="30" media="$RepresentationID$/$RepresentationID$_$Number$.m4v" startNumber="1" initialization="$RepresentationID$/$RepresentationID$_0.m4v"/> <Representation id="bbb_30fps_1024x576_2500k" codecs="avc1.64001f" bandwidth="3134488" width="1024" height="576" frameRate="30" sar="1:1" scanType="progressive"/> <Representation id="bbb_30fps_1280x720_4000k" codecs="avc1.64001f" bandwidth="4952892" width="1280" height="720" frameRate="30" sar="1:1" scanType="progressive"/> </AdaptationSet> <AdaptationSet mimeType="audio/mp4" contentType="audio" subsegmentAlignment="true" subsegmentStartsWithSAP="1"> <Accessibility schemeIdUri="urn:tva:metadata:cs:AudioPurposeCS:2007" value="6"/> <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/> <SegmentTemplate duration="192512" timescale="48000" media="$RepresentationID$/$RepresentationID$_$Number$.m4a" startNumber="1" initialization="$RepresentationID$/$RepresentationID$_0.m4a"/> <Representation id="bbb_a64k" codecs="mp4a.40.5" bandwidth="67071" audioSamplingRate="48000"> <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/> </Representation> </AdaptationSet> </Period> </MPD>

上例中,构造segment的模板为:

init segment ---> $RepresentationID$/$RepresentationID$_0.m4v media segmen ---> $RepresentationID$/$RepresentationID$_$Number$.m4v

其中$RepresentationID$从每个representation中获得,替换不同的ID表示不同码率的码流。$Number$表示从startNumber的值开始,步长为1递增,请求该MPD文件的URL为:

http://example.com/test.mpd

那么,

init segment的其中一个url为: http://example.com/bbb_30fps_1024x576_2500k/bbb_30fps_1024x576_2500k_0.m4v media segment的第一个url为: http://example.com/bbb_30fps_1024x576_2500k/bbb_30fps_1024x576_2500k_1.m4v

  1. 基于时间的SegmentTemplate,MPD文件如下:

<?xml version="1.0" encoding="utf-8"?> <!-- Created with Unified Streaming Platform (version=1.10.35-23970) --> <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:dash:schema:mpd:2011" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd" type="static" mediaPresentationDuration="PT12M13.936333S" maxSegmentDuration="PT5S" minBufferTime="PT10S" profiles="urn:mpeg:dash:profile:isoff-live:2011,urn:com:dashif:dash264"> <Period id="1" duration="PT12M13.936333S"> <BaseURL>dash/</BaseURL> <AdaptationSet id="1" group="1" contentType="audio" lang="en" minBandwidth="64008" maxBandwidth="128002" segmentAlignment="true" audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" startWithSAP="1"> <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" initialization="tears-of-steel-$RepresentationID$.dash" media="tears-of-steel-$RepresentationID$-$Time$.dash"> <SegmentTimeline> <S t="0" d="190464" /> <S d="191488" r="1"/> <S d="192512" /> <S d="191488" /> <S d="192512", r="2"/> ... </SegmentTimeline> </SegmentTemplate> <Representation id="audio_eng=64008" bandwidth="64008"> </Representation> <Representation id="audio_eng=128002" bandwidth="128002"> </Representation>

上例中,构造segment的模板为:

init segment:tears-of-steel-$RepresentationID$.dash media segment:tears-of-steel-$RepresentationID$-$Time$.dash

其中$RepresentationID$从每个representation中获得,替换不同的ID表示不同码率的码流。

$Time$从SegmentTimeline获得,

在SegmentTimeLine中,t表示起始时间,d表示该segment播放时长,r表示重复次数。

请求该MPD文件的URL为:

http://example.com/test.mpd

那么,

init segment的其中一个url为:http://example.com/tears-of-steel-audio_eng=64008.dash media segment: 第一个url为:http://example.com/tears-of-steel-audio_eng=64008-0.dash --> (0) 第二个url为:http://example.com/tears-of-steel-audio_eng=64008-190464.dash -->(0 190464) 第三个url为:http://example.com/tears-of-steel-audio_eng=64008-381952.dash -->(0 190464 191488) 第四个url为:http://example.com/tears-of-steel-audio_eng=64008-573440.dash -->(0 190464 191488 191488) (因为r=1,所以切片时长重复1次)

,