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

JJa*_*ipt 18 java windows video javafx media-player

我已经创建了一个基本的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;
}
Run Code Online (Sandbox Code Playgroud)

然而,当我在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参数(即set autoplay,setMute和setRate)在Windows 10和Windows 7中均可正常工作.它只是在Windows 7上似乎不起作用的setCycleCount属性.
  • 在所有测试计算机上,我确保Java已更新到最新版本.我正在使用Java 8更新144.

Isf*_*irs 1

环境:

  • 赢得 10 教授
  • 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;
}
Run Code Online (Sandbox Code Playgroud)

我使用回调并手动启动重播。这作为一个无限循环工作,尽管这是更“复杂”的方法。另外,这对我也有用,应该被认为是更“正确”的方式:

@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;
}
Run Code Online (Sandbox Code Playgroud)

附加说明:

  • 我使用您链接的 Oracle 视频和small.mp4技术幻灯片页面中给出的代码测试了这两个代码
  • 如果它对您有帮助,我可能会发布完整的无框架代码,您可以将其放置在视频中以查看它是否可以工作。