从 ffmpeg 开始创建一个没有所有图片的 JPG 视频

Create a video from JPG without have all pictures at begining with ffmpeg

我有一个可以创建一些屏幕截图的游戏,我想将它们转换为 mp4 视频。所以我有下一个命令:

ffmpeg -framerate 15 -i %06d.png -s hd1080 -vcodec libx264 -r 30 timelapse.mp4

但是我的游戏要8h,所以,在有自动压缩图片后,我有超过9To的图片。所以我想在图片生成结束之前启动ffmpeg进程,所以我想让ffmpeg等待下一张图片消化它。

我该怎么做?

批处理它们

如果您绝对不需要在比赛结束后立即播放视频,请尝试批处理。

定期制作视频,也许每 5 到 30 分钟一次,使用您的新鲜图片。然后在准备好后合并所有视频。在 ffmpeg 中连接一堆相同格式的视频 而无需 recenocding 非常快。

This answer 对 ffmpeg 中组合视频的方法有很好的概述。

对于您的情况,您可以在创建每个视频剪辑时将输出文件名附加到文本文件中。例如,vidlist.txt:

file '/path/to/clip1.mp4'
file '/path/to/clip2.mp4'
file '/path/to/clip3.mp4'

然后使用命令:

ffmpeg -f concat -safe 0 -i vidlist.txt -c copy output.mp4

一个缺点是,在创建最终视频时,space 使用 实际上会使磁盘增加一倍。您仍然可以在组合后立即删除所有剪辑,最终使用相同数量的 space。或者,您可以随时将每个视频剪辑连接到主剪辑上,而不是等到最后。不需要额外的 space。

您还可以使用一个脚本将图像通过管道传输到 ffmpeg,该脚本偶尔输入 8 小时。但取决于比赛结束后您需要多快的视频(管道脚本脚本可能需要几秒钟,而批处理脚本可能需要一分钟左右),批处理和合并可能是一个更简单的解决方案。

如果这是 运行 在与游戏相同的硬件上,常量脚本方法可能仍然更好,因为 cpu 使用率应该保持低于每隔几分钟批处理产生的峰值,虽然这可以通过限制 ffmpeg 的线程来缓解。

这是一个脚本,可以生成旋转向导的图片流用于测试

i=0; (while true; do convert magick:logo -rotate $i $i.jpg; i=`expr $i + 1`; sleep 1; done )

(编辑:注意转换是 ImageMagick 的一部分。) 因此,启动它以模拟图像处理,然后在另一个终端中启动它以 生成视频 :

(while true; do \
    ls *.jpg | \
    sort -n | # All images sorted numerically \ 
    ( while read im; do # For each image \ 
        convert $im -resize 800x600\! RGBA:-; # Convert each image, output it to stdout
        rm $im; # Then delete
    done); 
    sleep 1; 
done ) | # Then pipe all raw images to ffmpeg \ 
ffmpeg -y -f rawvideo -pix_fmt argb -s 800x600 -r 25 -i - out_vid.avi

重要的部分是 resize 以确保它是 ffmpeg 的正确大小,以及 RGBA:- 以确保它是原始未压缩流。它将输出一个 25fps 的视频,但这与生成图片的速率无关。

脚本在 bash 中工作,但等效的东西在任何现代 OS 中都可以正常工作shell。

它会在处理 jpg 图像时清除它们,因此只要您有足够的处理能力,它就会使磁盘 space 低于最终视频大小。

有关 ffmpeg 方面的更多信息,请参见此处:。 (我刚刚接受了那个答案并添加了实时图像处理。)

向 Whosebug 社区和 Rotem 的第一个解决方案致敬。

解决方案是使用 FFmpeg 管道(通过标准 Input/Output)。
其中 -f image2pipe 设置预期的输入格式,-i - 开始监视管道中的一些传入媒体数据。

我将 Java 用于标准 I/O 部分,但具有该功能的任何编程语言都可以应用相同的解决方案。

我在 Github 上创建了一个存储库来执行此操作:https://github.com/Chklang/ffmpeg-digester

执行它非常简单:

java -jar ffmpeg-digester.jar --ffmpeg ffmpeg.exe --input ./pictures --output myVideo.mkv --codec libx264

(“--help”/“-h”的一些集成帮助)

我用这个程序生成了一个 h265 视频,51 分钟,54Go,分辨率为 8k,在两天内从 74.000 张 25-35Mo 的图片中生成。

结果:https://youtu.be/Iqsq7irgUEQ