2011-11-29 88 views
1

我正面臨有關音頻解碼的問題。我有用於mp3解碼的SPIMP3庫,我試圖解碼mp3並將它們存儲到一個字節數組中。Java - MP3解碼並將其存儲爲字節數組

這裏是東西,當我嘗試解碼2分鐘的MP3歌曲它讓我來說吧,接下來的字節:

[-1,0,42,-115,-45,0, 14 ...等]。

但是,當我切一半,MP3和嘗試上半年我得到以下字節解碼:

[1,0,0,65,-97,135,-64,32 ... etc]

奇怪的是他們不匹配。這裏唯一不同的是音頻長度,但我解碼的兩個mp3樣本的第一部分是相同的。

這裏是我的代碼:

public void testPlay(String mp3) { 
    try { 
     File file = new File(mp3); 
     AudioInputStream in = AudioSystem.getAudioInputStream(file); 
     AudioInputStream din = null; 
     AudioFormat baseFormat = in.getFormat(); 
     AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
       baseFormat.getSampleRate(), 
       16, 
       baseFormat.getChannels(), 
       baseFormat.getChannels() * 2, 
       baseFormat.getSampleRate(), 
       false); 
     din = AudioSystem.getAudioInputStream(decodedFormat, in); 

     play(decodedFormat, din); 
     spi(decodedFormat, in); 
     in.close(); 
    } catch (Exception e) { 
     System.out.println("MP3"); 
    } 

} 

private void play(AudioFormat targetFormat, AudioInputStream din) throws IOException, LineUnavailableException { 

    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    byte[] data = new byte[4096]; 
    SourceDataLine line = getLine(targetFormat); 

     int nBytesRead = 0, nBytesWritten = 0; 
     while (nBytesRead != -1) { 
      nBytesRead = din.read(data, 0, data.length); 
      if (nBytesRead != -1) { 
       nBytesWritten = line.write(data, 0, nBytesRead); 
       out.write(data, 0, 4096); 
      } 

     } 

     byte[] audio = out.toByteArray(); 

} 

這是不是可以預期的還是有我的代碼中的問題???

如何更改我的代碼以獲取相同字節的匹配部分我的mp3?

謝謝。

回答

3

此行應該是:

out.write(data, 0, nBytesRead); 
+0

你好jtahlborn,感謝您的答覆。 我試過你的建議,但沒有運氣。數據仍然有一點偏離最初的一次。讓我解釋我在做什麼, – DaReDeViL

+0

可以說我有一首2分鐘的歌曲,我嘗試用上面的代碼對它進行解碼,然後我在字節數組中獲得以下某些特定位置:[2,44,-71, - 99,134]。 然後我用大膽從我的mp3的結尾剪下1(一)秒。然後我嘗試解碼它。我獲得了與最後一次相同的位置數據:[9,35,-66,-33,124]。在陣列開始的時候,給定的位置很接近。數據不應該保持與最後一次相同嗎? 謝謝 – DaReDeViL

+0

@DaReDeViL - 當你使用大膽從結尾剪下1秒,你是否確信開始不變?大膽可能重新編碼文件,導致它與以前稍有不同。一種簡單的檢查方法是查看mp3二進制數據是否與刪除的部分相匹配(在解碼之前)。 – jtahlborn

相關問題