【问题标题】:JavaFX 8 Media Player Progress SliderJavaFX 8 媒体播放器进度滑块
【发布时间】:2017-02-25 22:18:18
【问题描述】:

所以,一段时间以来,我一直在使用 JavaFX 开发媒体播放器应用程序。不幸的是,我遇到了一个我不知道如何解决的问题。我的 GUI 中应该显示视频进度的滑块无法正常工作。它结束得太早了。所以视频会一直播放到结束,但滑块已经停止了。

任何帮助将不胜感激。

Double time = player.getTotalDuration().toSeconds();

    player.currentTimeProperty().addListener((ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) -> {
        slider.setValue(newValue.toSeconds());
    });
    slider.setOnMouseClicked((MouseEvent mouseEvent) -> {
        player.seek(Duration.seconds(slider.getValue()));
    });

【问题讨论】:

  • 您是否使用slider.setMax() / 能够判断视频播放前的时长?
  • 不,我不是。我应该在播放之前获取视频的长度吗?
  • 是的,Slider 的默认最大值为 100,这意味着您的滑块似乎在 1 分 40 秒左右完成?您必须计算视频的秒数,然后使用它来设置滑块的最大值。
  • 是的,但不是双倍时间 = player.getTotalDuration().toSeconds();应该这样做吗?
  • 根据docs,如果持续时间为UNKNOWNtoSeconds()返回NaN

标签: java javafx


【解决方案1】:

您需要滑块的max property 等于您正在播放的媒体的总秒数。请注意,在媒体播放器从媒体资源中读取足够的信息之前,媒体的totalDuration 是未知的。最好的方法是为此使用绑定:

slider.maxProperty().bind(Bindings.createDoubleBinding(
    () -> player.getTotalDuration().toSeconds(),
    player.totalDurationProperty()));

在某些情况下,媒体资源不会指示总时长;在这种情况下,可能无法将滑块链接到播放器的当前时间,除非您有其他了解总持续时间的机制。

【讨论】:

  • 您的解决方案有效。但我必须将 maxValueProperty() 更改为 maxProperty() 才能正常工作。
  • @Matheus 是的,抱歉:已修复。
  • 我发现向 totalDurationProperty 添加一个监听器对我来说效果更好。使用这个答案的方法,我在评估 Binding 的 Callable 时收到了 NullPointerExceptions。
  • @geisterfurz007 - 您正在获得 NPE,因为在上述代码运行时 MediaPlayer 仍在加载视频。将代码放入 MediaPlayer 的 setOnReady 方法中,该方法在加载完成后触发。我所看到的一切都告诉我 MediaPlayer 有自己的线程并且异步执行。
猜你喜欢
  • 2022-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多