1cabdff1aSopenharmony_ci#!/usr/bin/env ruby 2cabdff1aSopenharmony_ci 3cabdff1aSopenharmony_cirequire 'open3' 4cabdff1aSopenharmony_cirequire 'json' 5cabdff1aSopenharmony_ci 6cabdff1aSopenharmony_ciffmpeg_bin = 'ffmpeg' 7cabdff1aSopenharmony_citarget_il = -24.0 8cabdff1aSopenharmony_citarget_lra = +11.0 9cabdff1aSopenharmony_citarget_tp = -2.0 10cabdff1aSopenharmony_cisamplerate = '48k' 11cabdff1aSopenharmony_ci 12cabdff1aSopenharmony_ciif ARGF.argv.count != 2 13cabdff1aSopenharmony_ci puts "Usage: #{$PROGRAM_NAME} input.wav output.wav" 14cabdff1aSopenharmony_ci exit 1 15cabdff1aSopenharmony_ciend 16cabdff1aSopenharmony_ci 17cabdff1aSopenharmony_ciff_cmd = Array.new([ 18cabdff1aSopenharmony_ci ffmpeg_bin, 19cabdff1aSopenharmony_ci '-hide_banner', 20cabdff1aSopenharmony_ci '-i', ARGF.argv[0], 21cabdff1aSopenharmony_ci '-af', "loudnorm='I=#{target_il}:LRA=#{target_lra}:tp=#{target_tp}:print_format=json'", 22cabdff1aSopenharmony_ci '-f', 'null', 23cabdff1aSopenharmony_ci '-']); 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci_stdin, _stdout, stderr, wait_thr = Open3.popen3(*ff_cmd) 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ciif wait_thr.value.success? 28cabdff1aSopenharmony_ci stats = JSON.parse(stderr.read.lines[-12, 12].join) 29cabdff1aSopenharmony_ci loudnorm_string = 'loudnorm=' 30cabdff1aSopenharmony_ci loudnorm_string += 'print_format=summary:' 31cabdff1aSopenharmony_ci loudnorm_string += 'linear=true:' 32cabdff1aSopenharmony_ci loudnorm_string += "I=#{target_il}:" 33cabdff1aSopenharmony_ci loudnorm_string += "LRA=#{target_lra}:" 34cabdff1aSopenharmony_ci loudnorm_string += "tp=#{target_tp}:" 35cabdff1aSopenharmony_ci loudnorm_string += "measured_I=#{stats['input_i']}:" 36cabdff1aSopenharmony_ci loudnorm_string += "measured_LRA=#{stats['input_lra']}:" 37cabdff1aSopenharmony_ci loudnorm_string += "measured_tp=#{stats['input_tp']}:" 38cabdff1aSopenharmony_ci loudnorm_string += "measured_thresh=#{stats['input_thresh']}:" 39cabdff1aSopenharmony_ci loudnorm_string += "offset=#{stats['target_offset']}" 40cabdff1aSopenharmony_cielse 41cabdff1aSopenharmony_ci puts stderr.read 42cabdff1aSopenharmony_ci exit 1 43cabdff1aSopenharmony_ciend 44cabdff1aSopenharmony_ci 45cabdff1aSopenharmony_ciff_cmd = Array.new([ 46cabdff1aSopenharmony_ci ffmpeg_bin, 47cabdff1aSopenharmony_ci '-y', '-hide_banner', 48cabdff1aSopenharmony_ci '-i', ARGF.argv[0], 49cabdff1aSopenharmony_ci '-af', loudnorm_string, 50cabdff1aSopenharmony_ci '-ar', samplerate, 51cabdff1aSopenharmony_ci ARGF.argv[1].to_s]); 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_ci_stdin, _stdout, stderr, wait_thr = Open3.popen3(*ff_cmd) 54cabdff1aSopenharmony_ci 55cabdff1aSopenharmony_ciif wait_thr.value.success? 56cabdff1aSopenharmony_ci puts stderr.read.lines[-12, 12].join 57cabdff1aSopenharmony_ci exit 0 58cabdff1aSopenharmony_cielse 59cabdff1aSopenharmony_ci puts stderr.read 60cabdff1aSopenharmony_ci exit 1 61cabdff1aSopenharmony_ciend 62