动态拼接m3u8进行视频回播直播相关问题
需求
情景
1.客户端可以查询任意时间段ts文件进行回播
2.客户端在不指定结束时间的情况下可以持续播放(如果服务端持续生成ts文件,需要模拟直播情况)
情景分析
情景1分析
客户端可以根据时间通过web请求从数据库中查询该时间段所有ts文件路径和 ts文件时长动态拼接m3u8
貌似很简单,但是如果多天的数据呢?不可能一回把所有ts文件拼接到一个m3u8文件吧?然后顺其自然想到了m3u8的嵌套,加上chatgpt搜索m3u8嵌套相关知识好像真的可以嵌套m3u8。如是按天生子m3u8请求连接。但是等正真做的时候发现在potplayer中第一个子m3u8链接有时候请求多次。感觉这样不行,后来仔细看了HLS协议详细介绍,嵌套是不同分辨率的m3u8链接,就是主m3u8里的子连接不是顺序关系而是并列关系。搜索了互联网相关知识点基本上没有,都是介绍不容分辨率场景使用链接嵌套方案,只有chatgpt上给出了按天嵌套的子m3u8(感觉这个不可靠)。
解决办法
请求一个m3u8,将时间段内的ts文件都返回动态拼接一个m3u8文件。但这里做一个限制(比如多只能插5天内回播,假设ts文件时长10秒,1分钟就有6个ts文件,那么5x24x60x6=43200条)
情景2分析
m3u8中ts文件和m3u8链接混合使用.就是在最后ts文件后加一个m3u8链接接口可以重新请求m3u8构建新的m3u8字符串。但是问题又来了。
1.如果ts文件和嵌套的m3u8链接会存在所有的ts文件没有执行完就执行m3u8链接从而导致播放问题
注意事项:ts文件和最后的嵌套的m3u8链接之间要用#EXT-X-DISCONTINUITY.,EXT-X-DISCONTINUITY 标签表明播放的 TS 文件与嵌套的 M3U8 是不同的播放组,这有助于 VLC 在完成 TS 片段播放后切换到新的 M3U8 链接。不能用#EXT-X-STREAM-INF,#EXT-X-STREAM-INF 标签通常用于描述不同质量或比特率的变体播放列表。如果它出现在主 M3U8 文件中,VLC 可能认为它是一个新的流并切换到嵌套的 M3U8,而忽略之前的 TS 片段。如果嵌套的 M3U8 链接出现在 TS 文件之前,或者与 TS 文件混合,VLC 可能会优先选择 M3U8 链接。
解决办法
看了HLS协议详细介绍后
直播流是没有#EXT-X-ENDLIST标签的,也就是说播放器在播放完一个.ts文件后会向服务器再次发送请求m3u8文件的请求。
live m3u8文件列表需要不断更新,更新规则:
- 移除一个文件播放列表中靠前的(认为已播放的)文件
- 不断更新
EXT-X-MEDIA-SEQUENCE标签,以步长为1进行递增
准备按照上面的测量去实现直播
参考
1.HLS协议
2.HLS直播协议详解
3.Live m3u8播放3个文件自动停止问题
4.直播原理
5.HLS直播(M3U8)回看和下载功能的实现
浙公网安备 33010602011771号