Pythonで1枚の画像から60FSの動画を作成
Pythonで動画を作成
画像から動画作成を行いたくFPSもある程度の動画が作りたくなり 調べた結果をまとめました。
FullHD 60FSPで1画像を5秒のサンプルとして作成
import cv2
import os
# 画像フォルダの入出力先を定義
INPUT_RESORCE_FOLDER = os.getcwd() + "/resources/material/img/"
OUTPUT_RESOURCE_FOLDER = os.getcwd() + "/resources/material/mp4/"
# FPSを定義
FPS = 60
# 動画のサイズを定義
FRAME = (1920, 1080)
""""
画像ファイルからmp4動画を出力します.
Parameters
----------
video_path : String
動画の出力パス
sec : int
動画の時間
img_path : String
画像のパス
"""
def save_image_to_video(video_path, sec, img_path):
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
outfh = cv2.VideoWriter(video_path, fourcc, FPS, FRAME)
for i in range(0, sec * FPS, 1):
im = cv2.imread(img_path)
outfh.write(im)
outfh.release()
''''
動画を生成します.
'''
def run():
print("=== START Encode Video ===")
save_image_to_video( OUTPUT_RESOURCE_FOLDER + "output.mp4", 5, INPUT_RESORCE_FOLDER + "output.png")
print("=== END Encode Video ===")
if __name__ == '__main__':
# 日付を指定
run()
FPSと動画の長さの考え方
今回のコードを作成するにあたり、画像を以下の部分で 書き込む枚数とFPSを合わせる必要がありました。
im = cv2.imread(img_path)
outfh.write(im)
上記部分が何回書き込むかで実際の動画の長さが制御されます。 基本的にはパラパラ漫画のイメージで枚数を準備する必要がある形です。
## 出来た動画 このような形で出力できます。 この5秒の動画作成だけでM2 MBAを利用していますが 10秒前後のエンコード時間がかかっています。
バックグラウンドで動かすなど実際のエンコード面ではスペックが必要そうです。