Ответ 1
Хорошо, я начал работать. благодаря предложению LordNeckbeard использовать image2pipe. Мне пришлось использовать jpg-кодировку вместо png, потому что image2pipe с png не работает в моей версии ffmpeg. Первый script по существу совпадает с вашим кодом вопроса, за исключением того, что я реализовал простое создание образа, которое просто создает образы, идущие от черного к красному. Я также добавил код во время выполнения.
серийное исполнение
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()
результаты интересны, я провел каждый script 3 раза, чтобы сравнить производительность: серийный номер:
12.9062321186
12.8965060711
12.9360799789
:
8.67797684669
8.57139396667
8.38926696777
Итак, параллельная версия быстрее примерно в 1,5 раза быстрее.