由于项目的需求, 我需要对单个视频进行截图. 以前我使用的ffmpeg命令是这样的:
ffmpeg -i input.mkv -ss 00:10:00 -f image2 output.jpg
但是这个命令会花费相当长的时间. 对一个清晰的或者较大的视频文件进行操作, 会花费半分钟以上. 截图的时间越往后, 花费的时间也越长. 更为悲剧的是, 我的Nginx服务器会在等待15s之后返回 "504 Bad Gateway" 的错误, 尽管后台的截图操作仍然在进行中! 这真的不能忍受, 而且会给用户带来不好的体验. 试着上网搜了一下解决方案, 看到了博客 [1] . 大意是说, 出现这种情况的原因是由于参数的位置放置不正确造成的 "-ss" 要放在第一个参数位置. 调整它们的位置之后我再次尝试 ( test1.flv是一个h264编码的高清视频, 总时长为"00:04:11.37", 命令中 "-ss 00:02:06" 相当于在总长度的一半处截图) :
$ time ffmpeg -ss 00:02:06 -i test1.flv -f image2 -y test1.jpg
奇迹出现了, 这一次用时不超过一秒钟:
real 0m0.595s
user 0m0.416s
sys 0m0.092s
真的是大大缩短了截图时间!!.
至于原因是什么, 我也搞不懂, 也许是像 [1] 中所说的: "可能是ffmpeg看到第一个参数为 -ss的时候,马上跳转到时间线为指定的地方然后再打开视频文件进行处理,而如果最后看到的参数是-ss,先打开视频,然后慢慢往后遍历,直到遍历到时间为指定处. 通过观察ffmpeg的输出发现,实际处理的时候几乎就是这样。"
参考文献: