将视频中的所有帧合成为单个图像的有效方法

将视频中的所有帧合成为单个图像的有效方法

我有一个大约 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 分钟的视频文件使用上述命令只需要一分钟多一点的时间,并且处理内存可以忽略不计。

相关内容