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的地址。