web-dev-qa-db-ja.com

イメージをディスクに保存するのではなく、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に送られます。

42
Brandon

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()
0
Joren