群众演员招聘信息:利用JMF进行多媒体编程(3)

来源:百度文库 编辑:偶看新闻 时间:2024/05/01 18:41:58
利用JMF进行多媒体编程(3) myeclipse 转贴  (参与分:19378,专家分:811)   发表:2005-07-26 10:37   版本:1.0   阅读:1423
作者:冯睿    本文选自:赛迪网  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。图二显示了程序正在播放多媒体文件时的情况。 






图二 程序正在播放媒体文件