使用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 

小解释:

  1. 在ffmpegexpression式中+表示OR, *表示AND
  2. \,简直就是逃避了,性格
  3. 没有-vsync vfr -q:v 2它似乎不工作,但我不知道为什么 – 任何人?