我有一个大约 20 分钟长的 720p 视频文件。我想使用单个运算符(例如变亮、变暗等)来合成视频中的每一帧以生成单个图像输出。
我的想法是我可以使用 Imagemagick 的转换函数来做到这一点,使用类似这样的东西:
convert video.mp4 -compose Lighten output.jpg
但是运行几分钟后它就会耗尽内存(而且我有一个很多内存,我已经设置了允许使用大部分内存的策略)。在幕后它似乎正在调用 ffmpeg,但无论发生什么,它似乎都非常低效,需要数十 GB RAM 才能一次将几个 720p 帧加载到 RAM 中(一个用于合成,一个用于合成)新框架)。
将视频合成为图像的更快、更有效的方法是什么?
答案1
这可以通过 ffmpeg 有效地完成,尽管它需要确切地知道需要组合多少帧。tblend
必须设置一个过滤器来合并相邻的帧;每个过滤器会将帧数分成两半。
就我而言,我有 72,000 帧(20 分钟 @ 60fps)。我选择了 16 个阶段,因为这会将视频除以 65536。tblend
文档说:
默认情况下,当最长的输入终止时,输出终止。
由此,我预计应该除以 131072,因为最后一次除法应该会产生一个短输入,该输入应该与全长输入正确组合。然而,使用 17 个阶段会产生输出Output file is empty, nothing was encoded
,因此我将其降至 16,此时我得到了一张图像输出。
最终的命令是:
ffmpeg -i $I -vf "tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,setpts=1*PTS" -f image2 $O.png
其中 $I 是输入文件,$O 是去掉扩展名的输入文件。
与 相比convert
,使用 ffmpeg 对 20 分钟的视频文件使用上述命令只需要一分钟多一点的时间,并且处理内存可以忽略不计。