Guest User

loudnorm script

a guest
Jul 23rd, 2026
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.20 KB | Software | 0 0
  1. import subprocess
  2. import json
  3. import re
  4. import os
  5.  
  6. def run_first_pass(input_file):
  7.     command = [
  8.         'ffmpeg',
  9.         '-i', input_file,
  10.         '-vn',
  11.         '-filter_complex',
  12.         'loudnorm=I=-14:TP=-2:LRA=11:print_format=json',
  13.         '-f', 'null', '-'
  14.     ]
  15.     result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, encoding='utf-8', errors='replace')
  16.  
  17.     match = re.search(r'\{[\s\S]*?\}', result.stderr)
  18.     if not match:
  19.         raise RuntimeError("Could not find loudnorm JSON output.")
  20.  
  21.     loudnorm_data = json.loads(match.group(0))
  22.     print("parsed data:")
  23.     print(loudnorm_data)
  24.     return loudnorm_data
  25.  
  26. def run_second_pass(input_file, output_file, loudnorm_data):
  27.     loudnorm_filter = (
  28.         f"loudnorm=I=-14:TP=-2:LRA=11:measured_I={loudnorm_data['input_i']}:"
  29.         f"measured_TP={loudnorm_data['input_tp']}:measured_LRA={loudnorm_data['input_lra']}:"
  30.         f"measured_thresh={loudnorm_data['input_thresh']}:offset={loudnorm_data['target_offset']}:linear=true:print_format=summary"
  31.     )
  32.  
  33.     filter_complex = f"{loudnorm_filter}"
  34.  
  35.  
  36.     command = [
  37.         'ffmpeg',
  38.         '-i', input_file,
  39.         '-filter_complex', filter_complex,
  40.         '-vn',
  41.         '-c:a', 'aac',
  42.         '-b:a', '320k',
  43.         output_file
  44.     ]
  45.  
  46.     subprocess.run(command, check=True)
  47.     print("Done.")
  48.  
  49. def process_audio(input_file, output_file):
  50.     print("Running first pass...")
  51.     loudnorm_data = run_first_pass(input_file)
  52.  
  53.     print("Running second pass...")
  54.     run_second_pass(input_file, output_file, loudnorm_data)
  55.  
  56. def main():
  57.     list_file = "to_loudnorm.txt"
  58.     out_dir = "out"
  59.     with open(list_file, 'r', encoding='utf-8-sig') as f:
  60.         for line in f:
  61.             input_path = line.strip()
  62.             if not input_path:
  63.                 continue
  64.  
  65.             output_path = os.path.join(out_dir, os.path.splitext(input_path)[0] + ".m4a")
  66.             output_dir = os.path.dirname(output_path)
  67.  
  68.             try:
  69.                 process_audio(input_path, output_path)
  70.             except Exception as e:
  71.                 print(f"Failed to process {input_path}: {e}")
  72.  
  73. if __name__ == "__main__":
  74.     main()
Advertisement
Add Comment
Please, Sign In to add comment