使用 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
,您可以检查所有样本的值以找到最大绝对样本值。由此您可以计算出原始文件可以放大多少而不进行剪辑。
然后您可以使用AudioFileReader
的Volume
属性来放大音频,然后使用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 压缩来自麦克风的传入 PCM 数据?
使用 NAudio 在 C# 中播放 ohLibSpotify pcm 数据流