用OpenCV精准切割视频
拯救强迫症
ffmpeg 切割视频
使用 ffmpeg 直接切割视频的命令
1 | ffmpeg -i test.mp4 -ss 00:00:00 -t 00:00:30 -c:v copy -c:a copy output.mp4 |
或者
1 | ffmpeg -i test.mp4 -ss 00:00:00 -to 00:00:30 -c:v copy -c:a copy output.mp4 |
其中
1 | -i 指定输入文件 |
上述命令将从视频开头截取一段 30s 的视频。但是,如果截取的开始时间和结束时间不是关键帧,那么得到的视频开头画面通常会卡住,而声音是正常的。这时候可以对视频流进行重编码,命令如下:
1 | ffmpeg -ss 00:00:00 -to 00:00:30 -i test.mp4 -c:v h264 -c:a copy output.mp4 |
上述方法基本上可以满足大部分人的需求,时间精确到了秒。对于强迫症来说可能还不够准确,需要精确到帧。
OpenCV 精准切割视频
首先,使用 ffmpeg 粗略的切割视频
1 | ffmpeg -ss START -to END -i INPUT -c:v copy -c:a copy cut.mp4 |
这里 START
建议设置在目标开始时间前几秒,END
设置在目标结束时间后几秒,以保证待截取的所有视频帧都包含在输出文件内。
接下来使用 Python+OpenCV 库实现以帧为单位的精准切割视频。首先将 cut.mp4 逐帧保存为图片,这里可以使用 OpenCV 或者 ffmpeg 生成(在当前目录下新建一个frames
文件夹,否则无法保存):
1 | ffmpeg -i cut.mp4 frames/frames_%05d.jpg |
或者使用 OpenCV
1 | from __future__ import absolute_import |
在 frames
文件夹下,我们可以看到视频帧都转换成了图像文件。接下来,找出需要截取的视频开始帧和结束帧对应的文件,并记下编号(下一步用到)。
1 | from __future__ import absolute_import |
以上程序将生产一个精确到帧的视频文件,但是没有声音,而 ffmpeg 在分割音频的时候是很精确的。接下来将用 ffmpeg 来切割音频,并和上述视频合并。
ffmpeg 切割音频并合并视频
1 | ffmpeg -i cut_1.mp4 -i cut.mp4 -ss TIME_OFF -to TIME_STOP -c copy output.mkv |
这里TIME_OFF
和TIME_STOP
与前一节的ss
和to
相对应,但是 ffmpeg 里面时间单位是 s
,因此应先除以1000
。