2012-08-24 49 views
-1

我一直在嘗試在Applet上處理一點聲音,而不是嘗試所有不同的方法,最好的方法是什麼在Java中播放聲音?有幾個要求:如何在Java中播放WAV時,WAV包含在JAR中

  • 需要能夠循環
  • 需要能夠從歸檔JAR加載WAV(我想用的getClass()的getResource。)
  • 需要是能夠同時播放多個聲音,而不是剪輯已經播放的聲音

非常感謝你看我的問題,我希望你們有一個答案!

多虧了精彩的幫助,我幾乎已經將其與這方面的工作:

public class MyGame() { 
    Clip bullet; 


    public void init(){ 
     try { 

     bullet = AudioSystem.getClip(); 
     URL url2 = this.getClass().getResource("bulletSound.wav"); 
     AudioInputStream ais2 = AudioSystem.getAudioInputStream(url2); 

     bullet.open(ais2); 
     } catch (LineUnavailableException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } catch (UnsupportedAudioFileException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 
    } 
    randomMethodToPlayBullet(){ 
     bullet.setFramePosition(0); 
     bullet.start(); 
    } 
} 

的問題是,子彈聲音播放,但如果randomMethodToPlayBullet被稱爲連續說了兩次,第一顆子彈聲音之前完成了,seonc一個不玩。

+0

我想幫忙,但是有沒有你不瞭解的'SSCCE'的一部分? SSCCE不需要3個剪輯實例來顯示無法循環1個實例。還有其他要素。請閱讀我在之前的帖子中鏈接的文章。 –

+0

那好些? :) –

+0

SSCCE應包括進口。它應該是一個applet(或者servlet)或者包含一個'main()'..請仔細閱讀這篇文章。 –

回答

2

從jar文件加載資源的最佳方法是把在同一個文件夾中的一類,並與.class.getResource(...).class.getResourceaAsStream(...)方法獲取資源:

URL url = ClazzInTheFolderOfMyMidiFile.class.getResource(nameOfMidiFile); 

InputStream resourceAsStream = ClazzInTheFolderOfMyMidiFile.class.getResourceAsStream(nameOfMidiFile); 
+0

等一下,我想用哪種方法?這兩條線有什麼區別? –

+0

我有正確的例子,這是兩個獨立的變種。您可以使用url或直接使用流,依賴於用於處理資源的API。 – Mark

+0

我幾乎已經完成了它的工作!除了我這樣做發揮子彈聲音(後編輯),但它只播放一次。 –

1

的答案:

+0

這看起來非常適合播放它們,但是你會介意真正的快速解釋我將如何從JAR而不是通過URL加載它們嗎? –

+0

好,所以我用我現在有的東西更新了我的帖子,現在我只是有最後一個問題,在帖子中提到。 –

1

你不能同時播放相同的剪輯兩次。您必須創建另一個Clip實例才能同時播放兩次聲音。

請注意,您可以播放多少個剪輯的限制,所以剪輯API可能不適合支持沉重的遊戲。

+0

非常感謝你,我應該用什麼來代替它? –

+0

看看java.sound.sampled包(這是什麼Clip在底層使用)。被警告它需要更多的樣板代碼來獲取東西並且可能不會立即直觀地使用(具有更大靈活性的優勢,例如平衡和音量控制),它還允許您以編程方式產生聲音(例如,將多個聲音混合到同一頻道中)只要您快樂使用Clip更簡單,取決於您需要多少控制聲音...... – Durandal