2011-06-04 222 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