JavaFX 媒体 - 暂停();方法使 MediaPlayer 快进?

Posted

技术标签:

【中文标题】JavaFX 媒体 - 暂停();方法使 MediaPlayer 快进?【英文标题】:JavaFX Media - pause(); method makes MediaPlayer fast-forward? 【发布时间】:2016-12-13 16:00:27 【问题描述】:

MediaPlayerpause() 方法使 Media 有点“寻找”。 真的很烦人,但我没发现问题出在哪里。

    private void playPauseClicked() 
         
        Status currentStatus = player.getStatus();
        if(currentStatus == Status.PLAYING)
        
            Duration d1 = player.getCurrentTime(); //To measure the difference
            player.pause();
            Duration d2 = player.getCurrentTime();
            VIDEO_PAUSED = true;
        
        else if(currentStatus == Status.PAUSED || currentStatus == Status.STOPPED)
        
            player.play();
            VIDEO_PAUSED = false;
        
    

结果不清楚,点d1和d2相差200-400ms左右。

当然,我在暂停媒体后尝试将我的播放器寻回 d1,但没有成功,恢复媒体后的结果相同。

提前感谢您的任何建议:)

【问题讨论】:

【参考方案1】:

这是因为pause 方法不会立即停止播放(当pause 被调用时,媒体仍然在播放并恰好在statusProperty 更改的那一刻停止):

暂停播放器。 一旦播放器实际暂停,状态将 设置为 MediaPlayer.Status.PAUSED。

因此测量值并不真正相关,因为当您在暂停之前获得当前时间Duration d1 = player.getCurrentTime(); 时,播放实际上并没有暂停,并且当您在调用pauseDuration d2 = player.getCurrentTime(); 之后获得当前时间时不正确,因为pause 已异步执行,因此无法保证d2 处视频停止播放:

MediaPlayer 的操作本质上是异步的。

当播放停止时,您可以做的是观察MediaPlayer的状态变化,例如使用setOnPaused.

示例:

private void playPauseClicked() 
    Status currentStatus = player.getStatus();

    if(currentStatus == Status.PLAYING)
        player.pause();
    else if(currentStatus == Status.PAUSED || currentStatus == Status.STOPPED) 
        System.out.println("Player will start at: " + player.getCurrentTime());
        player.play();
    


player.setOnPaused(() -> System.out.println("Paused at: " + player.getCurrentTime()));

示例输出:

Paused at: 1071.0203000000001 ms
Player will start at: 1071.0203000000001 ms
Paused at: 2716.7345 ms
Player will start at: 2716.7345 ms

注意: 但是如果你只是想停下来玩,则不需要设置MediaPlayer的时间,但如果你愿意,你可以使用seek的方法.

【讨论】:

哇,太棒了!我看了很多视频并一直在阅读以了解如何做到这一点......非常感谢!感谢您的帮助。

以上是关于JavaFX 媒体 - 暂停();方法使 MediaPlayer 快进?的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX2:我可以暂停后台任务/服务吗?

JavaFX概览

JavaFX概览

当活动暂停时,如何正确停止倒数计时器中的媒体播放器?

运行 JavaFx 媒体应用程序时出现模块错误

fedora 21 javafx 没有创建媒体播放器