在JMF视频播放时更新视频控制UI时出现Java并发问题

时间:2012-03-08 19:24:40

标签: java concurrency jmf

我正在围绕JMF构建纯Java的视频播放器,具有完全自定义的UI控件。一切都很顺利,直到我输入一个JLabel,以hh:mm:ss.ss格式更新当前的播放时间。标签更新可接受,但偶尔会暂停10秒以上,这是不可接受的。

JMF Player是在SwingUtilities.invokeLater(new Runnable()...块中创建的。这是UI更新代码:

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的{​​{1}}中调用。在此期间,音频/视频正在播放。

对于Java中的并发性而言,我当然是一个新手,我确信有更好的方法来处理这个单独的线程。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您可以使用ScheduledExecutorService替换Thread / sleep: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html

因为在使用睡眠时无法保证线程实际睡眠多长时间,可能需要更多时间来指定返回运行状态。

答案 1 :(得分:0)

经过仔细检查后,似乎我的线程执行正常,偶尔会在mediaPlayer.getMediaTime()mediaPlayerjavax.media.Player)时被阻止。

原来,调用mediaPlayer.getMediaNanoseconds()不会阻止。