2015-09-14 16 views
2

假设我的WAV文件包含16位PCM,我怎么能读wav文件为双阵列:n音讯:读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 
} 

回答

1

16位PCM是签署整数编码。假设你想要在0和1之间加倍,你只需将每个采样作为一个16位有符号整数读取,然后除以(双倍)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

2

只需使用你的WaveFileReaderToSampleProvider扩展方法,以及Read方法将与样本float[]转换成浮点数。或者,使用AudioFileReader而不是WaveFileReader,然后再次访问Read方法的一个版本,该方法将填充float[]