直播时移原理

转载请注明出处: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服务器推流,服务器就能源源不断地将实时数据发向客户端。

rtmp推流
http下发
主播
PingOS直播服务器
观众

http-flv在时移场景下的应用

rtmp推流
http-flv下发
存储
加载
http-flv下发
主播
PingOS直播服务器
直播观众
硬盘
PingOS时移服务器
时移观众

上图中直播服务器和时移服务器可以是同一个,我只是为了说明问题将其在图中分开描述。

hls协议

hls在直播场景下的应用

在直播场景下,ts文件在硬盘里的数量是固定数量并且是实时更新的,客户端通过http请求不停地下载最新的ts文件,以达到直播效果。

hls在时移场景下的应用

rtmp推流
hls下发
存储
加载
hls下发
主播
PingOS直播服务器
直播观众
硬盘
PingOS时移服务器
时移观众

上图中直播服务器和时移服务器可以是同一个,我只是为了说明问题将其在图中分开描述。

hls和http-flv时移原理相同

下面以http-flv时移流程为例说明:

主播 PingOS服务器 硬盘 观众 推流 持续存储 请求某时间点的视频,http://ip/app/stream?starttime=xxx 查询starttime的文件位置 从上步中的位置处下发flv内容 主播 PingOS服务器 硬盘 观众

不管是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参数,通过以下索引步骤就可以准确找到指定时间点的文件位置:

  1. 首先,通过路径规则定位到某一天的录像
  2. 然后,索引某一天里所有索引文件名,进而定位到客户端想要观看的内容在具体哪个媒体文件里
  3. 最后,通过读取索引文件里的索引记录定位到具体媒体文件中的关键帧位置,有了关键帧位置就可以从这个位置开始下发flv内容或者生成m3u8文件,进而实现时移功能。

总结

时移功能的核心之处在于一步步定位到某一时间点所在媒体文件中的位置,只要能够达到这点要求就都能实现你想要的时移服务,具体下发时候是使用http-flv还是hls或者dash甚至是webrtc都不是问题。

QQ交流群:697773082

QQ交流群:697773082

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值