[Python + ffmpeg] 動画や音楽ファイルのラウドネス値を正規化 ※いい感じの大きさの音量にする

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# pylint: disable=too-many-lines,too-many-arguments
import json
import os
import re
import subprocess
import sys

filename = sys.argv[1]


# 対象ファイルを解析する
# ・youtube等での基準を指定(ラウドネス値 -14LUFS)
# ・処理結果は指定した基準に近づけるための補正値
#
# 参考資料
# FFmpeg Filters Documentation | 8.97 loudnorm
# https://ffmpeg.org/ffmpeg-filters.html#loudnorm
#loudnorm = "I=-14:LRA=7:TP=-1.5"
loudnorm = "I=-17:LRA=7.0:TP=-2.0"
#loudnorm = "I=-24:LRA=15:TP=-1.5"
command = [
    'ffmpeg',
    '-i', f"{filename}",
    '-af', f"loudnorm={loudnorm}:print_format=json",
    '-f', 'null',
    '-',
]
res = subprocess.run(
   command, encoding='utf-8', capture_output=True, check=False, text=True)
result = re.match(r'.*(\{.*?\}).*', res.stderr, re.DOTALL)
measured = json.loads(result.group(1))


# ラウドネス正規化
basename = os.path.basename(filename)
normname = "{0[0]}_normalized{0[1]}".format(os.path.splitext(basename))
param = (
    f":measured_I={measured['input_i']}"
    f":measured_LRA={measured['input_lra']}"
    f":measured_TP={measured['input_tp']}"
    f":measured_thresh={measured['input_thresh']}"
    f":offset={measured['target_offset']}"
)
command = [
    'ffmpeg',
    '-y',
    '-i', f"{filename}",
    '-af', f"loudnorm={loudnorm}{param}",
    f"{normname}"
]
res = subprocess.run(
   command, encoding='utf-8', capture_output=True, check=False, text=True)
print(f'generated: {normname}')