[英]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操作而失敗,但由於某種原因,它選擇拋出其他錯誤消息!
更好的是,使用AudioSystem.getAudioInputStream(URL)的形式,並且音頻文件的可標記性不是問題,因為從不創建中間InputStream。
URL表單的另一個好處是可以很好地處理嵌入Jar中的文件。 當然,您仍然必須提供正確的地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.