【问题标题】:AudioSystem.getInputStream(InputStream) ExceptionAudioSystem.getInputStream(InputStream) 异常
【发布时间】:2026-01-06 02:15:01
【问题描述】:

我正在尝试使用 Java Sound API 将包含 MP3 文件中数据的 InputStream 转换为 AudioInputStream

但是,当我尝试这样做时,我不断遇到Exception

这是导致问题的方法:

public static int[][] getAmpFromInputStream(InputStream is) throws Exception{
    BufferedInputStream bs = new BufferedInputStream(is);
    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(bs);
    byte[] bytes = new byte[(int) (audioInputStream.getFrameLength()) * (audioInputStream.getFormat().getFrameSize())];
    audioInputStream.read(bytes);

    // Get amplitude values for each audio channel in an array.
    return getUnscaledAmplitude(bytes, 1);
}

被抛出的Exception是:

javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream
    at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
    at PitchChanger.getAmpFromInputStream(PitchChanger.java:27)
    at GUI$PlayMP3Thread.silly(GUI.java:128)
    at GUI$PlayMP3Thread.run(GUI.java:115)
    at java.lang.Thread.run(Unknown Source)

这让我很困惑,因为我使用相同的InputStream 来播放Javazoom.jl.player.Player,它在那里工作正常。

那么为什么不能将InputStream 转换为AudioInputStream

Java Sound 不支持 MP3 文件格式吗?

【问题讨论】:

  • 在这种情况下我无法访问该文件,只能访问 InputStream。
  • Java Sound 不支持开箱即用播放 MP3。你需要一个插件。见this post。接受的答案有一个下载 mp3 插件的链接。获取 jar 并将其添加到您的类路径中

标签: java exception audio mp3 inputstream


【解决方案1】:

当 AudioSystem 必须提供 RAW 数据(WAV 格式的原始样本)时,Javazoom 支持 MP3(具有解码器)。

【讨论】:

  • 那么如何从 InputStream 中提取 RAW 数据呢?
  • 取决于它是什么。是MP3还是什么?通常,您必须对其进行解码。原始数据解码和未压缩的音频样本
  • 这是一个包含 MP3 数据的 InputStream。
  • 不如给自己弄个 mp3 解码库,解码流并播放它。我认为这里没有什么可以添加的,或者只是简单地使用 jLayer。这里有使用 jLayer *.com/questions/12099114/… 解码 MP3 帧的示例代码