#!/bin/bash mkdir -p "v9c1kHz16-Loudnorm-SoXr" log_file="loudnorm_log.txt" > "$log_file" # Clear previous log for input in *.{wav,mp4,m4a,flac,ogg,mp3}; do [[ -f "$input" ]] || continue filename="${input%.*}" output="v9c1kHz16-Loudnorm-SoXr/${filename}.mp3" echo "1st pass: $input" ffmpeg -hide_banner -i "$input" -af loudnorm=I=-18:TP=-2:LRA=11:print_format=json -f null - 2> "tmp_log.json" # Parse values from JSON I=$(grep -oP '(?<="input_i" : ")[^"]*' tmp_log.json) TP=$(grep -oP '(?<="input_tp" : ")[^"]*' tmp_log.json) LRA=$(grep -oP '(?<="input_lra" : ")[^"]*' tmp_log.json) THRESH=$(grep -oP '(?<="input_thresh" : ")[^"]*' tmp_log.json) OFFSET=$(grep -oP '(?<="target_offset" : ")[^"]*' tmp_log.json) echo "2nd pass: $input → $output" ffmpeg -hide_banner -i "$input" \ -af "loudnorm=I=-18:TP=-2:LRA=11:measured_I=$I:measured_TP=$TP:measured_LRA=$LRA:measured_thresh=$THRESH:offset=$OFFSET:linear=true:print_format=summary,aresample=resampler=soxr:osf=s16:dither_method=shibata" \ -c:a libmp3lame -q:a 9 -ac 1 -ar 16000 -write_xing 1 "$output" echo "Logged loudness for: $input" >> "$log_file" cat tmp_log.json >> "$log_file" echo -e "\n---\n" >> "$log_file" done rm tmp_log.json echo "✅ All files processed with loudnorm 2-pass, q9 VBR, SoXr, and Shibata @ -ar 22050 mono."