利用JMF進行多媒體編程(3)

作者:馮睿    本文選自:賽迪網  2002年09月29日  
 
有時你需要使用一個Player對象來控制多個其他的Player和Controller對象,我們把這個Player對象稱爲主對象,並把這些對象組成一個組。通過調用主對象中的start()、stop()、setMediaTime()等方法就可以激活組中所有成員的相應方法。主對象控制所有的狀態變化和事件發佈。然後使用addControllerListerner()方法來將一個ControllerListener對象綁定到Player對象上,Controller對象將向該ControllerListener對象發送事件消息。 

dualPlayer.addControllerListener(this);
 


最後需要調用start()方法來啓動Player對象。start()方法將Player對象的狀態設置爲Started。如果Player沒有被實體化(Realize)或預取(Prefetch),start()方法會自動執行這些操作。 

dualPlayer.start();
 


由於JMF類實現了ControllerLister接口,因此需要實現該接口中的controllerUpdate()方法,該方法在Controller對象產生一個事件時被調用。 

public synchronized void controllerUpdate(ControllerEvent event) {
  if (event instanceof RealizeCompleteEvent) {
    Component comp;
    if ((comp = dualPlayer.getVisualComponent()) != null)
      add ("Center", comp);
    if ((comp = dualPlayer.getControlPanelComponent()) != null)
      add("South", comp);
    validate();
  }
}
 


當JMF類產生了一個RealizeCompleteEvent事件後,controllerUpdate()方法在界面上增加兩個Component對象,一個用於播放媒體,一個用於放置控制按鈕,例如播放、停止等。 

在運行程序的過程中,程序會產生下面的輸出。 

Starting player ...javax.media.TransitionEvent
  [source=com.sun.media.content.video.mpeg.Handler@71bb78,
  previous=Unrealized,
  current=Realizing,
  target=Started]
Open log file: C:/test/Java/JMF/JMF/jmf.log
javax.media.DurationUpdateEvent
  [source=com.sun.media.content.video.mpeg.Handler@71bb78,duration=
  javax.media.Time@2a37a6
javax.media.RealizeCompleteEvent
[source=com.sun.media.content.video.mpeg.Handler@71bb78,
  previous=Realizing,
  current=Realized,
  target=Started]
Adding visual component
Adding control panel
javax.media.TransitionEvent
  [source=com.sun.media.content.video.mpeg.Handler@71bb78,
  previous=Realized,
  current=Prefetching,
  target=Started]
javax.media.PrefetchCompleteEvent
  [source=com.sun.media.content.video.mpeg.Handler@71bb78,
  previous=Prefetching,
  current=Prefetched,target=Started]
javax.media.StartEvent
  [source=com.sun.media.content.video.mpeg.Handler@71bb78,
  previous=Prefetched,
  current=Started,
  target=Started,
  mediaTime=javax.media.Time@56a05e,timeBaseTime=
  javax.media.Time@3a8602]
javax.media.EndOfMediaEvent
  [source=com.sun.media.content.video.mpeg.Handler@71bb78,
  previous=Started,
  current=Prefetched,
  target=Prefetched,
  mediaTime=javax.media.Time@1d332b]
 


前面提到,當調用start()方法的時候,Player會切換到Started狀態。從上面列出的信息中可以看到Player對象的狀態從Unrealized變成了Started。當EndOfMedia事件被激活時(這時Player對象完成了媒體文件的播放),狀態從Started變成了Prefetched。圖二顯示了程序正在播放多媒體文件時的情況。 






圖二 程序正在播放媒體文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章