转载请注明出处:https://blog.csdn.net/impingo
项目地址:https://github.com/im-pingo/pingos
项目官网:http://pingos.io
直播时移原理
什么是直播时移
所谓直播时移,是指在直播过程中可以任意回看过去的直播内容的技术。它是与直播和点播相结合的一种技术,在播放器端看来它和直播协议没有区别。观众可以在当前时间点向前回溯到某个时间点开始一直观看下去,直到视频内容结束。
常用协议
http-flv协议
http-flv在直播场景下的应用
直播协议中的http-flv流程是,利用http的特性,如果http服务器返回头里没有length参数,http客户端则会一直保持接收数据的状态。
服务器收到播放器发来的http get请求后马上回复flv header + metadata + 音视频数据,只要主播不停地向http flv服务器推流,服务器就能源源不断地将实时数据发向客户端。
http-flv在时移场景下的应用
上图中直播服务器和时移服务器可以是同一个,我只是为了说明问题将其在图中分开描述。
hls协议
hls在直播场景下的应用
在直播场景下,ts文件在硬盘里的数量是固定数量并且是实时更新的,客户端通过http请求不停地下载最新的ts文件,以达到直播效果。
hls在时移场景下的应用
上图中直播服务器和时移服务器可以是同一个,我只是为了说明问题将其在图中分开描述。
hls和http-flv时移原理相同
下面以http-flv时移流程为例说明:
不管是http-flv还是hls最关键之处在于定位starttime对应的录像文件位置。
存储规则
为了实现时移效果,存储时除了录像文件外还需要同时存储一份索引文件,通过这份索引文件可以快速找到starttime对应的是哪一个文件中的什么位置。
存储路径
录像文件路径规则:
媒体文件存放路径:serverid/application/date/stream_timestamp.ts
索引文件存放路径:serverid/application/index/date/stream_timestamp.m3u8
截图中serverid:000,application:live,stream:00,date:20191127
索引文件内容规则:
索引文件的作用是将时间映射成媒体文件中I帧的位置,因为播放器必须要先获取到关键帧才能开始解码播放,所以时移开始的位置一定要偏移到距离指定起始时间最近的关键帧位置。换句话说关键帧间隔直接影响了时移的精度。
首先需要明确的是每个媒体文件都对应有一个索引文件,为了方便索引,整数个GOP(可以简单理解为整数个I帧)在索引文件中生成一条记录。
每条记录的组成规则如下:
媒体文件名?startsize=xxx&endsize=xxx&starttime=xxx&endtime=xxx
starttime:这条索引记录对应的媒体文件中第一个I帧的时间戳
endtime:这条索引记录对应的媒体文件中最后一个I帧的时间戳
startsize:starttime这个时间点的I帧(第一个I帧)在媒体文件中的偏移量
endsize:endtime对应的I帧(也就是最后一个I帧)在媒体文件中的偏移量
时移请求中一定会带有starttime参数,通过以下索引步骤就可以准确找到指定时间点的文件位置:
- 首先,通过路径规则定位到某一天的录像
- 然后,索引某一天里所有索引文件名,进而定位到客户端想要观看的内容在具体哪个媒体文件里
- 最后,通过读取索引文件里的索引记录定位到具体媒体文件中的关键帧位置,有了关键帧位置就可以从这个位置开始下发flv内容或者生成m3u8文件,进而实现时移功能。
总结
时移功能的核心之处在于一步步定位到某一时间点所在媒体文件中的位置,只要能够达到这点要求就都能实现你想要的时移服务,具体下发时候是使用http-flv还是hls或者dash甚至是webrtc都不是问题。
QQ交流群:697773082
QQ交流群:697773082