気軽に動画制作ができる時代である。それで、友人たちからビデオレターを集めて、結婚式やその他のイベントで再生したいという場面もあるだろう。そんなとき困るのが動画の音量だ。急に大きな音で再生されたりしないように、一定音量に合わせたい。そこで、今回は、PythonとFFmepgを使って、音量を一定にするプログラムを作ってみよう。
プログラムの仕組み
動画ファイルというのは、映像と音声の組合せとなっている。FFmpegというツールを使うと手軽に、映像と音声を分割したり結合したりできる。また、FFmpeg自体に音量を最大音量でノーマライズする機能が備わっているので、これが利用できる。
ただし、FFmpegは細かいコマンドを指定する必要があり、操作が煩雑となっている。そこで、Pythonを利用して、FFmpegのコマンドを動的に生成して実行するプログラムを作ってみよう。
必要なツールとライブラリのインストール
本連載は、Pythonの連載なので、既にPythonがインストール済みとして作業を進めるが、もしインストールしていなければ、公式サイトからダウンロードしよう。WindowsにPythonをインストールする場合、インストールオプションにPATHに追加する(英語で「Add Python 3.x to PATH」)というものがあるのでチェックしてからインストールしよう。
そして、オープンソースのFFmpegをインストールしよう。FFmpegのインストールについては、本連載の94回目で詳しく解説しているが、こちらのサイトから各OS向けのバイナリファイルがダウンロードできる。
なお、FFmpegのサイトにある大きなボタン「Download Source Code」からはソースコードしかダウンロードできないので、executable filesで、OSを選びダウンロード用のサイトからダウンロードしよう。また、FFmpegをダウンロードしたら、コマンドラインから実行できるように環境変数PATHにインストール先のディレクトリを追加するか、今回のプログラムと同じディレクトリに、FFmpegの実行バイナリをコピーしよう。
FFmpegをインストールしたら、ターミナルを起動して「ffmpeg」コマンドを実行してみましょう。正しくFFmpegのバージョン情報が出たなら、正しくインストールできたことが分かります。また、Windowsでプログラムと同じディレクトリにFFmpegのバイナリを配置した場合には、「.¥ffmpeg」と入力して正しく動くかを確認してみてください。
続いて、ターミナル(WindowsならPowerShell、macOSならターミナル.app)を起動して、Pythonのライブラリをインストールしよう。以下は手軽にGUIを利用するためにTkEasyGUIをインストールするコマンドだ。
python -m pip install TkEasyGUI
プログラムを作成しよう
それでは、プログラムを作成しよう。次のプログラムを「video_volume.py」という名前で保存しよう。
import os
import TkEasyGUI as eg
import subprocess
# FFmpegのパスを指定する --- (*1)
FFMPEG_PATH = "ffmpeg"
# 動画の入ったフォルダを選択する --- (*2)
target_dir = eg.popup_get_folder("動画のフォルダを選択")
# 出力先のフォルダを自動的に決定する
if target_dir is None or target_dir == "":
quit()
save_dir = os.path.join(target_dir, "normalized")
os.makedirs(save_dir, exist_ok=True)
# フォルダ内の動画ファイルを列挙する --- (*3)
files = os.listdir(target_dir)
for f in files:
# 動画ファイル以外は無視する
if not f.endswith(".mp4"): continue
# ファイルのパスを作成する
in_video = os.path.join(target_dir, f)
out_video = os.path.join(save_dir, f)
# 音量を正規化する --- (*4)
subprocess.run([
FFMPEG_PATH, "-y", "-i", in_video, "-af",
"loudnorm=I=-14:TP=-1.0:LRA=8",
out_video
])
print("音量を正規化しました:", f)
# 比較テストのためWAVファイルを取り出す --- (*5)
subprocess.run([
FFMPEG_PATH, "-y", "-i", in_video,
"-acodec", "pcm_s16le",
f"{in_video}.wav"
])
subprocess.run([
FFMPEG_PATH, "-y", "-i", out_video,
"-acodec", "pcm_s16le",
f"{out_video}.wav"
])
print("正規化が完了しました")
そして、ターミルで次のコマンドを実行すると、プログラムが実行できる。
# Windowsの場合
python video_volume.py
# macOSの場合
python3 video_volume.py
プログラムが実行されると、次のように、フォルダの選択ダイアログが表示されるので、動画の入ったフォルダを選択しよう。すると、FFmpegを利用して動画の音量調整処理が行われる。
なお、プログラムを実行してフォルダを選択すると、選択したフォルダの下に「normalized」という名前のフォルダが作成され、そのフォルダに変換済みの動画が保存される。