0

我正在创建一个名为 BatteryBeeper 的个人使用软件。当充电是我设置的提醒时,它会提醒我给笔记本电脑充电。

当电荷达到设定的阈值时,它应该会播放声音。

我看了答案:声音没有在 jar 中播放,我AudioInputStream的构造类似于 Jigar Joshi 提到的。

但是我得到一个空异常:

java.lang.NullPointerException
    at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(Unknown Source)
    at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
    at demo.BatteryBeeper.setupSoundPlayback(BatteryBeeper.java:169)
    at demo.BatteryBeeper.<init>(BatteryBeeper.java:41)
    at demo.BatteryBeeper.main(BatteryBeeper.java:35)  

这是我加载声音的代码:

public void setupSoundPlayback(){
        try{
            buzzer = AudioSystem.getClip();
            in = AudioSystem.getAudioInputStream(BatteryBeeper.class.
                    getResourceAsStream("sound/buzzer3_x.wav"));
            buzzer.open(in);
        }catch(Exception e){
            e.printStackTrace();
        }

    }  

这是播放它的代码:

public void playSound(){
        buzzer.start();
    }  

是什么导致了问题?

杂项

这是一个常见的 Eclipse 项目。有一个sound文件夹下src有wave文件

编辑

在AlexR的回答之后,我改变了路径并得到了一个新的异常:

javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream
    at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
    at demo.BatteryBeeper.setupSoundPlayback(BatteryBeeper.java:169)
    at demo.BatteryBeeper.<init>(BatteryBeeper.java:41)
    at demo.BatteryBeeper.main(BatteryBeeper.java:35)
4

2 回答 2

5

你的问题不在于播放声音。您的问题在于访问嵌入式资源。当您使用时,BatteryBeeper.class.getResourceAsStream("sound/buzzer3_x.wav")您尝试检索位于类所在的同一包中的资源BatteryBeeper。这意味着您的文件位于/demo/sound/buzzer3_x.wav. 看来这是错误的。如果您的文件确实在sound/buzzer3_x.wav使用中getResourceAsStream("/sound/buzzer3_x.wav")(注意路径中的前导斜杠)。

于 2013-01-17T09:05:06.557 回答
0

如果您仍然收到消息“无法从 InputStream 获取 AudioInputStream”,则问题很可能是 InputStream 阶段没有引发信息错误。

如果您查看 AudioSystem.getAudioInputStream(InputStream) 的规范,您会看到输入流可能由于不支持标记/重置操作而失败,但由于某种原因,它选择抛出其他错误消息!

http://docs.oracle.com/javase/7/docs/api/javax/sound/sampled/AudioSystem.html#getAudioInputStream%28java.io.InputStream%29

更好的是,使用 AudioSystem.getAudioInputStream(URL) 格式,音频文件的可标记性不是问题,因为中间 InputStream 永远不会创建 afaik。

http://docs.oracle.com/javase/7/docs/api/javax/sound/sampled/AudioSystem.html#getAudioInputStream%28java.net.URL%29

URL 表单的另一个好处是可以很好地处理嵌入在 Jar 中的文件。当然,您仍然必须提供正确的地址。

于 2013-01-18T20:07:42.647 回答