완전히 사용자 정의 된 UI 컨트롤을 사용하여 JMF 주변의 순수 Java로 비디오 플레이어를 제작하고 있습니다. 현재 재생 시간을 hh : mm : ss.ss 형식으로 업데이트하는 JLabel을 넣을 때까지 모든 것이 잘 작동했습니다. 라벨이 정상적으로 업데이트되지만 때때로 한 번에 10 초 이상 중단되는 경우가 있습니다. 이는 용납 할 수 없습니다.JMF 비디오가 재생되는 동안 비디오 컨트롤 UI를 업데이트 할 때 Java 동시성 문제가 발생했습니다.
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));
}
StartEvent
에 ControllerListener
에서 호출됩니다 여기에 UI 업데이트 코드입니다. 이 시간 동안 오디오/비디오가 재생됩니다.
Java의 동시성에 관해서는 약간의 초보자이지만,이 별도의 스레드를 처리 할 때 더 좋은 방법이있을 것이라고 확신합니다. 어떤 제안?
레이블을 무효화하고 각 업데이트 후에 유효성 검사를 시도하십시오. – roni
문제는 JLabel이 다시 그리지 않는다는 것이 아니라 스레드가 "멈추는"것처럼 보입니다. 나는'updateTimeLabel()'에 sysout 문을 넣었고 문제가 발생하면 sysouts가 호출되지 않는다. – alalonde