遇到的问题
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插件
疑问
不知道其他人有没有碰到这个问题。
新版的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 都正常,因此可以正常实时直播而不会从头开始。