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); 
+0

你好jtahlborn,感谢您的答复。 我试过你的建议,但没有运气。数据仍然有一点偏离最初的一次。让我解释我在做什么, – DaReDeViL

+0

可以说我有一首2分钟的歌曲,我尝试用上面的代码对它进行解码,然后我在字节数组中获得以下某些特定位置:[2,44,-71, - 99,134]。 然后我用大胆从我的mp3的结尾剪下1(一)秒。然后我尝试解码它。我获得了与最后一次相同的位置数据:[9,35,-66,-33,124]。在阵列开始的时候,给定的位置很接近。数据不应该保持与最后一次相同吗? 谢谢 – DaReDeViL

+0

@DaReDeViL - 当你使用大胆从结尾剪下1秒,你是否确信开始不变?大胆可能重新编码文件,导致它与以前稍有不同。一种简单的检查方法是查看mp3二进制数据是否与删除的部分相匹配(在解码之前)。 – jtahlborn