gpt4 book ai didi

java - 声音不会播放两次

转载 作者:行者123 更新时间:2023-11-30 09:24:30 27 4
gpt4 key购买 nike

为了修复我的程序,我已经工作了好几天。歌曲播放成功一次,但无法重新播放。

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

这是一个演示错误代码的示例(不会再次播放歌曲):

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

最佳答案

这段代码有两个问题

当前歌曲永远不会重置,因此如果您尝试播放同一流两次,它只会中止。

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

将计算为 false。

关于java - 声音不会播放两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15669187/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com