2012-03-08 29 views
1

我正在用JMF构建纯Java视频播放器,并使用完全自定义的UI控件。一切都很好,直到我放入一个JLabel,它以hh:mm:ss.ss格式更新当前播放时间。标签更新可以接受,但偶尔会暂停10秒以上,这是不可接受的。在JMF视频播放期间更新视频控制UI时的并发问题

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)); 
} 

这就是所谓的ControllerListenerStartEvent。在此期间,音频/视频正在播放。

对于Java中的并发性,我承认有点新手,而且我确信有更好的方法来处理这个单独的线程。有什么建议么?

+0

尝试调用标签invalidate,然后在每次更新后进行验证。 – roni 2012-03-08 19:52:51

+0

问题不在于JLabel不重绘,而是线程似乎“挂起”。我在'updateTimeLabel()'中输入了一个sysout语句,当问题发生时,系统不会被调用。 – alalonde 2012-03-08 22:21:27

回答

0

仔细检查后,似乎我的线程执行罚款,它才刚刚偶尔mediaPlayer.getMediaTime()阻塞(其中mediaPlayerjavax.media.Player)。

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