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

标签 java audio

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

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/

相关文章:

java - 将简单的 XML 行优雅地转换为 Map

java - 在 Java 8 中对两个 ArrayList 进行乘法和求和

ios - Audio Queue如何停止当前的播放任务并立即开始播放另一个AudioQueueBuffer?

vb.net - VB.Net同时播放mp3

ios - 返回第一个 ViewController 时如何阻止 AVFoundation 音频重新启动?

java - 基于 TestNG 的 Selenium 测试未并行运行

java - 使用基于数据库的 ID 生成器 "Sequence"或 "Table HiLow"

java - 我的碰撞是 buggy ,有时会剧烈振动或出界

Android:如何以最大音量播放音乐?

audio - 视频是25fps,音频是50fps?