我最近工作涉及编程制作影片。 在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的。
好吧,我得到它的工作。 感谢LordNeckbeard建议使用image2pipe。 我不得不使用JPG格式编码,而不是PNG因为image2pipe与巴不上我的ffmpeg verision工作 。 第一个脚本是基本相同,你的问题的代码,除了我实现了一个简单的形象创造,只是创建的图像会由黑变红。 我还添加了一些代码的执行时间。
串行执行
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次比较性能: 系列:
12.9062321186
12.8965060711
12.9360799789
平行:
8.67797684669
8.57139396667
8.38926696777
如此看来水货版本要快约1.5倍。
ImageIO的直接支持这一点。 它采用FFMPEG和视频加速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()
文章来源: Can you “stream” images to ffmpeg to construct a video, instead of saving them to disk?