使用FFmpeg命令进行hls切片,得到的ts文件时长不准确

一、问题描述:

    使用如下FFmpeg命令进行hls切片

ffmpeg -i video2.mp4 -hls_time 1 -f hls out.m3u8

 

由于使用了参数“-hls_time 1”,所以预计生成的ts文件时长会是1秒左右。但结果却是最终生成的ts文件时长都远远大于1秒,如下图所示:

 

二、原因:

    产生上述现象的原因是:ts文件的切割还跟视频的GoP大小(两个I帧之间的间隔)有关,并不是指定1秒切一个ts文件就能保证1秒切一个ts文件的。任何一个视频流在播放端要能获取到完整的GoP才能播放,所以一个ts文件所实际包含的时间是GoP的整数倍。

 

三、解决方法:

    知道问题产生的原因就好办了,只要我们在FFmpeg命令中设置I帧间隔就可以了。我们将切片的命令修改为如下命令:

ffmpeg -i video2.mp4 -force_key_frames "expr:gte(t,n_forced*1)" -strict -2 -c:a aac -c:v libx264 -hls_time 1 -f hls out.m3u8

其中,参数-force_key_frames "expr:gte(t,n_forced*1)"表示强制每1秒一个关键帧

参数-strict -2是为了使用aac音频编码

 

执行完上述命令后,我们可以在生成的m3u8文件中看到生成的ts文件时长已经变为1秒了,如下图所示:

 

四、参考文章链接:

FFmpeg转封装(4)

关于hls切片和rtmp视频源的gop有关

GoP的取值(关键帧间隔)对于在线直播造成的影响呢?

FFmpeg libraries: Exactly constant segment duration for HLS

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值