sdn网络的基本模型(流媒体网络协议)
- DASH介绍
- 1. DASH工作原理
- 2. DASH相比于HLS的优势:
- 媒体描述文件
- MPD文件夹解析
- 1. segmentBase形式:
- 2. SegmentList形式:
- 3. SegmentTemplate形式:
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音视频流媒体高级开发-学习视频教程-腾讯课堂
企鹅群994289133领取资料
企鹅群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
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
- 基于时间的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次)
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com