public static decimal GetLoudness(string fileName, Action <double, double> updateProgress = null) { if (Path.GetExtension(fileName) != ".wav") { return(defaultLoadness); } try { WavReader wavReader; using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)) { wavReader = new WavReader(fileStream, Encoding.Default); } WavReader.FmtChunk fmt = (WavReader.FmtChunk)wavReader.Riff.Chunks["fmt "]; double[][] buffer = wavReader.GetSampleData(); R128LufsMeter r128LufsMeter = new R128LufsMeter(); r128LufsMeter.Prepare(fmt.SampleRate, buffer.Length); r128LufsMeter.StartIntegrated(); r128LufsMeter.ProcessBuffer(buffer, (double current, double total) => { updateProgress?.Invoke(current, total); }); r128LufsMeter.StopIntegrated(); // Report input loudness return(-16 - Convert.ToDecimal(r128LufsMeter.IntegratedLoudness)); } catch (Exception ex) { return(defaultLoadness); } }
/// <summary> /// Normalize a file using EBU R128 standard /// </summary> /// <param name="inputFile">Input filename</param> /// <param name="outputFile">Output filename</param> public static void Normalize(string inputFile, string outputFile) { try { // Decode WavReader wavReader = null; if (Path.GetExtension(inputFile).ToLower() == ".wav") { try { using (FileStream fileStream = new FileStream(inputFile, FileMode.Open, FileAccess.Read, FileShare.Read)) { wavReader = new WavReader(fileStream, Encoding.Default); } } catch (WavReader.FormatNotSupportedException ex) { wavReader = null; } } if (wavReader == null) { Stream ffStream; try { ffStream = FFmpegWavPiper.GetS32WavStream(inputFile, FFmpegLogReceived); } catch (FFmpegWavPiper.FFmepgNotFoundException) { Console.WriteLine("FFmpeg not found. Non-wav files require ffmpeg for decoding support. File skipped."); return; } wavReader = new WavReader(ffStream, Encoding.UTF8); } WavReader.FmtChunk fmt = (WavReader.FmtChunk)wavReader.Riff.Chunks["fmt "]; double[][] buffer = wavReader.GetSampleData(); // Normalize buffer = Normalize(buffer, fmt.SampleRate); // Encode WavWriter wavWriter = new WavWriter(buffer, fmt.SampleRate, 0x0003, 32, null, Encoding.Default); if (wavReader.Riff.Chunks.ContainsKey("LIST")) { wavWriter.Infos = ((WavReader.ListChunk)wavReader.Riff.Chunks["LIST"]).Data; } else { wavWriter.Infos = new System.Collections.Generic.SortedDictionary <string, string>(); } wavWriter.Infos["ISFT"] = "Build-in codec"; wavWriter.Infos["ITCH"] = "R128Normalization"; wavWriter.Save(outputFile); Console.WriteLine("File saved: {0}", Path.GetFileNameWithoutExtension(outputFile)); } catch (Exception ex) { Console.WriteLine("An exception has occurred : "); Console.WriteLine($"{ex.GetType()} : {ex.Message}"); Console.WriteLine(ex.StackTrace); } GC.Collect(); }