HOME | Linuxメモ

Linuxメモ

OS:CentOS Stream9

ffmpegで音量調整

最大ピークを0dBにノーマライズ(リスト一括)

フォルダ構成
# 実行ファイル
volume.sh
# 入力ファイルリスト
list.txt
# MP3ファイルがあるディレクトリ
org
# 出力を保存するディレクトリ
result

list.txt
aaaa.mp3
bbbb.mp3
...
zzzz.mp3

volume.sh
# 入力ファイルリスト
LIST_FILE="./list.txt"
# MP3ファイルがあるディレクトリ
INPUT_DIR="org"
# 出力を保存するディレクトリ
OUTPUT_DIR="result"

# 出力フォルダが存在しない場合は作成する
#mkdir -p "$OUTPUT_DIR"

# ログファイルを初期化
echo "Starting processing..." > process_log.txt

# ファイルリストを配列に読み込む
mapfile -t filelist < "$LIST_FILE"

# 配列でファイルリストをループ処理
for filename in "${filelist[@]}"; do
  # 入力ファイルのパス
  input_file="$INPUT_DIR/$filename"
  output_file="$OUTPUT_DIR/$filename"

  # MP3ファイルが存在するか確認
  if [ -f "$input_file" ]; then
    echo "Processing: $filename" >> process_log.txt

    # 最大音量を調べる
    max_volume=$(ffmpeg -i "$input_file" -af "volumedetect" -f null /dev/null 2>&1 | grep "max_volume" | awk '{print $5}')

    # 増幅するためのゲインを計算 (max_volumeの逆数を取る)
    gain=$(echo "$max_volume" | awk '{print -1 * $1}')

    echo "Max volume of $filename is $max_volume dB, adjusting by $gain dB" >> process_log.txt

    # ピークノーマライズのために音量を調整
    ffmpeg -i "$input_file" -af "volume=${gain}dB" "$output_file" 2>&1 | tee -a process_log.txt

  else
    echo "File not found: $input_file" >> process_log.txt
  fi
done

echo "All files processed." >> process_log.txt

実行例
nohup sh volume.sh &
実行ログ
process_log.txt