ffmpeg图片合成视频及里边的坑
缘起
家里的树莓派现在充当家里的安防摄像头,会定期拍啥照片,但是日常看起来不方便,因此考虑使用ffmpeg,每天合成一个视频,这样看起来也方便些。
折腾过程
网上方案
网络上随便一搜,结果很多,无非就是下面这种:
ffmpeg -f image2 -y -i *.jpg -vcodec h264 output.mp4
试了下,这个命令有误导性的错误,这里的*.jpg的使用是错误的,因为在shell执行时,会把这里*.jpg进行展开,然后变成形如下面的命令:
ffmpeg -f image2 -y -i 1.jpg 2.jpg 3.jpg -vcodec h264 output.mp4
而ffmpeg里,第二个文件路径指的是输出路径,这样的话展开后的命令行,就是递归的把第一张照片合成到第二张照片的路径,以此类推;最后全部覆盖为第一张照片内容,合成的视频也是全是第一张图片。
另外,这种方案会导致递归的视频处理,内存占用非常恐怖,1000张图片情况下,内存恐怖的占用到8G多。
解决方案
其实上面讲的*.jpg的使用问题,是经过分析解决后事后分析的,解决方案是看了ffmpeg的官方文档,关于对文件名的通配后解决的,因为ffmpeg有自己的通配规则,见https://ffmpeg.org/ffmpeg-formats.html,且注意通配规则要加上"",防止命令行里被展开。
这样解决后的命令行如下(图片名称xxx前缀):
ffmpeg -f image2 -y -i "xxx%*.jpg" -vcodec h264 output.mp4
性能问题
经过上面处理,可以正常编码视频了,但是默认4k的图片分辨率,导致1000+张图片情况下,合成视频非常的慢(性能比较低),使用像树莓派硬解码(h264_omx)也会失败。
通过网上搜索发现可能是分辨率太高的原因,可以等比例的降低分辨率,达到提升速度的目的,经过测试,宽高分别降低2倍后到1080p分辨率,速度会非常快。
这样的话,最终的命令行就是这样的,1000张图片,大约10分钟就可以合成完。
ffmpeg -f image2 -y -i "xxx%*.jpg" -vcodec h264 -vf scale=1080:810 output.mp4
总结
网络上有的教程非常坑,写的比较随意且可能是误导性的,导致使用起来坑比较多,最终还是得了解好使用的工具的文档,了解相关的参数详细写法才行。
另外,ffmpeg是真的强大,各种格式都能处理,图片合成视频,视频拆成图片等等。
参考文档
https://ffmpeg.org/ffmpeg-formats.html
https://www.zhihu.com/question/558064045
https://blog.p2hp.com/archives/5512
https://stackoverflow.com/questions/22965569/convert-from-jpg-to-mp4-by-ffmpeg
发表评论