安卓大部分浏览器播放HLS协议直播流会从头开始

遇到的问题

HLS直播流在iOS系统中表现正常,

但在安卓使用大部分浏览器(UC浏览器除外)播放ffmpeg生成的HLS直播流都会发生从头播放的问题,

即不管何时播放直播流,都会从直播开头的内容开始播放(生成的第一个直播TS切片,eg:电影开始直播1小时后打开直播,从0分钟看起)。

参考数据

  • 安卓系统:4.0(小米2s),4.4(华为荣耀6),其他版本未测试

  • 浏览器:默认浏览器、腾讯浏览器

  • 直播方式:ffmpeg获取rtmp流,并用自带segment实时切割为ts片段,命令如下(省略了视频流参数)

    ffmpeg -re -i rtmp://ipaddress/live/streamname 
    -codec:a libfaac -b:a 96k -af volume=1 -ac 2 -ar 44100 
    -f segment 
    -segment_time 5 
    -segment_list_flags live 
    -segment_list /path/to/m3u8 
    -segment_format mpegts /path/to/ts
  • 生成的m3u8文件如下(实时新增ts列表)

    #EXTM3U
    #EXT-X-VERSION:3 
    #EXT-X-MEDIA-SEQUENCE:0 
    #EXT-X-ALLOW-CACHE:NO 
    #EXT-X-TARGETDURATION:6 
    #EXTINF:5.000278, 
    file0000.ts 
    #EXTINF:5.013356, 
    file0001.ts
  • HLS播放器:Ckplayer+m3u8插件

疑问

不知道其他人有没有碰到这个问题。

阅读 13.9k
2 个回答

新版的FFmpeg已经直接支持了hls格式封装输出,因此使用hls替代segment输出即可解决问题。

  • 使用-f segment输出

m3u8文件中的#EXT-X-MEDIA-SEQUENCE的值一直是0。
ts列表在新增的时候不会把老切片去除。
当然也可能是有参数要设置但没找到。

所以安卓的浏览器请求m3u8文件后,会从第一个ts切片读起,因此造成每次打开都是从头播放。

  • 使用-f hls输出

m3u8文件可根据-hls_list_size参数设置保留几个ts切片。
#EXT-X-MEDIA-SEQUENCE值会根据ts切片序号而自动改变。

所以浏览器请求的m3u8文件,sequence id 和 ts list 都正常,因此可以正常实时直播而不会从头开始。

是你的hls服务端配置有问题
如果m3u8文件里只有当前的视频片段,浏览器怎么从头播放?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题