我尝试用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()返回一个字节数组。有什么想法吗?
答案 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非常清楚地支持我所说的内容。
请注意,如果比较各种形式的“getAudioInputStream”,您将看到与URL和File参数版本相比,InputStream参数版本中有关该文件的额外要求。
我最喜欢使用URL,因为URL可以很好地定位jar中的文件,并且可以根据代码或类的根目录指定资源。