FFmpeg精准时间切割视频文件

FFmpeg精准时间切割视频文件

最近有一个需求精准切割视频剪辑,使用Python+OpenCV库可以做到帧为单位的精准切割视频,但是缺点是OpenCV保存的视频是没有声音的,而且保存的格式也只能为avi格式,比较不方便。

所以尝试使用FFmpeg来切割视频,首先使用的是


ffmpeg -y -ss start -t duration -i filenam -codec copy


但是剪切出来的视频因为视频关键帧前面和后面都会多出来一部分


根据网上资料,加入了-accurate_seek参数在-i前面和-avoid_negative_ts 1参数

ffmpeg -y -ss start -t duration -accurate_see -i filename -codec copy -avoid_negative_ts 1

但是发现视频头部的剪裁精度基本满意但是尾部还是不准



查阅官方说明trac.ffmpeg.org/wiki/Se

发现将-i参数放在-ss之前可以精准切割

ffmpeg -y -i filename -ss start -t duratio -codec copy




但正如官方所说,其速度非常非常非常慢……


经过查阅资料,发现ffmpeg在进行转码的时候会自动精准时间,即不使用-codec copy编码。

ffmpeg -y -ss start -t duration -I filenam -c:v libx264 -perset superfast -c:a copy

视频可以正确的剪切,但是又出现了个很严重的问题!

部分视频的视频片段较长的时候,内存占用直接爆炸





虽然将视频转码剪切视频完成了需求,但是偶尔出现的内存占用问题还是很麻烦的。继续寻求别的方法。

考虑是否可以将视频的关键帧设置的很短,这样codec copy模式工作的时候便不会错位太多了

ffmpeg -y -i filename -ss 0 -t end_of_vide -c:a copy -vcodec mpeg4 -keyint_min gop -g gop

然后用copy编码截取视频

ffmpeg -y -ss start -t duratio -accurate_seek -i filename codec copy -avoid_negative_ts 1

情况还是很理想的,速度和资源占用都不算太多,尽管部分视频的结尾大概还是会差出几帧但是整体已经很好了。

但我还是像让他更加精准,于是想到了一个邪魔歪道。

OpenCV截取的视频是极为精准的但是没有声音。

ffmpeg进行转码的时候也是非常精准的,但是转码视频会内存占用很大。

那么就用OpenCV截取视频,ffmpeg截取音频,然后合并音频和视频

使用OpenCV的VideoWriter.write写入视频

对视频压缩为音频

ffmpeg -y -I filename -vn -ar 44100 -ac  -ab 192 -f mp3

然后切割音频

ffmpeg -y -vn -ss start -t duration -i filenam -acodec copy

最后合并音频视频

ffmpeg -y -i filename -i filename2 -vcode copy -acodec copy

效果惊人的很好,速度也很快……

问题基本解决。


那么使用ffmpeg精准剪切视频,如果电脑性能很好的话直接转码是最好的

1、ffmpeg -y -ss start -t duration -I filename -c:v libx264 -preset superfast -c:a copy

调整关键帧也是个不错的选择

2、ffmpeg -y - filename -ss 0 -t end_of_video -c:a 2、ffmpeg -y - filename -ss 0 -t end_of_video -c:a copy -vcodec mpeg4 -keyint_min gop -g gopcopy -vcodec mpeg4 -keyint_min gop -g gop
ffmpeg -y -ss start -t duratio -accurate_seek -i filename codec copy -avoid_negative_ts 1

3、不差时间的话Output seeking是很好的选择

ffmpeg -y -i filename -ss start -t duratio -codec copy


邪魔外道法如果使用OpenCV处理的话也可以考虑……

ps: -i参数放在中间的转码可以规避内存爆炸的问题,但是视频开头会有一阵画面定格

ffmpeg -y -ss start -i filename -t duratio -c:a copy -vcodec mpeg4 -b:v

编辑于 2018-08-23

文章被以下专栏收录