NAudio:将 Wav 文件读取为双数组
NAudio : Read Wav File As Double Array
假设我的 WAV 文件包含 16 位 PCM,我如何将 wav 文件读取为双数组:
using (WaveFileReader reader = new WaveFileReader("myfile.wav"))
{
Assert.AreEqual(16, reader.WaveFormat.BitsPerSample, "Only works with 16 bit audio");
byte[] bytesBuffer = new byte[reader.Length];
int read = reader.Read(bytesBuffer, 0, buffer.Length);
// HOW TO GET AS double ARRAY
}
16 位 PCM 是一种有符号整数编码。假设您想要 0 到 1 之间的双精度数,您只需将每个样本读取为 16 位有符号整数,然后除以 (double)32768.0;
var floatSamples = new double[read/2];
for(int sampleIndex = 0; sampleIndex < read/2; sampleIndex++) {
var intSampleValue = BitConverter.ToInt16(bytesBuffer, sampleIndex*2);
floatSamples[sampleIndex] = intSampleValue/32768.0;
}
请注意,立体声通道是交错的(左样本、右样本、左样本、右样本)。
这里有一些关于格式的有用信息:http://blog.bjornroche.com/2013/05/the-abcs-of-pcm-uncompressed-digital.html
只需在 WaveFileReader
上使用 ToSampleProvider
扩展方法,Read
方法会将 float[]
样本转换为浮点数。或者使用 AudioFileReader
而不是 WaveFileReader
并且您可以再次访问填充 float[]
的 Read
方法的一个版本
假设我的 WAV 文件包含 16 位 PCM,我如何将 wav 文件读取为双数组:
using (WaveFileReader reader = new WaveFileReader("myfile.wav"))
{
Assert.AreEqual(16, reader.WaveFormat.BitsPerSample, "Only works with 16 bit audio");
byte[] bytesBuffer = new byte[reader.Length];
int read = reader.Read(bytesBuffer, 0, buffer.Length);
// HOW TO GET AS double ARRAY
}
16 位 PCM 是一种有符号整数编码。假设您想要 0 到 1 之间的双精度数,您只需将每个样本读取为 16 位有符号整数,然后除以 (double)32768.0;
var floatSamples = new double[read/2];
for(int sampleIndex = 0; sampleIndex < read/2; sampleIndex++) {
var intSampleValue = BitConverter.ToInt16(bytesBuffer, sampleIndex*2);
floatSamples[sampleIndex] = intSampleValue/32768.0;
}
请注意,立体声通道是交错的(左样本、右样本、左样本、右样本)。
这里有一些关于格式的有用信息:http://blog.bjornroche.com/2013/05/the-abcs-of-pcm-uncompressed-digital.html
只需在 WaveFileReader
上使用 ToSampleProvider
扩展方法,Read
方法会将 float[]
样本转换为浮点数。或者使用 AudioFileReader
而不是 WaveFileReader
并且您可以再次访问填充 float[]
Read
方法的一个版本