Проблемы с параллелизмом Java при обновлении пользовательского интерфейса управления видео во время воспроизведения видео JMF - PullRequest
1 голос
/ 08 марта 2012

Я создаю видеоплеер на чистом Java с использованием JMF с полностью настраиваемыми элементами управления пользовательским интерфейсом.Все работало отлично, пока я не вставил JLabel, который обновляет текущее время воспроизведения в формате чч: мм: сс.сс.Ярлык обновляется приемлемо, но иногда останавливается на 10+ секунд за раз, что недопустимо.

JMF Player создается в блоке SwingUtilities.invokeLater(new Runnable()....Вот код обновления пользовательского интерфейса:

protected void createUIUpdater() {
    System.out.println("Creating UI updating worker thread");
    new Thread() {
        @Override
        public void run() {
            while(mediaPlayer.getState() == Controller.Started) {
                updatePlayPosition();
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    System.err.println("Sleep interrupted!");
                }
            }
            System.out.println("UI Updater thread finished.");
        }
    }.start();
}

protected void updatePlayPosition() {
    Movie movie = timelineEditor.getMovie();
    movie.setInsertionPoint(Rational.valueOf(mediaPlayer.getMediaTime().getSeconds()));
    updateTimeLabel();
}

protected void updateTimeLabel() {
    Movie movie = timelineEditor.getMovie();
    Rational time = movie == null ? new Rational(0,1) : movie.getInsertionPoint();
    // ... hours/minutes/seconds calculated
    timeLabel.setText((hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes)
            + ":" + (seconds < 10 ? "0" + seconds : seconds)
            + "." + (frame < 10 ? "0" + frame : frame));
}

, который вызывается в ControllerListener на StartEvent.В это время воспроизводится аудио / видео.

По общему признанию, я немного новичок, когда дело доходит до параллелизма в Java, и я уверен, что есть лучший способ обработки этого отдельного потока.Есть предложения?

Ответы [ 2 ]

0 голосов
/ 21 марта 2012

После более тщательной проверки кажется, что мой поток выполняется нормально, он просто время от времени блокируется на mediaPlayer.getMediaTime() (где mediaPlayer - javax.media.Player).

Оказывается, звонок mediaPlayer.getMediaNanoseconds() не блокирует.

0 голосов
/ 09 марта 2012

вы можете заменить ваш поток / сон на ScheduledExecutorService: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html

, поскольку при использовании режима сна нет никакой гарантии относительно того, как долго поток будет фактически находиться в режиме сна, может потребоваться больше времени, которое вы укажете для возврата в состояние выполнения.

...