我最近的工作涉及以编程方式制作视频。在 python 中,典型的工作流程如下所示:
import subprocess, Image, ImageDraw
for i in range(frames_per_second * video_duration_seconds):
img = createFrame(i)
img.save("%07d.png" % i)
subprocess.call(["ffmpeg","-y","-r",str(frames_per_second),"-i", "%07d.png","-vcodec","mpeg4", "-qscale","5", "-r", str(frames_per_second), "video.avi"])
此工作流为视频中的每一帧创建一个图像并将其保存到磁盘。保存所有图像后,将调用 ffmpeg 从所有图像构建视频。
将图像保存到磁盘(而不是在内存中创建图像)消耗了这里的大部分周期,而且似乎没有必要。有没有办法执行相同的功能,但不将图像保存到磁盘?因此,将调用 ffmpeg 并构建图像并在构建后立即将其提供给 ffmpeg。
原文由 Brandon 发布,翻译遵循 CC BY-SA 4.0 许可协议
好的,我让它工作了。感谢 LordNeckbeard 建议使用 image2pipe。我不得不使用 jpg 编码而不是 png,因为带有 png 的 image2pipe 在我的 ffmpeg 版本上不起作用。第一个脚本与您问题的代码基本相同,只是我实现了一个简单的图像创建,它只创建从黑色到红色的图像。我还添加了一些代码来计时执行。
串行执行
并行执行(没有图像保存到磁盘)
结果很有趣,我将每个脚本运行 3 次以比较性能: serial:
平行线:
所以并行版本似乎快了大约 1.5 倍。