2013-03-27 91 views
2

我一直在努力嘗試修復我的程序。它一次成功播放一首歌曲,但不能重新播放歌曲。奇怪的是,當試圖創建一個簡短的自包含示例時,我發現相同的代碼可以播放歌曲,停止播放不同的歌曲,但不會連續播放同一首歌曲兩次。鑑於在我的應用程序,我不知道用戶是否會再次選擇同一首歌曲,因此流必須被關閉並重新打開。聲音不會播放兩次

下面是一個例子演示斷碼(不會再播放歌曲):

import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.Clip; 
import javax.sound.sampled.LineUnavailableException; 
import java.io.IOException; 

public class test{ 
    static Clip musicplayer; 
    static AudioInputStream currentSong; 

    public static void main(String[] args){ 
     try{ 
      musicplayer = AudioSystem.getClip(); 
      AudioInputStream ais = AudioSystem.getAudioInputStream(new test().getClass().getResource("test.wav")); 
      playMusic(ais); 
      System.out.println("Playing Music"); 
      Thread.sleep(4000); 
      stopMusic(); 
      System.out.println("Stopping Music"); 
      Thread.sleep(3000); 
      playMusic(ais); 
      System.out.println("Playing Music for the Second time"); 
      Thread.sleep(5000); 
      System.out.println("Finished Program"); 
     }catch(Exception ex){ex.printStackTrace();} 
    } 

    public static void playMusic(AudioInputStream music){ 
     if(music == null) 
      return; 

     if(currentSong != null){ 
      if(currentSong.equals(music)) 
       return; 
     } 

     currentSong = music; 

     try { 
       musicplayer.setFramePosition(0); 
       musicplayer.stop(); 
       musicplayer.open(currentSong);  
     } catch (LineUnavailableException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     musicplayer.loop(Clip.LOOP_CONTINUOUSLY); 
    } 

    public static void stopMusic(){ 
     musicplayer.close();    
    } 
} 

如果我加入另一個的AudioInputStream,併發揮作爲我的第二首歌,它工作正常。

回答

2

你在這段代碼的兩個問題

當前歌曲是從來沒有復位,因此,如果您嘗試播放同一個流兩次它只是中止。

... 
    if(currentSong != null){ 
     if(currentSong.equals(music)) 
      return; 
    } 

... 

要清除它。

public static void stopMusic(){ 
    musicplayer.close();    
    currentSong = null; // we do not have a current song anymore. 
} 

另一個問題是您沒有重設輸入流。 最簡單的方法是重新加載它。流不是你可以給的東西,它會在開始的時候神奇地開始。任何訪問Stream的東西只能得到下一個東西,如果你給了一個Stream,那麼下一個東西就是結尾,那麼什麼都不會發生。

AudioInputStream ais = AudioSystem.getAudioInputStream(new test().getClass().getResource("test.wav")); 
    playMusic(ais); 

    ais = AudioSystem.getAudioInputStream(new test().getClass().getResource("test.wav")); 
    playMusic(ais); 

一兩件事要注意的是,的AudioInputStream不執行等於什麼

AudioSystem.getAudioInputStream(new test().getClass().getResource("test.wav")).equals(AudioSystem.getAudioInputStream(new test().getClass().getResource("test.wav"))) 

將評估爲false。

+0

不,不起作用。當前歌曲字段只有在選擇了不同的歌曲或歌曲停止時纔會播放。您可以通過打印每個變量來檢查該方法以查看線程到達的位置。 – user2097804 2013-03-27 21:03:30

+0

真正的解決方案是通過每次播放時重新加載聲音來解決它... :(我會接受你的答案,因爲將currentSong設置爲null可能對解決方案有所幫助 – user2097804 2013-03-27 21:21:53

+0

BevynQ答案是正確的你認爲你做了一個「解決方法」,你不更新'currentSong'或者'music',它們是完全一樣的對象 – 2013-03-27 21:37:30