您可以将图像“流”到 ffmpeg 以构建视频,而不是将它们保存到磁盘吗?

新手上路,请多包涵

我最近的工作涉及以编程方式制作视频。在 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 许可协议

阅读 999
2 个回答

好的,我让它工作了。感谢 LordNeckbeard 建议使用 image2pipe。我不得不使用 jpg 编码而不是 png,因为带有 png 的 image2pipe 在我的 ffmpeg 版本上不起作用。第一个脚本与您问题的代码基本相同,只是我实现了一个简单的图像创建,它只创建从黑色到红色的图像。我还添加了一些代码来计时执行。

串行执行

import subprocess, Image

fps, duration = 24, 100
for i in range(fps * duration):
    im = Image.new("RGB", (300, 300), (i, 1, 1))
    im.save("%07d.jpg" % i)
subprocess.call(["ffmpeg","-y","-r",str(fps),"-i", "%07d.jpg","-vcodec","mpeg4", "-qscale","5", "-r", str(fps), "video.avi"])

并行执行(没有图像保存到磁盘)

 import Image
from subprocess import Popen, PIPE

fps, duration = 24, 100
p = Popen(['ffmpeg', '-y', '-f', 'image2pipe', '-vcodec', 'mjpeg', '-r', '24', '-i', '-', '-vcodec', 'mpeg4', '-qscale', '5', '-r', '24', 'video.avi'], stdin=PIPE)
for i in range(fps * duration):
    im = Image.new("RGB", (300, 300), (i, 1, 1))
    im.save(p.stdin, 'JPEG')
p.stdin.close()
p.wait()

结果很有趣,我将每个脚本运行 3 次以比较性能: serial:

 12.9062321186
12.8965060711
12.9360799789

平行线:

 8.67797684669
8.57139396667
8.38926696777

所以并行版本似乎快了大约 1.5 倍。

原文由 Marwan Alsabbagh 发布,翻译遵循 CC BY-SA 3.0 许可协议

imageio 直接支持这个。它使用 FFMPEG 和 Video Acceleration API ,使其速度非常快:

 import imageio

writer = imageio.get_writer('video.avi', fps=fps)
for i in range(frames_per_second * video_duration_seconds):
    img = createFrame(i)
    writer.append_data(img)
writer.close()

这需要 ffmpeg 插件,可以使用例如 pip install imageio[ffmpeg] 安装。

原文由 Joren 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题