2012-03-08 2 views
1

완전히 사용자 정의 된 UI 컨트롤을 사용하여 JMF 주변의 순수 Java로 비디오 플레이어를 제작하고 있습니다. 현재 재생 시간을 hh : mm : ss.ss 형식으로 업데이트하는 JLabel을 넣을 때까지 모든 것이 잘 작동했습니다. 라벨이 정상적으로 업데이트되지만 때때로 한 번에 10 초 이상 중단되는 경우가 있습니다. 이는 용납 할 수 없습니다.JMF 비디오가 재생되는 동안 비디오 컨트롤 UI를 업데이트 할 때 Java 동시성 문제가 발생했습니다.

JMF PlayerSwingUtilities.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)); 
} 

StartEventControllerListener에서 호출됩니다 여기에 UI 업데이트 코드입니다. 이 시간 동안 오디오/비디오가 재생됩니다.

Java의 동시성에 관해서는 약간의 초보자이지만,이 별도의 스레드를 처리 할 때 더 좋은 방법이있을 것이라고 확신합니다. 어떤 제안?

+0

레이블을 무효화하고 각 업데이트 후에 유효성 검사를 시도하십시오. – roni

+0

문제는 JLabel이 다시 그리지 않는다는 것이 아니라 스레드가 "멈추는"것처럼 보입니다. 나는'updateTimeLabel()'에 sysout 문을 넣었고 문제가 발생하면 sysouts가 호출되지 않는다. – alalonde

답변

0

자세히 조사한 후에 내 스레드가 정상적으로 실행되고있는 것 같습니다. mediaPlayer.getMediaTime() (여기서 mediaPlayerjavax.media.Player) 일 때 가끔씩 차단되는 것 같습니다.

전화가 걸리면 mediaPlayer.getMediaNanoseconds()은 차단되지 않습니다.

0

당신이 ScheduledExecutorService를 사용하여 스레드/잠을 대체 할 수있는 : 잠을 사용하는 경우, 당신이로 돌아 지정 더 많은 시간이 걸릴 수 있습니다 스레드가 잠을 실제로 얼마나 오래에 관해서는 보장이 없기 때문에 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html

실행 상태.

+0

시도해 보니 동일한 문제인 것으로 보입니다. 실행중인 스레드가 때때로 차단되는 것처럼 보입니다. – alalonde