gpt4 book ai didi

Java AudioSystem 防止歌曲结束前循环重复

转载 作者:行者123 更新时间:2023-12-02 08:49:43 26 4
gpt4 key购买 nike

我有一个程序会询问用户他们想要从可用歌曲列表中播放哪些歌曲,并且在用户选择一首歌曲后,一旦歌曲完成,它就会询问用户他们想要再次播放哪首歌曲。我的问题是如何防止循环询问用户他们想要播放哪首歌曲,直到所选歌曲播放完毕,这样他们就不会重复?

public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String[] pathnames;
File MusicFileChosen;
String musicDir;
boolean songComplete = false;

pathnames = ProgramMap.musicDir.list();

// Print the names of files and directories
for (int ListNum = 0; ListNum < pathnames.length; ListNum++) {
System.out.println(ListNum + 1 + ". " + pathnames[ListNum]);
}


for (int playlistLength = 0; playlistLength < pathnames.length; playlistLength++){
if (!songComplete) {
System.out.println("Which Song would you like to play?");
int musicChoice = input.nextInt();
musicDir = ProgramMap.userDir + "\\src\\Music\\" + pathnames[musicChoice - 1];
MusicFileChosen = new File(musicDir);
PlaySound(MusicFileChosen, pathnames[musicChoice - 1]);

}
}
}
public static void PlaySound(File sound, String FileName){
try{
// Inits the Audio System
Clip clip = AudioSystem.getClip();

AudioInputStream AudioInput = AudioSystem.getAudioInputStream(sound);

//Finds and accesses the clip
clip.open(AudioInput);

//Starts the clip
clip.start();

System.out.println("Now Playing " + FileName);

clip.drain();


}catch (Exception e){
System.out.println("Error playing music");
}
}
}

最佳答案

您可以使用 LineListener 。然后,注册并收听 LineEvent.Type.CLOSE .

顺便说一下,使用 SourceDataLine 可能比使用 Clip 更好。也许没什么大不了的,但考虑到您所编码的内容,每次您打开剪辑并将完整文件加载到内存中时,可能会出现明显的延迟,具体取决于文件的大小(这必须在播放之前完成)开始)。 SourceDataLine 将几乎立即开始播放(在开始播放之前仅加载一个缓冲区),并且仅消耗一个内存缓冲区而不是整个声音文件。

很多刚接触 javax.sound.sampled 的人都对使用 SourceDataLine 持谨慎态度,但实际上它的编码并不比 困难多少。 code>Clip,对于您所展示的用途,它会更合适。

关于Java AudioSystem 防止歌曲结束前循环重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60861183/

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