你WAV格式是24位,但雙用途64位。所以存儲在你的wav中的數量不能加倍。每個幀和通道有一個24位有符號整數,相當於這6個字節。
你可以做這樣的事情:
private static double readDouble(ByteBuffer buf) {
int v = (byteBuffer.get() & 0xff);
v |= (byteBuffer.get() & 0xff) << 8;
v |= byteBuffer.get() << 16;
return (double)v;
}
你會一次爲左聲道,一旦調用該方法的權利。不知道正確的順序,但我想先離開。正如little-endian所指出的,字節從最低有效位讀到最高有效位。較低的兩個字節被掩碼爲0xff
,以便將它們視爲無符號。最重要的字節被視爲帶符號,因爲它將包含帶符號的24位整數的符號。
如果您在陣列上操作,您可以在沒有ByteBuffer
(例如,像這樣:
double[] doubles = new double[byteArray.length/3];
for (int i = 0, j = 0; i != doubles.length; ++i, j += 3) {
doubles[i] = (double)((byteArray[j ] & 0xff) |
((byteArray[j+1] & 0xff) << 8) |
(byteArray[j+2] << 16));
}
你會得到交錯,所以你可能要分開算賬這些兩個通道的樣本。
如果你有單聲道,你將不會有兩個通道交錯但只有一次。對於16位可以使用byteBuffer.getShort()
,對於32位可以使用byteBuffer.getInt()
。但24位不常用於計算,所以ByteBuffer
沒有這方面的方法。如果你有未簽名的樣本,你將不得不掩蓋所有的跡象,並抵消結果,但我認爲無符號的WAV是不常見的。
來源
2013-03-20 22:19:59
MvG
聽起來像一些這些數字實際上不能解釋爲'double' ... – 2013-03-20 20:22:52
複製以http://計算器。com/questions/2905556/how-can-i-convert-a-byte-array-into-a-two-and-back? – maszter 2013-03-20 20:24:44
@maszter:不是重複的,因爲字節不代表雙打。 – MvG 2013-03-20 22:33:49