From 9724093daa5aa90147f67120b29cda196d70705a Mon Sep 17 00:00:00 2001 From: John Andrews Date: Sat, 6 Jan 2024 08:21:53 +1300 Subject: [PATCH] FF-1175 - fixing issue with audio normalization crashing if file cannot be normalized --- AudioNodes/Nodes/AudioFileNormalization.cs | 34 ++++++++++++++++------ AudioNodes/Nodes/ConvertNode.cs | 9 ++++-- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/AudioNodes/Nodes/AudioFileNormalization.cs b/AudioNodes/Nodes/AudioFileNormalization.cs index 3280a9e3..78a9da81 100644 --- a/AudioNodes/Nodes/AudioFileNormalization.cs +++ b/AudioNodes/Nodes/AudioFileNormalization.cs @@ -33,14 +33,20 @@ public class AudioFileNormalization : AudioNode long sampleRate = AudioInfo.Frequency > 0 ? AudioInfo.Frequency : 48_000; - string twoPass = DoTwoPass(args, ffmpegExe); - ffArgs.AddRange(new[] { "-i", args.WorkingFile, "-c:a", AudioInfo.Codec, "-ar", sampleRate.ToString(), "-af", twoPass }); + var twoPass = DoTwoPass(args, ffmpegExe); + if (twoPass.Success == false) + { + args.Logger?.WLog("Failed to normalize audio, skipping"); + return 1; + } + + ffArgs.AddRange(new[] { "-i", args.WorkingFile, "-c:a", AudioInfo.Codec, "-ar", sampleRate.ToString(), "-af", twoPass.Normalization }); string extension = new FileInfo(args.WorkingFile).Extension; if (extension.StartsWith(".")) extension = extension.Substring(1); - string outputFile = Path.Combine(args.TempPath, Guid.NewGuid().ToString() + "." + extension); + string outputFile = Path.Combine(args.TempPath, Guid.NewGuid() + "." + extension); ffArgs.Add(outputFile); var result = args.Execute(new ExecuteArgs @@ -59,7 +65,7 @@ public class AudioFileNormalization : AudioNode } [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "")] - public static string DoTwoPass(NodeParameters args, string ffmpegExe) + public static (bool Success, string Normalization) DoTwoPass(NodeParameters args, string ffmpegExe) { //-af loudnorm=I=-24:LRA=7:TP=-2.0" var result = args.Execute(new ExecuteArgs @@ -74,21 +80,31 @@ public class AudioFileNormalization : AudioNode "-" } }); - if(result.ExitCode != 0) - throw new Exception("Failed to prcoess audio track"); + if (result.ExitCode != 0) + { + args.Logger?.WLog("Failed to process audio track"); + return (false, string.Empty); + } string output = result.StandardOutput; int index = output.LastIndexOf("{"); if (index == -1) - throw new Exception("Failed to detected json in output"); + { + args.Logger?.WLog("Failed to detected json in output"); + return (false, string.Empty); + } + string json = output.Substring(index); json = json.Substring(0, json.IndexOf("}") + 1); if (string.IsNullOrEmpty(json)) - throw new Exception("Failed to parse TwoPass json"); + { + args.Logger?.WLog("Failed to parse TwoPass json\""); + return (false, string.Empty); + } LoudNormStats stats = JsonSerializer.Deserialize(json); string ar = $"loudnorm=print_format=summary:linear=true:{LOUDNORM_TARGET}:measured_I={stats.input_i}:measured_LRA={stats.input_lra}:measured_tp={stats.input_tp}:measured_thresh={stats.input_thresh}:offset={stats.target_offset}"; - return ar; + return (true, ar); } private class LoudNormStats diff --git a/AudioNodes/Nodes/ConvertNode.cs b/AudioNodes/Nodes/ConvertNode.cs index 86c957dd..cb214d72 100644 --- a/AudioNodes/Nodes/ConvertNode.cs +++ b/AudioNodes/Nodes/ConvertNode.cs @@ -348,9 +348,12 @@ namespace FileFlows.AudioNodes if (Normalize) { - string twoPass = AudioFileNormalization.DoTwoPass(args, ffmpegExe); - ffArgs.Add("-af"); - ffArgs.Add(twoPass); + var twoPass = AudioFileNormalization.DoTwoPass(args, ffmpegExe); + if (twoPass.Success) + { + ffArgs.Add("-af"); + ffArgs.Add(twoPass.Normalization); + } } ffArgs.Add(outputFile);