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 并将其作为我的第二首歌曲播放,它工作正常。

4

1 回答 1

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 没有实现 equals 所以

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

将评估为假。

于 2013-03-27T20:57:10.550 回答