如何从MP3文件中获取音频数据?

20

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

如果我使用.wav文件,我知道头部有44个字节,然后是数据。当涉及到.mp3文件时,我已经了解到它们由若干帧组成,每一帧都包含一个头部和音频数据。是否可能从一个.mp3文件中获取所有音频数据?

我正在使用Java语言(我已添加MP3SPI,Jlayer和Tritonus库),我能够从文件中获取字节,但我不确定这些字节代表什么或如何处理它们。

3个回答

33

来自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 的“原始”数据。(有关更多信息,请参见 AudioFormat文档。)
(请注意,此示例代码不会关闭流或执行任何类似的操作 - 请像平常一样使用适当的 try/finally 块。)

你好。 我按照你的建议去做了,它起作用了。为了可视化数据,我使用了以下代码: while ((numBytesRead = din.read(audioBytes)) != -1) {} 这个代码读取'din'中的字节并将它们存储在数组audioBytes中。我试图通过以下方式来可视化数据: while ((numBytesRead = din.read(audioBytes)) != -1) { System.out.println("Bytes Decoded value " + audioBytes[0]);} 我有一个关于这些数据的问题: 每个样本使用16位,也就是数组audioBytes中的2个位置,对吗?我怎么才能得到每个样本的值呢?解码格式(wav)是否有44个头字节? 非常感谢你的帮助! - dedalo
3
我尝试使用这个样本,但出现了错误:javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1187)。 - Anuj Kulkarni
我遇到了与@BigShow相同的问题,并查看了文档此处,支持的格式列表不包括mpeg 3。为了解决这个问题,我将我的mpeg 3文件转换为wave格式,代码完美运行。 - Harry Saliba
1
我已经安装了所有的mp2spi、tritonus和jlayer,但是当我调用AudioSystem.getAudioInputStream("file.mp3")时,in.getFrameLength()总是返回-1。有什么帮助吗? - Programmer dude
2
@程序员小伙子:请提出一个新问题,并附上一个 [mcve],而不是在一个超过10年的旧问题下添加评论。 - Jon Skeet
显示剩余17条评论

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

0

如其他答案中所提到的,您需要一个解码器将MP3格式转换成正常的音频样本。

其中一种受欢迎的选择是 JavaLayer(LGPL许可证)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接