はじめに
逆再生の動画を作る必要が出てきており、調べていたらPythonの動画編集ライブラリ「MoviePy」が便利そうだったのでこのライブラリを活用して動画を逆再生(リバース)の動画を作成する方法を解説します。
念のための補足ですが、この記事の一部は生成AIを活用して作ってます。(リンクや初心者向けの補足など)
初期準備:MoviePyのインストール
このプログラムを動かすには、外部ライブラリである moviepy が必要です。まずはコマンドプロンプト(Windows)またはターミナル(Mac)を開き、以下の pip コマンドを実行してインストールしてください。
pip install moviepy
(補足)MoviePyのバージョンについて
2024年にMoviePyはバージョン2.xへと大型アップデートされ、旧バージョン(v1.x)とはプログラムの書き方が大きく変わりました。本記事では最新の v2.x 以降に対応した最新のコード を解説しています。各処理の引数の意味とパラメータ解説
プログラムの中で動画を読み込み、処理し、書き出すために使われている主要な関数と、その引数(パラメータ)について解説します。
動画の読み込み: VideoFileClip()
VideoFileClip は動画を読み込むための処理です。引数には動画のファイル名(パス)の指定をします。
使い方の例としては下記のような指定をします。
VideoFileClip("input.mp4")
今回は動画の読み込みだけでしたが、他にも下記のようなパラメータ指定ができます。
| パラメータ名 | 説明 | 引数の例 |
|---|---|---|
audio |
音声を読み込むかどうかを指定します。 | True(デフォルト)または False。Falseにすると読み込み段階で音声がカットされるため、メモリの節約になります。 |
target_resolution |
読み込み時に動画を強制的にリサイズします。 | (高さ, 幅)のタプル形式(例:(720, 1280))。4K動画などを扱う際、あらかじめ画質を落として読み込むことで処理を軽くできます。 |
has_mask |
透過(アルファチャンネル)情報を含む動画かどうかを指定します。 | True または False(デフォルト)。背景が透明な透過動画(.movなど)を扱う場合は True にする必要があります。 |
ここに記載されているのはよく使うと思うパラメータだけなので、ほかのパラメータについては公式ドキュメントを参照してください。
👉 VideoFileClip の公式ドキュメント
逆再生の適用: with_effects([vfx.TimeMirror()])
with_effects は、読み込んだ動画に対してエフェクト(効果)を適用するためのメソッドです。引数には適用したいエフェクトをリスト形式([ ] の中)で指定します。どのような順番で動画を加工しているかをリストで指定していくイメージです。
今回はそのエフェクトとして vfx.TimeMirror() だけを指定しています。これは動画の時間を反転(逆再生)させる処理です。このTimeMirror関数自体には引数はありません。
使い方の例としては下記のような指定をします。
clip.with_effects([vfx.TimeMirror()])今回は逆再生だけでしたが、ほかの処理もしたい場合は下記のようにwith_effects関数の引数に処理をしたい順でリストを渡します。
clip.with_effects([afx.VolumeX(0.5), vfx.Resize(0.3), vfx.Mirrorx()])
この場合だと音量を半分にをしてから画面サイズを0.3倍にしてをして最後に左右反転の処理がされます。
TimeMirror関数の詳しい仕様等については公式ドキュメントを参照してください。
(補足)公式ドキュメントではTimeMirror関数が
moviepy.video.fx.TimeMirrorとなってますが、これはmoviepy.video.fxをvfxとエイリアスしているからです。詳細は公式ドキュメントを参照して下さい。
動画の書き出し: write_videofile()
write_videofile は処理した動画を保存(書き出し)するための処理です。引数には保存するファイル名、コーデック、音声の有無などを指定します。
使い方の例としては下記のような指定をします。今回は無音声の動画にするため、引数のaudioをFalseにしてますが、音声付きで出力したい場合はTrueにしてください。
reversed_clip.write_videofile("output_no_audio.mp4", codec="libx264", audio=False)
他にも下記のようなパラメータ指定ができます。
| パラメータ名 | 説明 | 引数の例 |
|---|---|---|
fps |
出力する動画のフレームレート(1秒間のコマ数)を指定します。 | 整数(例:30 や 60)。指定しない場合、元の動画のFPSが引き継がれますが、エラーが出る場合は明示的に fps=30 などと指定すると安定します。 |
preset |
動画を書き出す(エンコードする)際の「処理速度」と「圧縮効率」のバランスを指定します。 | "ultrafast"、"fast"、"medium"(デフォルト)など。"ultrafast" にすると処理は一瞬で終わりますが、ファイルサイズが大きくなります。 |
threads |
書き出し処理に使用するCPUのコア(スレッド)数を指定します。 | 整数(例:4 や 8)。ご自身のパソコンの性能に合わせて数値を増やすと、処理時間が大幅に短縮されます。 |
bitrate |
出力される動画の画質(情報量)を指定します。 | 文字列(例:"5000k"など)。元の動画より画質が粗くなってしまう場合に、数値を高く指定すると画質が維持されます。 |
ここに記載されているのはよく使うと思うパラメータだけなので、ほかのパラメータについては公式ドキュメントを参照してください。
👉 write_videofile の公式ドキュメント
完成したPythonコードと使い方のルール
以下が完成したプログラムです。
from moviepy import VideoFileClip, vfx
def reverse_video_moviepy_no_audio(input_path, output_path):
print("動画を読み込んでいます...")
clip = VideoFileClip(input_path)
print("逆再生の処理中...")
# v2.xの新しい書き方でTimeMirrorエフェクトを適用
reversed_clip = clip.with_effects([vfx.TimeMirror()])
print("動画を書き出しています(音声なし)...")
reversed_clip.write_videofile(output_path, codec="libx264", audio=False)
clip.close()
reversed_clip.close()
print("完了しました!")
# ==========================================
# 実行部分(ここを自分の環境に合わせて変更)
# ==========================================
input_file = "input.mp4" # 読み込む動画ファイル名
output_file = "output_no_audio.mp4" # 保存する動画ファイル名
reverse_video_moviepy_no_audio(input_file, output_file)
🔰 初心者向けの使い方のルール
- 動画は同じフォルダに置く
プログラムのinput_file = "input.mp4"という記述は、「このPythonファイルと同じ場所にある『input.mp4』を探す」という意味です。必ず同じフォルダ内に動画を入れてください。 - ファイル名を正しく記述する
拡張子(.mp4など)を書き忘れないようにしましょう。
補足事項(処理時間とメモリについて)
動画の逆再生処理は、パソコンのメモリ(RAM)を大量に消費します。数分の長い動画や、4Kなどの高解像度動画を処理しようとすると、パソコンがフリーズしたりエラーで止まったりすることがあります。プログラムの書き方が悪いのか、PCの性能が悪いのかを切り分けるためにまずは数秒〜十数秒程度の短い動画からテストを行うことをおすすめします。
0 件のコメント:
コメントを投稿