コード例 #1
0
        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);
            }
        }
コード例 #2
0
        /// <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();
        }