私の最近の仕事は、プログラムでビデオを作成することです。 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に送られます。
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()