场景
播放m3u8的ts切片,必须要完整的下载一个ts切片,才能够播放,设置hls_time的时间间隔越短越好,实际过程中设置切片时间间隔为1秒,调用如下指令
ffmpeg -i test.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_time 1 index.m3u8
实际上产生的切片时间间隔#EXT-X-TARGETDURATION:443
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:443
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:53.000000,
index0.ts
#EXTINF:153.000000,
index1.ts
说明没有按照参数输入,进行切片
原因
ts文件的切割,还跟原文件视频的GOP大小有关系(也就是两个I帧之间的时间间隔),因为任何一个ts分片第一帧必须是I帧,否则无法最快播放,并且第一帧不是I帧,对于播放器也是没有任何的意义,直接被播放器扔掉。任何一个视频流必须在获取到第一个I帧才能成功解码出图片。虽然指定了1秒切割一个ts文件,实际上,由于原视频流可能好几秒才有一个I帧,所以必须等到下一个I帧,才会重新开始切片
解决思路
既然知道要1秒产生一个ts分片,那就必须产生切片的过程中,强制一秒中产生一个关键帧,解决问题
解决方案
ffmpeg -i test.mp4 -force_key_frames "expr:gte(t,n_forced*1)" -strict -2 -c:a aac -c:v libx264 -hls_time 1 -f hls index.m3u8
指令说明
-force_key_frames "expr:gte(t,n_forced*1)" 设置关键帧间隔,设置间隔为2秒的参数如下:-force_key_frames "expr:gte(t,n_forced*2)"