android - 安卓大部分浏览器播放HLS协议直播流会从头开始
天蓬老师
天蓬老师 2017-04-17 13:52:57
[Android讨论组]

遇到的问题

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)
伊谢尔伦

新版的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 都正常,因此可以正常实时直播而不会从头开始。

PHPz

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号