2013-03-27 96 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