使用 NAudio 在 32 位 PCM Wav 中标准化音量
Normalize volume in a 32 bit PCM Wav with NAudio
有没有办法使用 NAudio 规范化 32 位 wav 文件的音量?
如果音量过低,那么我想要向下标准化,如果音量太低,反之亦然。
没有内置功能,但如果您使用 AudioFileReader
,您可以检查所有样本的值以找到最大绝对样本值。由此您可以计算出原始文件在不剪切的情况下可以放大多少。
然后你可以用AudioFileReader
的Volume
属性放大音频,然后用WaveFileWriter.CreateWaveFile
写出一个新的(IEEE浮点数) ) WAV 文件。 WaveFileWriter.CreateWaveFile16
如果你想在归一化后得到 16 位输出,可以使用。
下面是一些非常简单的示例代码
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);
}
有没有办法使用 NAudio 规范化 32 位 wav 文件的音量?
如果音量过低,那么我想要向下标准化,如果音量太低,反之亦然。
没有内置功能,但如果您使用 AudioFileReader
,您可以检查所有样本的值以找到最大绝对样本值。由此您可以计算出原始文件在不剪切的情况下可以放大多少。
然后你可以用AudioFileReader
的Volume
属性放大音频,然后用WaveFileWriter.CreateWaveFile
写出一个新的(IEEE浮点数) ) WAV 文件。 WaveFileWriter.CreateWaveFile16
如果你想在归一化后得到 16 位输出,可以使用。
下面是一些非常简单的示例代码
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);
}