场景
调用FFmpeg接口将AVPacket生成HLS切片文件,生成的切片时间不准确,例如:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:443
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:53.000000,
index0.ts
#EXTINF:153.000000,
index1.ts
目标:生成的切片大小差不多,并且播放进度条上显示的时间是准确的,目前在现场发现时间显示完全不正确,除非完整播放。之前刚刚部署系统的时候,时间是正常的。
排查过程
1)警告:[hls] pkt.duration = 0, maybe the hls segment duration will not precise
调用FFmpeg接口生成HLS切片文件,控制台输出警告信息。查看代码,发现AVPacket结构体中的duration变量没有赋值,导致该警告提示,所以添加了duration的赋值,但是由于理解不到位,因此赋值的是一个错误值,导致切片时间不准确
2)方法一不再赋值duration解决问题
在这里生成的切片时间以及切片的大小可能不一样,这是跟GOP序列有关,切片保存的数据都是GOP的整数倍,每一个视频的GOP不一样,得到的大小也不一样。
3)av_dict_set_int(&opts, "hls_time", 60, 0);
该函数设置了分片的时间,60秒产生一个切片文件