SegmentTemplate利用MPD中的屬性代入公式計算可以得到相關萬用字元的數值,來提供給客戶端進行相關地址解析。相較於segmentList,使用 SegmentTemplate 的方式,能夠很大的減小 MPD 檔案大小,不過會額外增加以下客戶端解析 MPD 的時間,在直播情況下,MPD中的segment選擇segmentTemplate,而不是segmentList。
對於SegmentTemplate,使用了$Number$ 和$Time$萬用字元進行替換。對於initialization,表示 Initialization Segment 的具體地址,使用了萬用字元$RepresentationID$,萬用字元$RepresentationID$對應於 Representation 標籤中的 id 屬性。
上圖是DASH標準中對萬用字元的定義。
1、$Number$萬用字元的使用
在使用$Number$萬用字元的時候,represention中的segment用一個SegmentTemple來表示。Segment的URL中的$Number$是從SegmentTemple的startNumber開始的,計算公式為:
((時鐘時間 - availabilityStartTime ) / (duration / timescale )) + startNumber
萬用字元$Number$表示當前的segment在represention中的序號。
eg:
從上圖可知:
當前播放裝置的時鐘:2018-11-16T19:18:30Z
MPD的 availabilityStartTime 屬性:2018-11-16T19:08:30Z
SegmentTemplate 的 duration 屬性:90000
SegmentTemplate 的 timescale 屬性:30000
SegmentTemplate 的 startNumber 屬性:175032
得 ((2018-11-16T19:18:30Z - 2018-11-16T19:08:30Z) / (90000/30000)) + 175032,化簡得 (600 秒播放時間) / (3 秒持續時間) = 200 個segment。將這些segment與 175032 起始segment相加,當前segment的 萬用字元$Number$的數值為175232,這樣就得到了segment的URL。
2、$Time$萬用字元的使用
在使用$Time$萬用字元的時候,segmentTemplate會使用SegmentTimeline 來描述每個segment開始播放的時間。每個 SegmentTemplate 有 一個 SegmentTimeline。
SegmentTimeLine可以通過多個S標籤,來標識在相同duration的segment。基本格式如下圖所示:
t:是當前segment在當前represention的開始時間;
d:一個segment的持續時間(duration);
r:相同duration的segment還有幾個。
萬用字元$Time$用來表示當前segment開始播放的時間,當segment的持續時間(d)發生變化的時候,MPD會用新的S標籤來記錄新的segment的URL。
eg:
第一個segment的 URL 為 155_video_1_2_255197799.mp4,最後一個segment的URL為 155_video_1_2_258441039.mp4。一個segment的持續時間為360360(屬性d),可以得到下一個segment的URL為 155_video_1_2_255558159.mp4。和第一個segment有相同持續時間的segment有8個(屬性r),由255197799+360360*[(0~8)+1]可以得到中間segment的地址。