Как дождаться завершения мультимедиа, прежде чем продолжить с l oop в JavaFX? - PullRequest
0 голосов
/ 16 июня 2020

У меня есть Arraylist path, содержащий пути к различным файлам .mp3. Мое текущее решение воспроизводит клипы, как ожидалось, но воспроизводит их одновременно. Я использую sh, чтобы носитель завершил воспроизведение до достижения конца l oop и увеличения i. У меня был Google, и я задавал здесь похожие вопросы, но ни одно из решений не работает должным образом. См. Текущее решение ниже:

public static void play(ArrayList path) {
        for(int i = 0; i < path.size(); i++) {
            String file = Main.gameDir + "/assets/sound/" + path.get(i) + ".mp3";
            Media sound = new Media(new File(file).toURI().toString());
            MediaPlayer mediaPlayer = new MediaPlayer(sound);
            mediaPlayer.play();
        }
}

Я пытался получить статус, но всегда возвращает UNKNOWN.

Все и любая помощь приветствуется.

1 Ответ

0 голосов
/ 17 июня 2020

Как вы обнаружили, MediaPlayer#Play(Media) воспроизводит звуки одновременно. Что вы хотите добиться, так это воспроизвести другой звук, если текущий закончился. Вы можете сделать это, зарегистрировав обработчик событий через MediaPlayer#setOnEndOfMedia(Runnable). В прослушивателе событий вы можете получить следующий звук и воспроизвести его, например, следующим образом:

public static void play(List<String> paths) {
    LinkedList<Media> sounds = paths.stream().serial()
        .map(path -> Main.gameDir + "/assets/sound/" + path + ".mp3")
        .map(file -> new Media(new File(file).toURI().toString()))
        .collect(Collectors.toList(LinkedList::new));
    [ThisClass].play(sounds);
}

public static void play(LinkedList<Media> sounds) {
    if (sounds.isEmpty())
        return;
    MediaPlayer player = new MediaPlayer(sounds.poll());
    player.setOnEndOfMedia(() -> [ThisClass].play(sounds));
    player.play();
}

Вам нужно заменить [ThisClass] своим собственным именем класса. Я также взял на себя смелость добавить параметр generi c в список, который вы предоставляете, и сделал его менее конкретным c (нет необходимости в ArrayList, List достаточно) и заменил ваш явный l oop потоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...