【发布时间】:2012-10-28 23:54:55
【问题描述】:
我最近的工作涉及以编程方式制作视频。在 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。
【问题讨论】:
-
我不知道您是如何创建图像的,但 ffmpeg 也接受管道输入:
ffmpeg -f image2pipe -c:v png -r 30000/1001 -i -。 -
为简单起见,假设
createFrame(i)返回一个Python图像库图像对象,我们将其存储在img中。我认为您的回应是朝着正确方向迈出的一步,但一半的挑战是在 python 程序中将构建的图像管道传输到 ffmpeg。 -
也许排队,然后通过第二个线程管道图像?
-
也许能够将您的输入发送到命名管道并将其传递给 ffmpeg,同样,过程基本相同......
标签: python image stream ffmpeg python-imaging-library