DASH 簡介
DASH (Dynamic Adaptive Streaming over HTTP)是一種基于HTTP的使用TCP傳輸協議的自適應比特率的流媒體傳輸技術矾屯。
客戶端將根據當前網絡條件自適應地選擇下載和播放當前網絡能夠承載的最高比特率版本,這樣既可以保證當前媒體的質量又能避免由于碼率過高導致的播放卡頓浮入。
類似HLS盐固,DASH由描述文件(mpd)和多分辨率的媒體文件(fmp4)組成。
MPD文件 簡介
MPD (Media Presentation Description)是一個XML文件外里,它完整描述了DASH內容的所有信息领铐,包括各類音視頻參數、內容分段時長荐糜、不同媒體分段的碼率和分辨率以及對應的訪問地址URL等等
Period
Period代表一段連續(xù)的視頻片段, 一個DASH文件可以包含一個或多個Periods
AdaptationSet
一個Period由一個或多個AdaptationSets組成巷怜。每個AdaptationSet包含了邏輯一致的可供切換的不同碼率的碼流(Representation)。
Representation
每個Representation表示同一媒體內容但編碼參數互不相同的音視頻數據狞尔。包含了相同媒體內容的不同配置丛版,即不同的分辨率、碼率等偏序,以供客戶端根據自身的網絡條件和性能限制來選擇合適的版本下載播放。
Segment
每個Representation中的內容按時間或者其他規(guī)則被切分成一段段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的地址灵嫌,可以是絕對地址,也可以是相對地址葛作,也可能是字節(jié)范圍寿羞。看一個示例:
注:SegmentList duration表示每個Segment的目標長度為10S赂蠢,Initialization sourceURL中包含了該Representation的初始化信息绪穆。
(2) SegmentTemplate
SegmentTemplate提供了一種通過給定的模板構造出一個segment list的機制,這意味著一些特定的標識符將被動態(tài)值取代客年。在SegmentList模式中為每個Segment構造一個URL霞幅,當Representation中分段較多時,會使得MPD文件變得很大量瓜,而SegmentTemplate模式則可以通過少數幾行描述來構造出一系列segments司恳。有兩種形式的SegmentTemplate,一種是基于數字的SegmentTemplate绍傲,另一種是基于時間的SegmentTemplate扔傅。
基于數字的SegmentTemplate見如下示例:
上例中,通過“SegmentTemplate”元素中的地址和startNumber就可以構造出不同的segmentlist了烫饼,只需要短短幾行表述猎塞,使得MPD文件更加簡潔和緊湊。這種方式特別適用于含有多個Representations的長視頻杠纵,能夠有效壓縮MPD文件的大小荠耽,提升客戶端的下載速度和播放啟動速度。
基于時間的SegmentTemplate見如下例子:
“SegmentTimeline”字段中描述了當前Representation中第一個Segment的起始時間比藻,duration铝量,以及段的repeat次數倘屹。
(3) SegmentBase
在MPEG-DASH中,SegmentBase是當Representation中只有一個media segment存在時使用的方式慢叨。舉個例子
Representation內僅有一個Segment纽匙,BaseURL為http://cdn.bitmovin.net/bbb/video-1500k.mp4,SegmentBaseindexRange="0-834"表示SAP和其他初始化信息包含在開頭的834字節(jié)中拍谐。
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巫员。