Java - MP3 解码并将其存储到字节数组中

Posted

技术标签:

【中文标题】Java - MP3 解码并将其存储到字节数组中【英文标题】:Java - MP3 Decoding and storing it to an Array of Bytes 【发布时间】:2011-11-29 18:45:31 【问题描述】:

我遇到了有关音频解码的问题。我有用于 mp3 解码的 SPIMP3 库,我正在尝试解码 mp3 并将它们存储到一个字节数组中。

事情是这样的,当我尝试解码一首 2 分钟的 mp3 歌曲时,它会给我例如以下字节:

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

但是当我将 mp3 切成两半并尝试解码前半部分时,我得到以下字节:

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

奇怪的是它们不匹配。这里唯一不同的是音频长度,但我正在解码两个相同的 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 匹配部分相同的字节?

谢谢。

【问题讨论】:

【参考方案1】:

这一行应该是:

out.write(data, 0, nBytesRead);

【讨论】:

您好 jtahlborn,感谢您的回复。我试过你的建议,但没有运气。数据与最初的一次仍有少许偏差。让我解释一下我在做什么, 假设我有一首 2 分钟的歌曲,我尝试使用上面的代码对其进行解码,我得到以下字节数组上的一些特定位置:[2, 44, -71, -99 , 134]。然后我大胆地从我的 mp3 结尾处剪掉 1(一)秒。然后我尝试解码它。我在与上一次相同的位置上得到以下数据:[9, 35, -66, -33, 124]。并且给予位置在我的数组的开头很接近。数据不应该和上次一样吗?谢谢 @DaReDeViL - 当你用大胆的方式从结尾缩短 1 秒时,你确定开头没有改变吗? audacity 可能会重新编码文件,导致它与以前略有不同。一种简单的检查方法是查看 mp3 二进制数据是否匹配直到被删除的部分(在您解码之前)。 天啊,你完全正确! Audacity 将我的 MP3 剪掉后重新编码为 MP3。我认为生成的 mp3 将是删除该部分的新 mp3! :) jtahlborn,非常感谢你,感谢你给我的每一个帮助,你帮了我很多!我会留下我的问题只是为了让你知道你的 cmets 很有帮助,我会在之后删除它。再次,非常感谢我的朋友。小心。 DaReDeViL。

以上是关于Java - MP3 解码并将其存储到字节数组中的主要内容,如果未能解决你的问题,请参考以下文章

C# 记录麦克风输入并将其存储在字节数组中,而不是本地存储

Java学习IO流

Java中字节流如何转字符流,OutputStreamWriter用法

java中,ImputStream类中的read(byte []b)方法

如何将Mac地址转换为十六进制并将其传递给java中的字节数组

检索几个 .mp3 的信息并将它们存储到一个 xml 文档中