JavaFX MediaPlayer:MP4不会在Windows 7上循环播放

2022-09-02 22:40:13

我创建了一个基本的JavaFX媒体播放器。在我的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秒长,循环对于该程序的正常工作是绝对必要的。

以下是我对这个问题的了解:

  • 仅对于Windows 7上的mp4文件,问题仍然存在。当使用oracle的示例.flv文件(即 http://download.oracle.com/otndocs/products/javafx/oow2010-2.flv)运行程序时,它工作正常。将我的mp4文件转换为flv不是一个选项。
  • 该程序在我运行它的所有Windows 10计算机上都可以正常工作。此问题仅在Windows 7中出现,但我没有在任何其他操作系统上对其进行测试。我最终需要在仅使用Windows 7计算机的实验室中运行此程序。
  • 所有其他 MediaPlayer 参数(即设置自动播放、setMute 和 setRate)在 Windows 10 和 Windows 7 中都工作正常。它只是setCycleCount属性似乎不适用于Windows 7。
  • 在所有测试计算机上,我确保Java已更新到最新版本。我使用的是 Java 8 更新 144。

答案 1

环境:

  • 赢10教授
  • Java 8U144(但也使用 8U177 进行了测试)

我使用这个网站上的mp4作为测试的样本:techslides.com

我的代码(注意:我使用自定义FX Framwork,所以我只向您展示设置播放器的控制器创建方法):

@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视频和techslide页面中给出的代码测试了这两个代码small.mp4
  • 如果它对你有帮助,我可能会发布一个完整的无框架代码,你可以把它放在你的视频中,看看它是否应该工作。

答案 2

JavaFX MediaPlayer并不是那么好,我建议使用像LWJGL这样的库来获取声音。这应该在每个操作系统上都能很好地工作。


推荐