2011-06-04 220 views
5

我正在使用Java AudioInputStream讀取.wav音頻文件。音頻文件是16位PCM簽名的,samplerate = 44100,framesize = 2,framelength = 114048.我設法獲取音頻數據以字節數組的形式存在,但我不確定我應該給這個字節數組分配多少大小,以便我可以將它轉換爲浮點數。 我正在做一些使用Goertzel算法的音頻處理,它採用浮點數組的輸入,例如「float [] x」。以下是我正在使用的一些代碼片段。提前致謝。將wav音頻格式字節數組轉換爲浮點數

try { 
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(fileIn); 
    } 

while (numBytesRead != -1) { 
numBytesRead = audioInputStream.read(audioBytes); 

// Logic goes here 
floatValue = byteArrayToFloat(audioBytes); 
} 

回答

9

音頻文件16位PCM簽字,採樣率= 44100,框架尺寸= 2,幀長度= 114048.

我從上面假設你只有一個通道(2字節採樣* 1通道= 2字節幀)。

第一步是將數據作爲16位整數類型的序列獲取,即Java中的short

import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.ShortBuffer; 

... 

byte[] audioBytes = ... 

ShortBuffer sbuf = 
    ByteBuffer.wrap(audioBytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer(); 
short[] audioShorts = new short[sbuf.capacity()]; 
sbuf.get(audioShorts); 

現在你如何將其轉換成float S依賴於下游的功能是如何想到的音頻表示。例如,如果他們希望浮點數> = -1和< = 1,那麼你可以這樣做:

float[] audioFloats = new float[audioShorts.length]; 
for (int i = 0; i < audioShorts.length; i++) { 
    audioFloats[i] = ((float)audioShorts[i])/0x8000; 
} 

不幸的是有很多的方法來表示的音頻。

+1

我改正你的示例代碼假設AudioInputStream是小端?如果你不能依賴這個假設,是否可以安全地調用.getFormat()。isBigEndian(),如果它返回true,則傳入ByteOrder.BIG_ENDIAN? – rlkw1024 2013-01-09 20:14:16