PythonでOpenCVを使うとプログラマの思い通りに、しかも簡単に動画を編集することができます。ここでは動画の再生速度を元よりもスローにしたり、高速にしたりといった調整を行う方法を紹介します。
こんにちは。wat(@watlablog)です。
動画編集は高価なソフトを使うのも良いですが、無料のPythonでも色々できます!ここではOpenCVを使って動画の速度を自由に変更する方法を紹介します!
動画の速度調整種類とその効果
スロー再生で重要な映像をゆっくり見せよう!
動画の速度は遅くするか速くするかの2種類の変更が可能です。
まずは動画の速度を遅くするスロー再生ですが、これは動画のFPS(Frames Per Second)という1秒当たりに表示させるフレームの枚数の設定を小さくすることで実現させます。
スロー再生させることで得られる効果は「じっくり見せる」という所にあります。
例えば野球のボールがバットに当たる瞬間、物が衝突する瞬間、風船が割れる瞬間…と通常の速度で撮影された動画では一瞬で終わってしまう現象をゆっくりじっくり見せることができます。
高速な現象をゆっくり見ることで、その時にどういう挙動をしていたかを確認することができるので、実験評価目的でも利用されることがよくありますね。
早送り再生で退屈なシーンを高速で飛ばそう!
次は早送り再生です。これは元の動画のFPSを大きくすることで実現させます。
単調な映像を早送り再生をすることで、「視聴者のストレスを軽減する効果」を出します。
他にも、変化の少ない現象をあえて高速で見せることで、変化の本質的な意味を捉えやすくする目的で早送りは使われたりします。
こちらも実験結果を評価する時に使われることはよくありますね。
それではスロー再生と早送り再生を実現する動画の作り方をPythonコードで説明していきます。
PythonでFPSを調整して動画を再保存するコード
サンプル動画
今回のプログラムで使用するサンプル動画を以下のYouTube動画に示します。
これは「Python/OpenCVでWebカメラ!撮影した動画を保存する」で紹介したWebカメラで撮影した動画です。
全コード
以下に動画を読み込み、FPSを調整して動画の再生速度を変更するプログラムの全コードを載せます。
関数の中身の基本は先ほど紹介したWebカメラの映像を保存する記事内のコードと似ています。fpsを元の動画から取得した後にfps_newと新しいフレームレートを指定して動画を保存している所が違いになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import cv2 # 動画を読み込み、FPSを変更して別名で保存する関数 def m_speed_change(path_in, path_out, scale_factor, color_flag): # 動画読み込みの設定 movie = cv2.VideoCapture(path_in) # 動画ファイル保存用の設定 fps = int(movie.get(cv2.CAP_PROP_FPS)) # 元動画のFPSを取得 fps_new = int(fps * scale_factor) # 動画保存時のFPSはスケールファクターをかける w = int(movie.get(cv2.CAP_PROP_FRAME_WIDTH)) # 動画の横幅を取得 h = int(movie.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 動画の縦幅を取得 fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') # 動画保存時のfourcc設定(mp4用) video = cv2.VideoWriter(path_out, fourcc, fps_new, (w, h), color_flag) # 動画の仕様(ファイル名、fourcc, FPS, サイズ) # ファイルからフレームを1枚ずつ取得して動画処理後に保存する while True: ret, frame = movie.read() # フレームを取得 video.write(frame) # 動画を保存する # フレームが取得できない場合はループを抜ける if not ret: break # 撮影用オブジェクトとウィンドウの解放 movie.release() return path_in = 'video1.mp4' # 元動画のパス path_out = 'video_out.mp4' # 保存する動画のパス scale_factor = 0.1 # FPSにかけるスケールファクター color_flag = True # カラー動画はTrue, グレースケール動画はFalse # 動画の再生速度を変更する関数を実行 m_speed_change(path_in, path_out, scale_factor, color_flag) |
実行結果:スロー再生
「scale_factor = 0.1」とFPSにかけるスケールファクターを小さくしてみましょう。
こうすることで以下のようなスロー再生動画が生成されます。
元動画の1/10のスピードになりました!
実行結果:早送り再生
続いて、「scale_factor = 3」とFPSに3をかけてみましょう。
すると以下のような3倍速動画が生成されます。
思い通りのプログラムが出来た!
まとめ
本記事では動画速度をスローや早送りで再生する概要やコードを紹介しました。
コードの実行結果として1/10倍速や3倍速の動画が生成されることを確認し、自在に動画再生速度を変更できることがわかりました。
動画再生速度はFPSを変更することで簡単に変えられるね!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!
コメント