Подтвердить что ты не робот

Изображения PIL PIL для ffmpeg stdin - Python

Я пытаюсь преобразовать видео html5 в видео mp4, и делаю это при съемке экрана через PhantomJS со временем

Я также обрезаю изображения, используя PIL, поэтому в итоге мой код примерно:

while time() < end_time:
    screenshot_list.append(phantom.get_screenshot_as_base64())
.
.
for screenshot in screenshot_list:
    im = Image.open(BytesIO(base64.b64decode(screenshot)))
    im = im.crop((left, top, right, bottom))

В настоящий момент я сохраняю для того, чтобы записывать все эти изображения и использовать ffmpeg из сохраненных файлов:

os.system('ffmpeg -r {fps} -f image2 -s {width}x{height} -i {screenshots_dir}%04d.png -vf scale={width}:-2 '
      '-vcodec libx264 -crf 25 -vb 20M -pix_fmt yuv420p {output}'.format(fps=fps, width=width,
                                                                  screenshots_dir=screenshots_dir,
                                                                  height=height, output=output))

Но вместо того, чтобы использовать эти сохраненные файлы, я хочу, чтобы иметь возможность передавать PIL.Images directy в ffmpeg, как я могу это сделать?

4b9b3361

Ответ 1

Баунти ушла, но я нашел решение.

После получения всех скриншотов в качестве базовых строк я записываю их в подпроцесс со следующим кодом

import subprocess as sp

# Generating all of the screenshots as base64 
# in a variable called screenshot_list

cmd_out = ['ffmpeg',
           '-f', 'image2pipe',
           '-vcodec', 'png',
           '-r', '30',  # FPS 
           '-i', '-',  # Indicated input comes from pipe 
           '-vcodec', 'png',
           '-qscale', '0',
           '/home/user1/output_dir/video.mp4']

pipe = sp.Popen(cmd_out, stdin=sp.PIPE)

for screenshot in screenshot_list:
    im = Image.open(BytesIO(base64.b64decode(screenshot)))
    im.save(pipe.stdin, 'PNG')

pipe.stdin.close()
pipe.wait()

# Make sure all went well
if pipe.returncode != 0:
    raise sp.CalledProcessError(pipe.returncode, cmd_out)

Если время выполнения является проблемой, вы можете сохранить изображения в формате JPEG вместо этого и использовать для этого соответствующие кодеки, но самое высокое качество, которое мне удалось достичь, было с этими настройками