嗨,我需要从视频中提取帧使用ffmpeg..还有比这更快的方法吗:

ffmpeg -i file.mpg -r 1/1 $filename%03d.jpg

?


当前回答

我试过了。3600帧32秒。你的方法太慢了。你应该试试这个。

ffmpeg -i file.mpg -s 240x135 -vf fps=1 %d.jpg

其他回答

如果你确切地知道要提取哪些帧,例如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

我使用这个管道Imagemagick的蒙太奇从任何视频得到10帧预览。显然,帧数需要使用ffprobe来计算

ffmpeg -i myVideo.mov -vf \
    select='eq(n\,1)+eq(n\,200)+eq(n\,400)+eq(n\,600)+eq(n\,800)+eq(n\,1000)',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

.

小的解释:

在ffmpeg表达式中,+代表OR, *代表and \只是转义,字符 没有-vsync vfr -q: v2,它似乎不工作,但我不知道为什么-有人吗?

与@makeworld的回答相同,但也解决了这里提到的关于帧数不一致和需要垂直同步的问题,以及关于垂直同步的使用:

// reliably works for jpg output (and probably png too)
ffmpeg -i rgb.mov -vf setpts=N/FR/TB -vsync 0 ./images/%05d.jpg

// reliably works for png output only
ffmpeg -i rgb.mov -vsync 0 ./images/%05d.png

我试过了。3600帧32秒。你的方法太慢了。你应该试试这个。

ffmpeg -i file.mpg -s 240x135 -vf fps=1 %d.jpg

遇到了这个问题,这里有一个快速的比较。比较以下两种从38m07秒长的视频中每分钟提取一帧的方法:

time ffmpeg -i input.mp4 -filter:v fps=fps=1/60 ffmpeg_%0d.bmp

1 m36.029s

这需要很长时间,因为ffmpeg解析整个视频文件以获得所需的帧。

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

0 m4.689s

这要快20倍。我们使用快速查找到所需的时间索引并提取一帧,然后为每个时间索引调用ffmpeg几次。注意-accurate_seek是默认值 ,并确保在input video -i选项之前添加-ss。

注意,最好使用-filter:v -fps=fps=…而不是-r,因为后者可能不准确。虽然机票被标记为固定,但我还是遇到了一些问题,所以最好谨慎行事。

这对我很有效

Ffmpeg -i file.mp4 -vf fps= 1% d.jpg