短い動画を繰り返して、長めの1つの動画に拡張したいような場面はありませんか?
今回はそのコードを紹介しますので、是非参考にしてください。
コピーするだけで簡単に使えます!
勉強に活用したい方は、詳細な解説も載せていますので、そちらも参考にしてください。
コードの簡単な説明
例えば1分間の動画を30分間繰り返した動画を作りたい場合。
まずは1分間の動画を30分以上の動画になるようにループさせます。そして最終的にその動画を30分にトリミングすることで動画を作成しています。
[コピペOK]動画を指定した秒数まで繰り返して伸ばすコード
import cv2
def loop_video_to_duration(input_path, output_path, desired_duration):
cap = cv2.VideoCapture(input_path)
# 動画のFPS、FourCC、幅、高さを取得
fps = int(cap.get(cv2.CAP_PROP_FPS))
fourcc = cv2.VideoWriter_fourcc(*'XVID')
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 出力動画の設定
out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
# 元動画の総フレーム数と時間を計算
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
video_duration = total_frames / fps
# 必要なループ回数を計算
loops_required = int(desired_duration / video_duration) + 1
# 指定の時間を超えるまで動画をループさせる
for _ in range(loops_required):
cap.set(cv2.CAP_PROP_POS_FRAMES, 0) # 動画の先頭に戻る
current_frame = 0
while current_frame < total_frames:
ret, frame = cap.read()
if not ret:
break
out.write(frame)
current_frame += 1
out.release()
cap.release()
# 使用方法
input_video_path = "入力するファイル"
output_video_path = "出力するファイル名"
desired_duration_in_seconds = 60*25 # 例: 25分 ここに伸ばしたい時間を記載してください。
loop_video_to_duration(input_video_path, output_video_path, desired_duration_in_seconds)
コードの解説
このコードは、入力動画を指定した期間になるまでループさせて出力する関数を定義しています。以下に、このコードの詳細な解説を行います。
コードの概要
loop_video_to_duration
という関数を使って、入力動画を指定した持続時間まで繰り返し(ループさせて)新しい動画を作成します。
ライブラリのインポート
import cv2
OpenCV(cv2)をインポートしています。OpenCVは、画像や動画の処理を行うためのライブラリです。
関数定義
def loop_video_to_duration(input_path, output_path, desired_duration):
loop_video_to_duration
という関数を定義しています。この関数は、3つの引数を持っています。
input_path
: 入力動画のパスoutput_path
: ループさせた後の動画を保存するパスdesired_duration
: 出力動画の希望する持続時間(秒単位)
動画の読み込み
cap = cv2.VideoCapture(input_path)
input_path
で指定された動画ファイルを読み込んでいます。
動画の基本情報の取得
fps = int(cap.get(cv2.CAP_PROP_FPS))
fourcc = cv2.VideoWriter_fourcc(*'XVID')
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
この部分では、動画の基本情報を取得しています。
fps
: 動画のフレームレート(1秒あたりのフレーム数)fourcc
: 動画のコーデック(この場合、’XVID’コーデックを使用しています)width
とheight
: 動画の幅と高さ
出力動画の設定
out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
出力動画の設定をしています。出力動画は、入力動画と同じフレームレート、コーデック、解像度で保存されます。
元動画の総フレーム数と時間を計算
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
video_duration = total_frames / fps
入力動画の総フレーム数と全体の持続時間を計算しています。
必要なループ回数の計算
loops_required = int(desired_duration / video_duration) + 1
入力動画を何回繰り返す必要があるかを計算しています。少しでも指定の期間を超えるように、+1しています。
動画のループ
for _ in range(loops_required):
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
current_frame = 0
while current_frame < total_frames:
ret, frame = cap.read()
if not ret:
break
out.write(frame)
current_frame += 1
入力動画をloops_required
回数だけループさせて、新しい動画にフレームを書き込んでいます。
リソースの解放
out.release()
cap.release()
動画の読み書きに使用したリソースを解放しています。
使用方法
input_video_path = "入力するファイル"
output_video_path = "出力するファイル名"
desired_duration_in_seconds = 60*25 # 例: 25分
loop_video_to_duration(input_video_path, output_video_path, desired_duration_in_seconds)
この部分では、入力動画を25分間になるようにループさせ、出力動画として保存しています。
以上が、コードの詳細な解説となります。
コメント