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

 那永A_334 发布于 2022-11-04 13:20

遇到的问题

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插件

疑问

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

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

    2022-11-08 00:39 回答
  • 新版的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 都正常,因此可以正常实时直播而不会从头开始。

    2022-11-08 00:48 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有