业务场景是我们把直播流推到了 cdn ,最终直播结束之后会给我们一些 m3u8 文件作为回放。
正常情况下不断流的时候是一个我们直接截取一下 m3u8 对应的时长片段就好了。
偶尔出现需要拼接的时候,我就是简单的读取一下 m3u8 的相应分段然后接在一起。
但是现在遇到了用浏览器的 hls.js 播放的时候,发现拼接部分无法继续的情况,主要表现是:
# xxxxxx
http://site.example.com/section-a-20min.ts
# xxxxxx
http://site.example.com/section-b-01min.ts
这样两段就卡住了。
用 ffmpeg -i 看了一下两段 ts ,能看到 ts 本身记录了时长和 start:
$ ffmpeg4 -i section-a-20min.ts
...
Duration 00:00:00:60 Start 8000
...
$ ffmpeg4 -i section-b-1min.ts
...
Duration 00:00:00:60 Start 0
...
也就是说,hls.js 会根据 ts 文件本身的 start 字段去找下一段,当发现播放列表的下一段 ts 不是下一个 start 的时候就拒绝播放
想问下有啥好的解决方案吗?
我这边能想到的是用 ffmpeg 重新编码再切分,忽略 start 本身这个时间。
1
phpfpm OP 自问自答:
对于 hls.js ,还有 m3u8 的标准 RTFM 在需要的地方加上#EXT-X-DISCONTINUITY 就好了 |