作者:馮睿 本文選自:賽迪網(wǎng) 2002年09月29日 有時(shí)你需要使用一個(gè)Player對象來(lái)控制多個(gè)其他的Player和Controller對象,我們把這個(gè)Player對象稱(chēng)為主對象,并把這些對象組成一個(gè)組。通過(guò)調用主對象中的start()、stop()、setMediaTime()等方法就可以激活組中所有成員的相應方法。主對象控制所有的狀態(tài)變化和事件發(fā)布。然后使用addControllerListerner()方法來(lái)將一個(gè)ControllerListener對象綁定到Player對象上,Controller對象將向該ControllerListener對象發(fā)送事件消息。
dualPlayer.addControllerListener(this);
最后需要調用start()方法來(lái)啟動(dòng)Player對象。start()方法將Player對象的狀態(tài)設置為Started。如果Player沒(méi)有被實(shí)體化(Realize)或預?。≒refetch),start()方法會(huì )自動(dòng)執行這些操作。
dualPlayer.start();
由于JMF類(lèi)實(shí)現了ControllerLister接口,因此需要實(shí)現該接口中的controllerUpdate()方法,該方法在Controller對象產(chǎn)生一個(gè)事件時(shí)被調用。
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類(lèi)產(chǎn)生了一個(gè)RealizeCompleteEvent事件后,controllerUpdate()方法在界面上增加兩個(gè)Component對象,一個(gè)用于播放媒體,一個(gè)用于放置控制按鈕,例如播放、停止等。
在運行程序的過(guò)程中,程序會(huì )產(chǎn)生下面的輸出。
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()方法的時(shí)候,Player會(huì )切換到Started狀態(tài)。從上面列出的信息中可以看到Player對象的狀態(tài)從Unrealized變成了Started。當EndOfMedia事件被激活時(shí)(這時(shí)Player對象完成了媒體文件的播放),狀態(tài)從Started變成了Prefetched。圖二顯示了程序正在播放多媒體文件時(shí)的情況。
圖二 程序正在播放媒體文件 | |