使用ffmpeg提取帧的最快方法是什么?
嗨,我需要从video使用ffmpeg提取帧。有没有比这更快的方式做到这一点:
ffmpeg -i file.mpg -r 1/1 $filename%03d.jpg
?
如果JPEG编码步骤的性能密度太高,则可以始终将未压缩的帧存储为BMP图像:
ffmpeg -i file.mpg -r 1/1 $filename%03d.bmp
这也具有不通过转码为JPEG而通过量化导致更多质量损失的优点。 (PNG也是无损的,但是往往需要比JPEG更长的时间进行编码。)
遇到这个问题,所以这里是一个快速的比较。 比较这两种不同的方式,从一段长38m07s的video中每分钟提取一帧:
time ffmpeg -i input.mp4 -filter:v fps=fps=1/60 ffmpeg_%0d.bmp
1m36.029s
这花了很长时间,因为ffmpegparsing整个video文件来获得所需的帧。
time for i in {0..39} ; do ffmpeg -accurate_seek -ss `echo $i*60.0 | bc` -i input.mp4 -frames:v 1 period_down_$i.bmp ; done
0m4.689s
这大约快了20倍。 我们使用快速寻找去所需的时间索引和提取一帧,然后调用ffmpeg每次索引几次。 请注意, -accurate_seek
是默认设置 ,请确保在inputvideo-i
选项之前添加-ss
。
请注意,最好使用-filter:v -fps=fps=...
而不是-r
因为后者可能不准确。 虽然票被标记为固定 ,但我仍然遇到一些问题,所以更好地安全起见。
如果您确切知道要提取哪些帧,例如1,200,400,600,800,1000,请尝试使用:
select='eq(n\,1)+eq(n\,200)+eq(n\,400)+eq(n\,600)+eq(n\,800)+eq(n\,1000)'" \ -vsync vfr -q:v 2
我正在使用这个pipe道Imagemagick的蒙太奇从任何video预览10帧。 显然你需要使用ffprobe
来计算ffprobe
ffmpeg -i myVideo.mov -vf \ select='eq(n\,1)+eq(n\,200)+eq(n\,400)+eq(n\,600)+eq(n\,800)+eq(n\,100)'",scale=320:-1 \ -vsync vfr -q:v 2 -f image2pipe -vcodec ppm - \ | montage -tile x1 -geometry "1x1+0+0<" -quality 100 -frame 1 - output.png
。
小解释:
- 在ffmpegexpression式中
+
表示OR,*
表示AND -
\,
简直就是逃避了,
性格 - 没有
-vsync vfr -q:v 2
它似乎不工作,但我不知道为什么 – 任何人?