我已经工作了几天试图修复我的程序。它成功播放了一首歌,但它不能重播这首歌。
奇怪的是,当我试图创建一个简短的,自包含的例子时,我发现相同的代码可以播放一首歌,停止,然后播放另一首歌,但不会连续两次播放同一首歌。鉴于我的应用程序,我不知道用户是否会再次选择相同的歌曲,因此必须关闭并重新打开流。
这是一个演示破解代码的示例(不会再播放歌曲):
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,并将其作为我的第二首歌播放,它可以正常工作。
答案 0 :(得分: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.
}
另一个问题是您没有重置输入流。 最简单的方法是重新加载它。 Streams不是你可以给某些东西的数组,它会在一开始就神奇地开始。任何访问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 so
AudioSystem.getAudioInputStream(new test().getClass().getResource("test.wav")).equals( AudioSystem.getAudioInputStream(new test().getClass().getResource("test.wav")))
将评估为假。