2

尝试使用 Java 播放声音时遇到问题;如果我使用

AudioInputStream soundIn = AudioSystem.getAudioInputStream(new File("./sound.wav"));

要获取 AudioInputStream,它可以正常工作并且文件可以正确播放。但是,如果我使用

AudioInputStream soundIn = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream("./sound.wav")));

我明白了

javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream

我想要做的是播放我从麦克风录制的音频,并将它保存为内存中字节数组中的 WAV 文件,但我无法播放它。但是,如果我将它保存到文件并直接使用 File 对象,它就会播放。但是,如果我使用任何类型的 InputStream,它会因该异常而失败,包括当我使用此代码时:

AudioInputStream soundIn = AudioSystem.getAudioInputStream(new BufferedInputStream(new ByteArrayInputStream(recorder.getLastRecording())));

其中 recorder.getLastRecording() 返回一个字节数组。有任何想法吗?

4

2 回答 2

1
// lose the BufferedInputStream
AudioInputStream soundIn = AudioSystem.getAudioInputStream(
    new ByteArrayInputStream(recorder.getLastRecording()));
于 2012-07-16T03:14:14.643 回答
1

这个错误实际上以各种形式出现了无数次。

我认为正在发生的事情是,每当您尝试使用 InputStream 或使用需要 InputStream 作为中间步骤之一的代码时,Java 都会测试文件是否作为 InputStream 有效:它是否支持“标记”就是这样的测试,以及文件是否“可重置”。

请注意,您的错误消息表明它无法从 InputStream 获取有效文件。这可能是因为 Java 无法对文件执行一个或其他命令,因此不会认为它是有效的 InputStream。

如果您从文件位置或更好的 URL(恕我直言)打开文件,则 AudioSystem.getAudioInputStream 不会通过测试文件是否可以用作有效 InputStream 的中间步骤。

实际上,下面的 javadef 非常清楚地支持我所说的。

http://docs.oracle.com/javase/6/docs/api/javax/sound/sampled/AudioSystem.html#getAudioInputStream(java.io.InputStream )

请注意,如果您比较“getAudioInputStream”的各种形式,您会发现与 URL 和 File 参数版本相比,InputStream 参数版本中的文件有哪些额外要求。

我最喜欢使用 URL,因为 URL 可以很好地定位 jar 中的文件,并且可以根据代码或类的根目录指定资源。

于 2012-07-16T18:52:29.847 回答