簡體   English   中英

在jar中播放WAV文件-Java NetBeans

[英]play wav file in jar - java netbeans

我有一個用於在Java中播放wav聲音文件的代碼,並且在netbeans IDE中可以完美地工作,但是,當我將項目導出到jar文件並在另一台機器上運行它時,它將無法工作並顯示以下異常:

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中,我將music.wav文件放在src項目文件夾中,並在另一台試圖運行jar文件的機器上,我將music.wav放在jar內和旁邊。

我想知道例外是什么?

有幫助嗎?

我下載了您的音頻文件:它是16位立體聲PCM,但具有11kHz的異常采樣率。 我執行的大多數wav播放都是44kHz(注意,值在“ Windows屬性”顯示中取整)。 也許某些IDE支持這種格式,但其他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”文件夾上方的包中。

PS,我不清楚在URL分配中'getClassLoader()'為您做什么。 我不使用它,也不熟悉它。

暫無
暫無

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

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