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