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

最新文章

  1. Linux系统调用和库函数调用的区别
  2. 人工智能 - AI
  3. jsonp解决跨域
  4. UVA 11582 Colossal Fibonacci Numbers! 大斐波那契数
  5. 绘图: Shape, Path
  6. java开发环境的主题色的变化
  7. sql语句,怎么查看一个表中的所有约束
  8. haskell io模块
  9. python peewee.ImproperlyConfigured: MySQLdb or PyMySQL must be installed.
  10. [ruby on rails] 跟我学之(4)路由映射
  11. 如何将你自己的Python package发布到PyPI上
  12. unity--IOC框架资料整理
  13. 进程与线程(二) java进程的内存模型
  14. 向GridView的模板列绑定OnClientClick的函数时出现了奇怪的问题
  15. PHP电商订单自动确认收货redis队列
  16. 【BZOJ2875】随机数生成器(矩阵快速幂)
  17. Git详解及github与gitlab使用
  18. C++解题报告 : 迭代加深搜索之 ZOJ 1937 Addition Chains
  19. Spring的AOP配置文件和注解实例解析
  20. 55-56 ORM多表查询

热门文章

  1. hdfs学习(三)
  2. python2.7用socks和socket设置代理
  3. openstack nova 手动修改虚拟机状态
  4. SpringBoot项目 使用Jenkins进行自动化部署 (gitLab管理项目)_
  5. 怎样使用laravel的脚手架安装bootstrap
  6. python 报错错误集合——更新中
  7. 数组的三种方式总结 多维数组的遍历 Arrays类的常用方法总结
  8. Android低功耗蓝牙总结
  9. js对象数组新增、修改时的验证是否重复的逻辑
  10. Linux下非root用户运行Tomcat