使用 FFmpeg 快速从视频中提取图像

使用 FFmpeg 快速从视频中提取图像

我正在使用 FFmpeg 从视频中提取图像,每 6 秒 1 帧:

Normal command on Dos ( Windows 8 OS) >  ffmpeg -i in.mkv -r 1/6 %4d.png

由于速度很慢,所以花费了太多时间,大约 15-20。

所以我用skip_frame nokey

ffmpeg -skip_frame nokey -i "in.mkv" -vsync 0 -frame_pts true -r 1/6 %4d.png

提取速度更快,大约 200 张(快十倍)。
但问题是它跳过了许多图像,并引发错误:

应用程序向流中的多路复用器提供了无效、非单调递增的 dts

所以我使用了这个命令:

ffmpeg -i in.mkv -vf "select='if(not(floor(mod(t,6)))*lt(ld(1),1),st(1,1)+st(2,n)+st(3,t));if(eq(ld(1),1)*lt(n,ld(2)+1),1,if(trunc(t-ld(3)),st(1,0)))'" -vsync 0 %4d.png

(此处提供 -如何使用 FFmpeg 每 X 秒捕获第一个 X 帧并保存为 PNG?

这使我的速度达到 25-30。

有什么方法可以实现更高的速度吗-skip_frame

答案1

好的,我在原始帖子中发布的代码是我迄今为止找到的唯一可以更快提取图像的解决方案。有时可以让我的速度提高 50%。

ffmpeg -i in.mkv -vf "select='if(not(floor(mod(t,6)))*lt(ld(1),1),st(1,1)+st(2,n)+st(3,t));if(eq(ld(1),1)*lt(n,ld(2)+1),1,if(trunc(t-ld(3)),st(1,0)))'" -vsync 0 %4d.png

如果您对随机图像提取(基于关键帧)感兴趣以获得更高的速度,请使用-skip_frame nokey。

相关内容