2013-04-14 116 views
0

我有一個用於播放wav聲音文件的代碼,在NetBeans IDE中完美工作,但當我將項目導出到jar文件並在另一臺機器上運行時,它贏得'將不起作用,並顯示以下異常:在jar中播放wav文件-java,netbeans,

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Invalid format 
at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.createStream(PulseAudioDataLine.java:142) 
at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:99) 
at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:283) 
at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:402) 
at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:453) 
at quiz.Login.jButton3ActionPerformed(Login.java:178) 
at quiz.Login.access$200(Login.java:36) 
at quiz.Login$3.actionPerformed(Login.java:96) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6505) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3312) 
at java.awt.Component.processEvent(Component.java:6270) 
at java.awt.Container.processEvent(Container.java:2229) 
at java.awt.Component.dispatchEventImpl(Component.java:4861) 
at java.awt.Container.dispatchEventImpl(Container.java:2287) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
at java.awt.Container.dispatchEventImpl(Container.java:2273) 
at java.awt.Window.dispatchEventImpl(Window.java:2719) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729) 
at java.awt.EventQueue.access$200(EventQueue.java:103) 
at java.awt.EventQueue$3.run(EventQueue.java:688) 
at java.awt.EventQueue$3.run(EventQueue.java:686) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
at java.awt.EventQueue$4.run(EventQueue.java:702) 
at java.awt.EventQueue$4.run(EventQueue.java:700) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:699) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 

我的代碼是:

try { 
// Open an audio input stream. 
URL url = this.getClass().getClassLoader().getResource("music.wav"); 
AudioInputStream audioIn = AudioSystem.getAudioInputStream(url); 
// Get a sound clip resource. 
Clip clip = AudioSystem.getClip(); 
// Open audio clip and load samples from the audio input stream. 
clip.open(audioIn); 
clip.start(); 
} catch (UnsupportedAudioFileException e) { 
e.printStackTrace(); 
} catch (IOException e) { 
e.printStackTrace(); 
} catch (LineUnavailableException e) { 
e.printStackTrace(); 
} 

在NetBeans我把SRC項目文件夾,並在另一個地方的機器我嘗試運行jar文件的music.wav文件我把music.wav放在罐子裏面,旁邊。

我想知道什麼是異常呢?

任何幫助?

+1

更大的日誌將有所幫助。 –

+0

我編輯了問題 –

+0

看起來像您正在開發的JVM和另一臺機器不一樣,因此是問題所在。 –

回答

1

我下載了您的音頻文件:它是16位立體聲PCM,但具有11kHz的不尋常採樣率。我所做的大多數wav播放是44kHz(注意,值在Windows屬性顯示中四捨五入)。也許這種格式在一些IDE中被支持,但不是其他的?或者一些JVM而不是其他的?您可以嘗試使用Audacity(免費軟件DAW)將其轉換爲44kHz,然後查看它是否運行。或者,找到另一個44kHz的wav並使用相同的代碼進行測試。

由於您使用的是URL,因此它們應該適用於存儲在jar中的資源。我傾向於使用以下來獲取音頻:

1)創建一個「音頻」子文件夾。因此,如果您的代碼位於com.zaid.game包中,則wav文件位於..../com/zaid/game/audio

2)當調用文件名時,將子文件夾添加到字符串:

fileName = "audio/" + fileName; 

3)使用以下方法來設置URL變量:

URL url = this.getClass().getResource(fileName); 

然後

AudioInputStream aiStream = AudioSystem.getAudioInputStream(url); 

爲你做。

這假定「this.getClass()」位於'audio'文件夾上的包中。

P.S.,我不清楚'getClassLoader()'在URL分配中爲你做了什麼。我不使用它,並且不熟悉它。

+0

11025 Hz(44100的1/4)對於只有樣本的相當常見需要'AM收音機'的質量。我從來沒有見過11000赫茲的樣本。 –

+0

Windows屬性四捨五入,我保留了他們的數字。 –

+0

呵呵。如果我只注意到你提到它的時間* * *。我的錯。 :P –