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?
謝謝。
你好jtahlborn,感謝您的答覆。 我試過你的建議,但沒有運氣。數據仍然有一點偏離最初的一次。讓我解釋我在做什麼, – DaReDeViL
可以說我有一首2分鐘的歌曲,我嘗試用上面的代碼對它進行解碼,然後我在字節數組中獲得以下某些特定位置:[2,44,-71, - 99,134]。 然後我用大膽從我的mp3的結尾剪下1(一)秒。然後我嘗試解碼它。我獲得了與最後一次相同的位置數據:[9,35,-66,-33,124]。在陣列開始的時候,給定的位置很接近。數據不應該保持與最後一次相同嗎? 謝謝 – DaReDeViL
@DaReDeViL - 當你使用大膽從結尾剪下1秒,你是否確信開始不變?大膽可能重新編碼文件,導致它與以前稍有不同。一種簡單的檢查方法是查看mp3二進制數據是否與刪除的部分相匹配(在解碼之前)。 – jtahlborn