JavaFX MediaPlayer: MP4 не будет работать на Windows 7

Я создал базовый JavaFX Media Player. На моей операционной системе Windows 10 все работает нормально и работает точно так, как должно.

private MediaPlayer initializeMediaPlayer(){
    Media media = new Media(getClass().getResource("1-1.mp4").toString());
    MediaPlayer mediaPlayer = new MediaPlayer(media);
    mediaPlayer.setAutoPlay(true);
    mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE);
    mediaPlayer.setRate(1.25);
    mediaPlayer.setMute(true);
    return mediaPlayer;
}

Тем не менее, когда я запускаю этот код в Windows 7, видео не зацикливается: оно воспроизводится в течение пяти секунд, а в конце видео оно просто зависает. Учитывая, что видео длится всего 5 секунд, петля абсолютно необходима для правильной работы этой программы.

Вот что я знаю об этой проблеме:

  • Проблема сохраняется ТОЛЬКО для файлов mp4 в Windows 7. Когда программа запускалась с примером .flv файла oracle (т.е. http://download.oracle.com/otndocs/products/javafx/oow2010-2.flv), она работала нормально. Преобразование моих файлов mp4 в flv не вариант.
  • Программа отлично работает на всех компьютерах с Windows 10, на которых я ее запускаю. Эта проблема возникает только в Windows 7, но я не проверял ее ни в каких других операционных системах. Мне нужно в конечном итоге запустить эту программу в лаборатории только с компьютерами Windows 7.
  • Все остальные параметры MediaPlayer (например, set autoplay, setMute и setRate) работают нормально как в Windows 10, так и в Windows 7. Это просто атрибут setCycleCount, который, похоже, не работает в Windows 7.
  • На всех тестовых компьютерах я убедился, что Java обновлена до самой последней версии. Я использую Java 8 обновление 144.

Ответ 1

Среда:

  • Win 10 Prof
  • Java 8U144 (но также тестировалась с 8U177)

Я использовал mp4 с этого сайта в качестве образца для моего теста: techslides.com

Мой код (примечание: я использую пользовательский фреймворк FX, поэтому я показываю вам только метод создания моего контроллера, который настраивает проигрыватель):

@Override
protected BorderPane createView() {
    final BorderPane view = new BorderPane();

    final Media media = new Media(getClass().getResource("small.mp4").toString());
    final MediaPlayer player = new MediaPlayer(media);
    player.setCycleCount(MediaPlayer.INDEFINITE);
    player.setRate(1.25);
    player.setMute(true);
    player.setOnEndOfMedia(() -> {
        player.play();
    });
    player.play();

    final MediaView mediaView = new MediaView(player);
    view.setCenter(mediaView);

    return view;
}

Я использую обратный вызов и запускаю воспроизведение вручную. Это работает как бесконечный цикл, хотя это и более "сложный" способ сделать это. Кроме того, это сработало и для меня и должно рассматриваться как более "правильный" способ:

@Override
protected BorderPane createView() {
    final BorderPane view = new BorderPane();

    final Media media = new Media(getClass().getResource("small.mp4").toString());
    final MediaPlayer player = new MediaPlayer(media);
    player.setAutoPlay(true);
    player.setCycleCount(MediaPlayer.INDEFINITE); // or Integer.MAX_VALUE
    player.setRate(1.25);
    player.setMute(true);

    final MediaView mediaView = new MediaView(player);
    view.setCenter(mediaView);

    return view;
}

Дополнительное примечание:

  • Я протестировал оба кода как с видео Oracle, которое вы связали, так и с small.mp4 приведенным на странице techslide.
  • Если это поможет вам, я могу опубликовать полный код без фреймворка, который вы можете разместить в своем видео, чтобы посмотреть, будет ли он работать.

Ответ 2

JavaFX MediaPlayer не так хорош, я бы порекомендовал использовать для звуков внешнюю библиотеку, например LWJGL. Это действительно хорошо работает на всех операционных системах.

Скачать здесь: https://www.lwjgl.org/