JavaFX Media - пауза(); метод делает MediaPlayer быстрой перемоткой вперед?

метод pause() MediaPlayer заставляет 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;
        }
    }

Результат не ясен, разница где-то в 200-400 мс между спотом d1 и d2.

Конечно, я попытался вернуть своего игрока на d1 после приостановки воспроизведения мультимедиа, но это не сработало, тот же результат после возобновления воспроизведения мультимедиа.

Заранее благодарю за любой совет :)


person Rouman    schedule 08.08.2016    source источник


Ответы (1)


Это связано с тем, что pause метод не останавливает воспроизведение мгновенно (при вызове pause медиа все равно воспроизводится и останавливается ровно в тот момент, когда statusProperty изменяется):

Ставит плеер на паузу. После фактической приостановки проигрывателя статус будет установлен на MediaPlayer.Status.PAUSED.

Поэтому измерения не очень важны, потому что, когда вы получаете текущее время Duration d1 = player.getCurrentTime(); до паузы, воспроизведение фактически не приостанавливается, а также когда вы получаете текущее время после вызова pause с Duration 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.

person DVarga    schedule 08.08.2016
comment
Вау, невероятно! Я смотрел много видео и читал, чтобы узнать, как это сделать... Большое спасибо! Ценю вашу помощь. - person Rouman; 08.08.2016