在Matlab看起来非常简单但是一旦我尝试使用java读取Wav文件,我得到的错误数据与Matalb相比
我知道Wav文件中的44字节地址,即实际数据
使用Matlab我只需输入
[nData] = wavread("DoorBell.wav",'native')
我说" 133,000"样品 这是样本号3000~3015的部分:
6743 5754 4200 2396 654 -1253 -3141 -4393 -5063 -5062 -4139 -2891 -1588 -193 482
因为有2个通道,所以第二个通道在matlab中也会显示相同的值
但我尝试使用Java代码来读取数据,不同之处我知道WAV将数据保存为小端字节
通过这个片段,我决定要读取多少字节,然后将其读入byte []数组,并使用shortBuffer和byteBuffer使其像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,&#34;请注意,我不会以第一个样本为例,因为它是零
22298 31254 26640 23561 -29182 7163 -17421 -10258 14828 15084 -10769 -18956 -13063 16383 -7679
我花了很多时间试着找出那是什么? 我不知道!
答案 0 :(得分:0)
每个样本的WAV格式通常为16位 - 这些详细信息位于标题值中,您显然无法解析!所以单个16位样本作为两个字节存储在文件中 - 因此需要获得正确的字节顺序。我首先定义一个常量,比如在浮点0.6中,然后使用两种语言将其转换为16位的整数。通过再次转换回浮动来确认它的工作原理,以确保您获得原始的0.6浮动。一旦掌握了,这方面的练习就会非常有启发性。