気軽に動画制作ができる時代である。それで、友人たちからビデオレターを集めて、結婚式やその他のイベントで再生したいという場面もあるだろう。そんなとき困るのが動画の音量だ。急に大きな音で再生されたりしないように、一定音量に合わせたい。そこで、今回は、PythonとFFmepgを使って、音量を一定にするプログラムを作ってみよう。

  • フォルダ内の動画をノーマライズ処理しよう

    フォルダ内の動画をノーマライズ処理しよう

プログラムの仕組み

動画ファイルというのは、映像と音声の組合せとなっている。FFmpegというツールを使うと手軽に、映像と音声を分割したり結合したりできる。また、FFmpeg自体に音量を最大音量でノーマライズする機能が備わっているので、これが利用できる。

ただし、FFmpegは細かいコマンドを指定する必要があり、操作が煩雑となっている。そこで、Pythonを利用して、FFmpegのコマンドを動的に生成して実行するプログラムを作ってみよう。

必要なツールとライブラリのインストール

本連載は、Pythonの連載なので、既にPythonがインストール済みとして作業を進めるが、もしインストールしていなければ、公式サイトからダウンロードしよう。WindowsにPythonをインストールする場合、インストールオプションにPATHに追加する(英語で「Add Python 3.x to PATH」)というものがあるのでチェックしてからインストールしよう。

  • Pythonの公式サイトからインストーラーをダウンロードしよう

    Pythonの公式サイトからインストーラーをダウンロードしよう

そして、オープンソースのFFmpegをインストールしよう。FFmpegのインストールについては、本連載の94回目で詳しく解説しているが、こちらのサイトから各OS向けのバイナリファイルがダウンロードできる。

  • FFmpegのバイナリをダウンロードしよう

    FFmpegのバイナリをダウンロードしよう

なお、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」という名前のフォルダが作成され、そのフォルダに変換済みの動画が保存される。

それでは、プログラムを確認してみよう。(*1)ではFFmepgのパスを指定する。Windowsで、プログラムと同じフォルダに、ffmpeg.exeをコピーした場合、この部分を「FFMPEG_PATH = ".\ffmpeg.exe"」と指定すれば良いだろう。

この記事は
Members+会員の方のみ御覧いただけます

ログイン/無料会員登録

会員サービスの詳細はこちら