SegmentTemplate利用MPD中的属性代入公式计算可以得到相关通配符的数值,来提供给客户端进行相关地址解析。相较于segmentList,使用 SegmentTemplate 的方式,能够很大的减小 MPD 文件大小,不过会额外增加以下客户端解析 MPD 的时间,在直播情况下,MPD中的segment选择segmentTemplate,而不是segmentList。

  对于SegmentTemplate,使用了$Number$ 和$Time$通配符进行替换。对于initialization,表示 Initialization Segment 的具体地址,使用了通配符$RepresentationID$,通配符$RepresentationID$对应于 Representation 标签中的 id 属性。

DASH流媒体MPD中的segmentTemplate-LMLPHP

  上图是DASH标准中对通配符的定义。

1、$Number$通配符的使用

  在使用$Number$通配符的时候,represention中的segment用一个SegmentTemple来表示。Segment的URL中的$Number$是从SegmentTemple的startNumber开始的,计算公式为:

((时钟时间 - availabilityStartTime ) / (duration / timescale )) + startNumber

  通配符$Number$表示当前的segment在represention中的序号。

eg:

 DASH流媒体MPD中的segmentTemplate-LMLPHP

  从上图可知:

当前播放设备的时钟: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。基本格式如下图所示:

DASH流媒体MPD中的segmentTemplate-LMLPHP

 t:是当前segment在当前represention的开始时间;

d:一个segment的持续时间(duration);

r:相同duration的segment还有几个。

  通配符$Time$用来表示当前segment开始播放的时间,当segment的持续时间(d)发生变化的时候,MPD会用新的S标签来记录新的segment的URL。

eg:

 DASH流媒体MPD中的segmentTemplate-LMLPHP

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

09-18 10:32