【问题标题】:How to get audio data from a MP3?如何从 MP3 中获取音频数据?
【发布时间】:2010-10-30 14:42:38
【问题描述】:

我正在开发一个必须处理音频文件的应用程序。使用 mp3 文件时,我不确定如何处理数据(我感兴趣的数据是音频字节,代表我们听到的内容)。

如果我使用的是 wav 文件,我知道我有一个 44 字节的标头,然后是数据。说到 mp3,我读到它们是由帧组成的,每个帧都包含一个标题和音频数据。是否可以从 mp3 文件中获取所有音频数据?

我正在使用 java(我添加了 MP3SPI、Jlayer 和 Tritonus)并且我能够从文件中获取字节,但我不确定这些字节代表什么或如何处理。

【问题讨论】:

    标签: java audio mp3 extraction


    【解决方案1】:

    来自documentation for MP3SPI

    File file = new File(filename);
    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);
    

    然后,您只需从 din 读取数据 - 这将是 decodedFormat 的“原始”数据。 (有关详细信息,请参阅docs for AudioFormat。)

    (请注意,此示例代码不会关闭流或类似的东西 - 正常使用适当的 try/finally 块。)

    【讨论】:

    • 您好乔恩,感谢您的快速回答!在您的提案中; 'decodedFormat' 是以其他格式解码的 mp3 数据的表示吗?如果我写“din.read()”,我是否得到解码格式的数据字节?谢谢
    • 是的。那个 decodedFormat 说“我希望你解码为签名的 PCM 数据”。
    • 我尝试了这个示例并得到了这个错误:javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1187 )
    • 我已经安装了所有的 mp2spi、tritonus、jlayer 但是当我在 = AudioSystem.getAudioInputStream("file.mp3"); 中调用 AudioInputStream 时in.getFrameLength() 总是返回 -1。有什么帮助吗?
    • @Programmerdude:请使用minimal reproducible example 提出一个新问题,而不是在超过 10 年的问题中添加 cmets。
    【解决方案2】:

    您想要的数据是实际样本,而 MP3 以不同的方式表示数据。因此,就像其他人所说的那样 - 您需要一个库来将 MP3 数据解码为实际样本以满足您的目的。

    【讨论】:

      【解决方案3】:

      正如其他答案中提到的,您需要一个解码器将 MP3 解码为常规音频样本。

      一个流行的选项是JavaLayer (LGPL)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-13
        • 2017-10-04
        • 1970-01-01
        • 2011-05-26
        • 2016-12-12
        • 1970-01-01
        相关资源
        最近更新 更多