Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 声元';我不能玩两次_Java_Audio - Fatal编程技术网

Java 声元';我不能玩两次

Java 声元';我不能玩两次,java,audio,Java,Audio,我已经工作了几天,试图修复我的程序。它成功播放一首歌曲,但无法重新播放该歌曲 奇怪的是,在尝试创建一个简短的、自包含的示例时,我发现相同的代码可以播放一首歌,停止,然后播放另一首歌,但不会连续播放同一首歌两次。鉴于在我的应用程序中,我不知道用户是否会再次选择同一首歌曲,因此流必须关闭并重新打开 下面是一个示例,演示了已损坏的代码(不再播放歌曲): 如果我在中添加另一个AudioInputStream,并将其作为第二首歌曲播放,则效果良好。这段代码中有两个问题 当前歌曲从不重置,因此如果您尝试播放

我已经工作了几天,试图修复我的程序。它成功播放一首歌曲,但无法重新播放该歌曲

奇怪的是,在尝试创建一个简短的、自包含的示例时,我发现相同的代码可以播放一首歌,停止,然后播放另一首歌,但不会连续播放同一首歌两次。鉴于在我的应用程序中,我不知道用户是否会再次选择同一首歌曲,因此流必须关闭并重新打开

下面是一个示例,演示了已损坏的代码(不再播放歌曲):


如果我在中添加另一个AudioInputStream,并将其作为第二首歌曲播放,则效果良好。

这段代码中有两个问题

当前歌曲从不重置,因此如果您尝试播放同一流两次,它将中止播放

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

...
来清除它

public static void stopMusic(){
    musicplayer.close();            
    currentSong = null;  // we do not have a current song anymore.
}
另一个问题是您没有重置输入流。 最简单的方法就是重新加载它。流不是数组,你可以给一些东西,它将神奇地开始在开始。任何访问一个流的东西只能得到下一个,如果你给某个东西一个流,其中下一位是结束,那么什么也不会发生

    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")))

将计算为false。

不,仍然不起作用。currentSong字段设置为仅在选择其他歌曲或歌曲停止时播放。您可以通过打印每个变量来检查该方法,以查看线程到达的位置。真正的解决方案是在每次播放声音时重新加载声音来解决该问题…:(我接受您的回答,因为将currentSong设置为null可能对解决方案有所帮助。Bevynq回答不适用于您认为您所做的“解决方案”。您不更新
currentSong
music
。它们完全是同一个对象。@user2097804我已添加了一些详细信息。
 AudioSystem.getAudioInputStream(new test().getClass().getResource("test.wav")).equals( AudioSystem.getAudioInputStream(new test().getClass().getResource("test.wav")))