【问题标题】:JavaFX MediaPlayer: MP4 Won't Loop on Windows 7JavaFX MediaPlayer:MP4 不会在 Windows 7 上循环播放
【发布时间】:2018-03-30 19:14:34
【问题描述】:

我创建了一个基本的 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 秒钟,然后在视频结束时,视频会冻结。鉴于视频只有 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。

【问题讨论】:

  • 任何分辨率?
  • @Slaw 我观察到,如果视频存储在外部 JAR 中,它将永远不会循环播放。在本地添加此资源允许预期的循环行为。我正在使用 Windows 7,Java 8 更新 51。
  • 我无法在 Windows 7 Java 版本 1.8.0_73 中重现该问题。我尝试从资源或本地加载文件,我还尝试播放超过 5 秒、恰好 5 秒和小于 5 秒(准确地说是 3 秒)的视频,一切正常。我可能会尝试使用最新版本的 Java,但这是安装在这台旧 PC 上的,可能问题出现在最新版本中。
  • @JKostikiadis 谢谢。视频是 mp4 还是 flv?
  • 这是一个开放的错误,你可以在这里看到bugs.openjdk.java.net/browse/JDK-8088375 也可以通过在上面给出的方法中添加这一行来尝试可能的解决方案 >>>>>>player.setStopTime(new Duration(40000));

标签: java windows video javafx media-player


【解决方案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;
}

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

@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 这样的库来播放声音。这应该适用于每个操作系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-26
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      相关资源
      最近更新 更多