使用 NAudio 标准化 32 位 PCM Wav 中的音量

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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 @ €> 数据 ...

以上是关于使用 NAudio 标准化 32 位 PCM Wav 中的音量的主要内容,如果未能解决你的问题,请参考以下文章

Naudio wav格式问题

VLC如何在普通PC上播放24位PCM音频?

我将如何使用 NAudio 压缩来自麦克风的传入 PCM 数据?

使用 NAudio 在 C# 中播放 ohLibSpotify pcm 数据流

使用 NAudio 将 WAV 文件转换为 2 个单独的 PCM 文件

如何使用 PCM 8kHZ 和每个样本 16 位的 Naudio loopbackcapture 独占模式