簡體   English   中英

無法在jar文件中播放嵌入的聲音

[英]Cannot play embedded sound in a jar file

我正在創建一個名為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項目。 src下有一個sound文件夾,其中包含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)

您的問題不在於播放聲音。 您的問題在於對嵌入式資源的訪問。 當您使用BatteryBeeper.class.getResourceAsStream("sound/buzzer3_x.wav")您嘗試檢索與BatteryBeeper類位於同一包中的資源。 這意味着您的文件位於/demo/sound/buzzer3_x.wav 看來這是錯誤的。 如果您的文件確實在sound/buzzer3_x.wav使用getResourceAsStream("/sound/buzzer3_x.wav") (請注意路徑中的前斜杠)。

如果您仍然收到消息“無法從InputStream獲取AudioInputStream”,則問題很可能是InputStream階段未引發提示性錯誤。

如果查看AudioSystem.getAudioInputStream(InputStream)的規格,您會發現輸入流可能由於不支持Mark / Reset操作而失敗,但由於某種原因,它選擇拋出其他錯誤消息!

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

更好的是,使用AudioSystem.getAudioInputStream(URL)的形式,並且音頻文件的可標記性不是問題,因為從不創建中間InputStream。

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

URL表單的另一個好處是可以很好地處理嵌入Jar中的文件。 當然,您仍然必須提供正確的地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM