【发布时间】:2014-11-29 21:08:11
【问题描述】:
在 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 将数据保存到小端字节中
通过这个 sn-p 我决定我必须读取多少字节,然后将其读入 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 的样本,“请注意,我不以第一个样本为例,因为它是零
22298 31254 26640 23561 -29182 7163 -17421 -10258 14828 15084 -10769 -18956 -13063 16383 -7679
我花了很多时间试图弄清楚那是什么? 我不知道!
【问题讨论】:
-
如果您知道 WAV 以 little-endian 格式保存数据,那您为什么在代码中使用
BIG_ENDIAN? -
6743(十六进制)是 0x1a57。十六进制的 22298 是 0x571a。嗯……
-
@LukeWoodward 你说得对,看来是我的错,我认为使用 BIG_ENDIAN 会将 Little 转换为 big ,谢谢,我做到了!但是这里还有一个问题,不,我有一个包含所有样本的数组,尝试将其写入文件,但是在文件中我没有所有样本,即使我循环遍历数组以将所有样本打印到文件
-
@AhmedAdel:如果您还有其他问题要问,请单独提出问题。
标签: java matlab audio endianness