【问题标题】:Normalize volume in a 32 bit PCM Wav with NAudio使用 NAudio 标准化 32 位 PCM Wav 中的音量
【发布时间】:2017-08-14 16:00:18
【问题描述】:

有没有办法使用 NAudio 标准化 32 位 wav 文件中的音量?

如果音量正在削波,那么我想要向下标准化,如果音量太低,反之亦然。

【问题讨论】:

    标签: c# naudio


    【解决方案1】:

    没有内置功能,但如果您使用AudioFileReader,您可以检查所有样本的值以找到最大绝对样本值。由此您可以计算出原始文件可以放大多少而不进行剪辑。

    然后您可以使用AudioFileReaderVolume 属性来放大音频,然后使用WaveFileWriter.CreateWaveFile 将其写入新的(IEEE 浮点)WAV 文件。如果您想要标准化后的 16 位输出,则可以使用 WaveFileWriter.CreateWaveFile16

    这里有一些非常简单的示例代码

    var inPath = @"E:\Audio\wav\input.wav";
    var outPath = @"E:\Audio\wav\normalized.wav";
    float max = 0;
    
    using (var reader = new AudioFileReader(inPath))
    {
        // find the max peak
        float[] buffer = new float[reader.WaveFormat.SampleRate];
        int read;
        do
        {
            read = reader.Read(buffer, 0, buffer.Length);
            for (int n = 0; n < read; n++)
            {
                var abs = Math.Abs(buffer[n]);
                if (abs > max) max = abs;
            }
        } while (read > 0);
        Console.WriteLine($"Max sample value: {max}");
    
        if (max == 0 || max > 1.0f)
            throw new InvalidOperationException("File cannot be normalized");
    
        // rewind and amplify
        reader.Position = 0;
        reader.Volume = 1.0f / max;
    
        // write out to a new WAV file
        WaveFileWriter.CreateWaveFile(outPath, reader);
    }
    

    【讨论】:

    • 它工作得很好,但它使我的文件很大,从原来的 10mb 到 269mb...知道为什么吗?我能解决吗?
    • 文件看起来像在真实模式下一样,我需要压缩它,知道如何完成它或其他方法让它恢复正常吗?
    • 我一直在实现这段代码,它确实规范了我的文件。但是,它似乎“扭曲”了一些阻止我的代码使用规范化文件的东西。难道是标题已经改变了?我正在使用 FFMPEG 将 MP3 文件转换为 WAV,然后运行 ​​NAudio 标准化方法。 FFMpeg 参数:-i "input.mp3" -codec:a pcm_s16le -ar 8000 "output.wav" 标头在标准化前后开始:原始:RIFFF3 WAVEfmt @ €> LIST INFOISFT Lavf57.66.101 data ...归一化:RIFF&3 WAVEfmt @ €> 数据 ...
    猜你喜欢
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多