Pythonで1枚の画像から60FSの動画を作成

Pythonで1枚の画像から60FSの動画を作成

Twitter LINEで送る Facebook はてなブログ

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秒の動画 このような形で出力できます。 この5秒の動画作成だけでM2 MBAを利用していますが 10秒前後のエンコード時間がかかっています。

バックグラウンドで動かすなど実際のエンコード面ではスペックが必要そうです。