【发布时间】:2017-08-14 16:00:18
【问题描述】:
有没有办法使用 NAudio 标准化 32 位 wav 文件中的音量?
如果音量正在削波,那么我想要向下标准化,如果音量太低,反之亦然。
【问题讨论】:
有没有办法使用 NAudio 标准化 32 位 wav 文件中的音量?
如果音量正在削波,那么我想要向下标准化,如果音量太低,反之亦然。
【问题讨论】:
没有内置功能,但如果您使用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);
}
【讨论】: