在Matlab的看起来很很容易,但一旦我用java读取的Wav文件试试我的MatalbJava,Matlab读取Wav文件中的数据,它有何不同?
我知道,从WAV文件44个字节的地址,也就是实际的数据
相比得到错误的数据而在Matlab我只需键入这个
[nData] = wavread("DoorBell.wav",'native')
,我必须说 “133000” 样品 这是样本数3000〜3015部分:
6743 5754 4200 2396 654 -1253 -3141 -4393 -5063 -5062 -4139 -2891 -1588 -193 482
因为有2通道中的第二通道出现过在MATLAB具有相同价值观
但一个我试图用Java代码来读取数据,它不同于我知道,WAV将数据保存到小尾数字节
通过这个片段我决定我有多少字节读取,然后读入byte []数组,并使用shortBuffer和字节缓冲区,使它象INT16样品
dataBuffer = new byte[getDataBytes(subChunk2Size)];
//get the actual data
randAccess.seek(44);
randAccess.read(dataBuffer);
System.out.println(dataBuffer.length);
private static short[] bytesToShort(byte[] bytes)
{
short[] tempArr = new short[bytes.length/2];
ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN).asShortBuffer().get(tempArr);
return tempArr;
}
short[] samples = bytesToShort(dataBuffer);
for (int i = 0; i < samples.length; i++) {
out.println(samples[i]);
}
这里的样品从3000到3015,“请注意,我不拿第一采样作为例子,因为它是零
22298 31254 26640 23561 -29182 7163 -17421 -10258 14828 15084 -10769 -18956 -13063 16383 -7679
我花了很多时间试图找出那是什么? 我不知道!
如果您知道WAV以little-endian格式保存数据,为什么您在代码中使用了'BIG_ENDIAN'? – 2014-10-05 11:43:27
十六进制中的6743是0x1a57。十六进制中的22298是0x571a。嗯... – jaket 2014-10-05 11:48:19
@LukeWoodward 你是对的,这似乎是我的错,我认为使用BIG_ENDIAN会将Little转换成大,谢谢,我做到了! 但是,在这里还有一个问题,不,我有一个数组与所有示例,尝试将其写入文件,但在文件中,我没有所有示例,即使我循环阵列打印所有示例文件 – 2014-10-05 20:41:02