2009-06-25 196 views
3

我需要將音頻數據作爲「16位整數數組」(來自我有限的文檔)傳遞到第三方系統。Java - 將音頻的字節數組轉換爲整數數組

這是我到目前爲止所嘗試過的(系統從生成的bytes.dat文件中讀取它)。

AudioInputStream inputStream = AudioSystem.getAudioInputStream(new File("c:\\all.wav")); 
    int numBytes = inputStream.available(); 
    byte[] buffer = new byte[numBytes]; 
    inputStream.read(buffer, 0, numBytes); 

    BufferedWriter fileOut = new BufferedWriter(new FileWriter(new File("c:\\temp\\bytes.dat"))); 

    ByteBuffer bb = ByteBuffer.wrap(buffer); 

    while (bb.remaining() > 1) { 
     short current = bb.getShort(); 
     fileOut.write(String.valueOf(current)); 
     fileOut.newLine(); 
    } 

這似乎並不奏效 - 第三方系統無法識別它,我也無法將該文件導入Audacity作爲原始音頻。

有沒有什麼明顯的我做錯了,還是有更好的方法來做到這一點?

額外信息:波形文件是16bit,44100Hz,單聲道。

+0

你能告訴我更多關於這個第三方系統嗎? – akarnokd 2009-06-25 15:03:38

回答

2

編輯2: 我很少使用AudioInputStream,但您寫出原始數據的方式似乎相當複雜。一個文件只是一串隨後的字節,所以你可以用一個FileOutputStream.write()調用來寫你的音頻字節數組。系統可能使用大端格式,而WAV文件則以小端格式存儲(?)。然後,您的音頻可能會播放,但非常默默無聞。

編輯3

刪除了代碼示例。

是否有一個原因,你正在使用換行符將音頻字節作爲字符串寫入文件? 我認爲系統預計音頻數據是二進制格式,而不是字符串格式。

+0

感謝您的幫助。我已經接受了你的答案,因爲你暗示大/小端:) – William 2009-06-25 15:15:02

2

我剛纔設法解決了這個問題。我不得不在創建ByteBuffer後添加這一行。

bb.order(ByteOrder.LITTLE_ENDIAN);