需求

使用ffmpeg可以非常方便的生成视频截图,ffmpeg 通过指定 -vcodec 参数为 mjpeg,或者指定 -f 参数为 mjpeg时,可以输出 jpg截图,指定 -vcodec参数为png,或者指定输出文件扩展名为png,可输出png截图。 如果参数指定不当,会导致ffmpeg处理速度非常缓慢。

截取视频的第几秒。通过 -ss 参数指定,但要注意看到最后的几个例子,否者会很慢哦。

输出 jpg

ffmpeg -i 1.mp4 sample.jpg -ss 00:00:05  -vframes 1 -an -vcodec mjpeg 

输出 png

ffmpeg -i 1.mp4 sample.png -ss 00:00:05  -vframes 1 -an -vcodec mjpeg

大概等待1秒钟,生成的jpg图像为19K,而png格式的图像为222k,大了很多倍,而质量上,并没有太大的差别,所以我决定生成jpg格式。

好现在抓取时间为1分05秒处的图片:

ffmpeg -i 1.mp4 sample.jpg -ss 00:01:05  -vframes 1 -an -vcodec mjpeg

几乎等待了近10秒钟,实际上,如果你抓取50分钟处的图像,可能要等上十几分钟,而很多网上通用的写法都存在这个问题,所以有的人转而采用mplayer来截屏,这个问题可能是ffmpeg的一个bug,如果你够聪明,调整一下参数 -ss,把这个参数放到第一个位置,马上就可以解决这个问题。

50分钟处快速截屏

ffmpeg -ss 00:50:00  -i 1.mp4 sample.jpg -vframes 1 -an -vcodec mjpeg 

或者使用 -f 参数指定输出的格式为 mjpeg ,效果一样

ffmpeg -ss 00:50:00  -i 1.mp4 sample.jpg -vframes 1 -an -f mjpeg
#或者
ffmpeg -ss 00:50:00  -i 1.mp4 sample.jpg -vframes 1 -an -f image2 

-vframes 1 表示只输出1帧

速度快的,几乎不到1秒钟。到底为什么会这样?可能是ffmpeg看到第一个参数为 -ss的时候,马上跳转到时间线为50分钟处然后再打开视频文件进行处理,而如果最后看到的参数是-ss,先打开视频,然后慢慢往后遍历,直到遍历到时间为50分钟处,通过观察ffmpeg的输出发现,实际处理的时候几乎就是这样。

连续截取多帧

ffmpeg -ss 00:50:00 -i 1.mp4 -f image2 -r 0.2 -t 10 %03d.jpg

-r 截取帧率,每秒多少帧 0.2表示每秒0.2帧,即5秒1帧。 -t 使用多长时间内视频 其实这样做依然不够快,更快的方法是把-ss -r -t 参数都放到 -i前

ffmpeg -ss 100 -t 600 -r 0.2  -i 1.mp4 -f image2  -y  %03d.jpg
#截取指定数量的帧
ffmpeg -ss 100 -t 600 -r 0.2  -i 1.mp4 -f image2  -vframes 5 -y  %03d.jpg