2016-07-27 149 views
1

我一直在學習如何播放聲音,而且我有一個很好的方法,但有一個問題。我嘗試播放聲音,但在方法運行後不會立即播放。使用剪輯即時播放聲音

這裏是我的代碼:

new Thread(new Runnable(){ 
     public void run(){ 
      File audioFile = new File(soundMap.get(key)); 
      try { 
       AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile); 
       AudioFormat format = audioStream.getFormat(); 
       DataLine.Info info = new DataLine.Info(Clip.class, format); 
       Clip audioClip = (Clip) AudioSystem.getLine(info); 
       AudioListener listener = new AudioListener(); 
       audioClip.addLineListener(listener); 
       audioClip.open(audioStream); 
       audioClip.start(); 
       listener.waitUntilDone(); 
       audioClip.close(); 

      } catch (UnsupportedAudioFileException ex) { 
       System.out.println("The specified audio file is not supported."); 
       ex.printStackTrace(); 
      } catch (LineUnavailableException ex) { 
       System.out.println("Audio line for playing back is unavailable."); 
       ex.printStackTrace(); 
      } catch (IOException ex) { 
       System.out.println("Error playing the audio file."); 
       ex.printStackTrace(); 
      } 
     } 
    }).start(); 

所有AudioListener類是,是什麼,讓線程等待,直到聲音完成。

另一方面,我會用這個遊戲,所以多次播放特定的聲音肯定會發生,所以如果有辦法解決這個問題,那也會有很大的幫助。

+0

它需要1-3秒鐘的加載文件等等 - 這樣你就可以下載所有這些 - 如果這是你的要求 – gpasch

+0

但是如果我播放聲音多次,它可以追溯到代替開始 – SevenDeLeven

+0

*「它回到起點,而不是」*爲什麼這是一個問題?還要注意''Clip'方法,例如['Clip.setMicrosecondPosition(long)'](http://docs.oracle.com/javase/8/docs/api/javax/sound/sampled/Clip.html#setMicrosecondPosition-long - ).. –

回答

0

評論幾乎涵蓋了一些東西,但我會總結幾點。

1)使用剪輯,您可以預先加載並保存內存中的對象。不要將open()和start()方法串聯起來。直到整個文件加載到內存中,start()方法纔會運行。

2)在運行start()方法之前,您可以使用setMicrosecondPosition(0)或setFramePosition(0)從頭開始重放Clip。

3)只要遊戲運行,Clip將在後臺運行在自己的線程中。沒有必要「等到完成」。音頻在守護線程上運行,與其他活動同時運行。與普通線程不同,如果沒有別的運行,守護進程線程將允許自己關閉。但是當程序運行時,雖然屏幕上有圖形,動畫等,聲音應該運行良好。

我建議製作一個「SoundHandler」類,併爲不同遊戲聲音製作實例變量(剪輯),然後在構造函數中打開它們。您還可以製作播放不同聲音的方法。這應該足夠用於簡單遊戲的第一關。沿着線的東西什麼如下(略異常處理):

class SoundHandler 

    Clip gunshot; 
    Clip explosion; 

    public SoundHandler() 
    { 
     gunshot = loadGunshot(); 
     explosion = loadExplosion(); 
    } 

    private Clip loadGunshot() 
    { 
     // code to make and open a Clip 
    } 

    public void playGunshot() 
    { 
     gunshot.setMicrosecondPosition(0); 
     gunshot.start(); 
    } 

    // et cetera 
} 

在遊戲主線程,實例SoundHandler在遊戲循環副本,並引用當你需要發出聲音。

soundHandler.playGunshot();