V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
phpfpm
V2EX  ›  问与答

请教一下 hls.js 播放自己拼接的 m3u8 的问题:两段 ts 本身的 start time 不一致导致无法播放

  •  
  •   phpfpm · 2021-11-06 18:55:41 +08:00 · 899 次点击
    这是一个创建于 1108 天前的主题,其中的信息可能已经有所发展或是发生改变。

    业务场景是我们把直播流推到了 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 本身这个时间。

    phpfpm
        1
    phpfpm  
    OP
       2021-11-06 19:25:01 +08:00
    自问自答:

    对于 hls.js ,还有 m3u8 的标准

    RTFM

    在需要的地方加上#EXT-X-DISCONTINUITY 就好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1219 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:24 · PVG 02:24 · LAX 10:24 · JFK 13:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.