在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