使用FileInputStream时出现Java UnsupportedAudioFileException

时间:2012-07-16 01:56:17

标签: java audio byte wav javasound

我尝试用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()返回一个字节数组。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

这个错误实际上已经多次以各种形式出现。

我的想法是,无论何时尝试使用InputStream,或使用需要InputStream作为中间步骤之一的代码,Java都会测试该文件是否作为InputStream有效:它是否支持“标记”是一个这样的测试,也是文件是否“可重置”。

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

如果您从文件位置或更好的URL(imho)打开文件,那么如果文件可以作为有效的InputStream运行,则AudioSystem.getAudioInputStream不会经过测试的中间步骤。

实际上,以下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中的文件,并且可以根据代码或类的根目录指定资源。