| #!/usr/bin/env ruby |
| |
| require 'open3' |
| require 'json' |
| |
| ffmpeg_bin = 'ffmpeg' |
| target_il = -24.0 |
| target_lra = +11.0 |
| target_tp = -2.0 |
| samplerate = '48k' |
| |
| if ARGF.argv.count != 2 |
| puts "Usage: #{$PROGRAM_NAME} input.wav output.wav" |
| exit 1 |
| end |
| |
| ff_cmd = Array.new([ |
| ffmpeg_bin, |
| '-hide_banner', |
| '-i', ARGF.argv[0], |
| '-af', "loudnorm='I=#{target_il}:LRA=#{target_lra}:tp=#{target_tp}:print_format=json'", |
| '-f', 'null', |
| '-']); |
| |
| _stdin, _stdout, stderr, wait_thr = Open3.popen3(*ff_cmd) |
| |
| if wait_thr.value.success? |
| stats = JSON.parse(stderr.read.lines[-12, 12].join) |
| loudnorm_string = 'loudnorm=' |
| loudnorm_string += 'print_format=summary:' |
| loudnorm_string += 'linear=true:' |
| loudnorm_string += "I=#{target_il}:" |
| loudnorm_string += "LRA=#{target_lra}:" |
| loudnorm_string += "tp=#{target_tp}:" |
| loudnorm_string += "measured_I=#{stats['input_i']}:" |
| loudnorm_string += "measured_LRA=#{stats['input_lra']}:" |
| loudnorm_string += "measured_tp=#{stats['input_tp']}:" |
| loudnorm_string += "measured_thresh=#{stats['input_thresh']}:" |
| loudnorm_string += "offset=#{stats['target_offset']}" |
| else |
| puts stderr.read |
| exit 1 |
| end |
| |
| ff_cmd = Array.new([ |
| ffmpeg_bin, |
| '-y', '-hide_banner', |
| '-i', ARGF.argv[0], |
| '-af', loudnorm_string, |
| '-ar', samplerate, |
| ARGF.argv[1].to_s]); |
| |
| _stdin, _stdout, stderr, wait_thr = Open3.popen3(*ff_cmd) |
| |
| if wait_thr.value.success? |
| puts stderr.read.lines[-12, 12].join |
| exit 0 |
| else |
| puts stderr.read |
| exit 1 |
| end |