Timeline有什么作用呢?
Timeline(时序线)是MediaSource中记录媒体片段播放顺序的数据结构;如果把媒体片段当作一张张扑克牌,MediaSource就相当于一个发牌器,它每次发牌的时候,会询问Timeline该发哪一张了,Timeline给出一个牌的标识-Period,MediaSource就根据这个标识,去本地、缓存或者网络上获取这张牌并把它发给播放器进行播放。
Timeline是什么样子的呢?
Timeline(时间序列)管理着一个或者多个Window,Window管理着一个或者多个媒体片段,Window有开始时间,有结束时间,是一个独立且连续的播放单元,连续是指Window管理的媒体片段关联的播放url地址、媒体类型等信息一致,播放器不用切换地址配置等便可连续不断地获取到媒体数据流进行播放。
播放url地址、媒体类型等媒体源描述信息封装在一个叫MediaItem的数据结构,一个Window都要关联一个媒体信息MediaItem;下图中,当只有正片地时候,大部分时候就需要一个Window,当一个正片中间插入一个广告(广告地址一般和媒体正片分开存储),整个时间序列Timeline便被分割成三个Window。
Timeline如何生成的?
在MediaSource简介中提到Timeline是根据媒体描述信息进行初始化,比如Mp3文件的元数据,流媒体的MPD文件等;MediaSource变化了Timeline随之改变,比如上面我们进行了正片和广告片段的拼接,那Timeline中的Window需要随之变化。
在点播场景下,Timeline是确定的,它管理的Window也是不变的,通过解析协议头部获取媒体元信息就可以给Window赋值;在直播场景下,Window是实时更新的,一般直播协议每隔几秒都会下发一次MPD数据,Window根据这个数据,不断更新自己管理的媒体片段范围。
Timeline是如何找到特定媒体片段的?
媒体片段标识Period在初始化就会根据流媒体协议生成,然后媒体片段就归Timeline管理起来,常见的需要给出媒体片段情况有:
顺序播放:属于同一个Window:一般Period 的id+1就可以;
顺序播放:属于下一个Window:先定位Window,比如Window序列+1 获取下一个Window,然后根据Window的默认播放位置寻找到需要的媒体片段;
seek到特定位置:先找Window,一般根据MediaItem+开始播放时间+结束播放时间可以定位到特定Window,然后再根据具体位置信息PositionInPeriodUs定位到特定的媒体片段。
总结下,媒体片段定位是通过WindowID+periodUid实现,感兴趣的可以查看不同协议的具体实现。