2015-09-14 80 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[]