Java - MP3解码并将其存储为字节数组
问题描述:
我正面临有关音频解码的问题。我有用于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?
谢谢。
答
此行应该是:
out.write(data, 0, nBytesRead);
你好jtahlborn,感谢您的答复。 我试过你的建议,但没有运气。数据仍然有一点偏离最初的一次。让我解释我在做什么, – DaReDeViL
可以说我有一首2分钟的歌曲,我尝试用上面的代码对它进行解码,然后我在字节数组中获得以下某些特定位置:[2,44,-71, - 99,134]。 然后我用大胆从我的mp3的结尾剪下1(一)秒。然后我尝试解码它。我获得了与最后一次相同的位置数据:[9,35,-66,-33,124]。在阵列开始的时候,给定的位置很接近。数据不应该保持与最后一次相同吗? 谢谢 – DaReDeViL
@DaReDeViL - 当你使用大胆从结尾剪下1秒,你是否确信开始不变?大胆可能重新编码文件,导致它与以前稍有不同。一种简单的检查方法是查看mp3二进制数据是否与删除的部分相匹配(在解码之前)。 – jtahlborn