延播需求
直播一般要求实时性,但有些需要审核的场景,则需要延迟播放,留出充足的审核时间。
因而在直播功能中,需要人为引入延迟。
直播协议分析
直播常用的协议有三种,RTMP(专属推拉流协议),FLV(基于http长链接),M3U8(基于http短连接)。
其中RTMP和FLV都是流式协议,如果要增加延迟,则需要在推流或者拉流时引入一个buffer负责缓存数据。
当缓存数据足够延迟的时间时再将数据吐给用户。
对于M3U8协议来说,用户首先拉到的是ts列表,然后再选取列表中的ts文件进行下载播放,通过持续刷新列表来实现直播。
如果要增加延迟,只需要返回较旧的ts列表就可以实现。
ts片已经在服务器上实现了数据存储,因而无需对数据部分再做更多的处理。
实现方案
1 在直播基础上做m3u8的录制
直播列表通常只返回最近的几个ts片,在做延播时,需要把最大延播时间的片名都记录下来,直到超过时间再做删除。对服务器上的ts文件,也要适用同样的删除策略。
2 拉取延播流时,回放录制的数据
到达延播时间时,才允许响应延播数据,否则返回404。延播数据就从录制的ts列表中返回。对ts文件的响应,则与响应直播文件相同。
3 其它协议通过转推实现
如果有其它协议的延播流需求,则通过转码服务器,拉取m3u8的延播流,转推到直播服务器,就可以实现rtmp和flv协议的延播流。
方案特点
优点
- 改造的工作量最小。
- 对断流重推,尤其是推流到不同机器时的兼容性最好。
缺点
- 受限于切片时长的限制,延播的时间不能精确控制。