#!/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}')
[Python + ffmpeg] 動画や音楽ファイルのラウドネス値を正規化 ※いい感じの大きさの音量にする
ラベル:
Python 3.x,
シェル