⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jmf开发指南5

📁 jmf开发指南
💻
字号:
 百度空间 | 百度首页 | 登录               MonkeyTree无主题主题空间 主页博客相册|个人档案 |好友  	查看文章		 JMF开发指南-5 播放器状态管理2008-05-24 02:065 播放器状态管理bigbigant翻译自http://java.sun.com/javase/technologies/desktop/media/jmf/1.0/guide/JavaMediaFrame.fm5.html以下5个方法用来在控制播放器在各个状态间切换:    realize prefetch start deallocate stop close通过调用这些方法,我们可以对播放器的状态进行管理。例如:我们可以在实际开始前通过preparing播放器来最小化启动的延时。我们可以实现ControllerListener接口来管理控制器的方法以便响应Player的状态变化。监听播放器的状态转换,在其他情景下也很重要,例如:在Player 达到Realized状态之前,我们是不能获取它的界面组件(components)的。通过监听RealizeCompleteEvent,我们可以在播放器被Realized之时来获取界面组件。5.1 准备开始播放器大多数播放器都不能快速的开启,在播放器开始之前,必须具备一些些软硬件条件。例如:如果播放器从没启动过,那么他必须为存储媒体数据而申请缓冲内存。再比如:如果媒体数据来自网络设备,Player在下载数据前先要建立网络连接。即使播放器以前就启动过,缓冲可能没有包含当前播放位置的有效数据。5.1.1 播放器的实现(Realizing)和预取(Prefetching)JMF把Player准备的过程分成了两个阶段——实现(Realizing)和预取(Prefetching)。Realizing和 Prefetching能够最小化播放器start被调用后到开始播放前的时间,有助于建立快速反应的用户体验。实现 ControllerListener接口让我们可以适时的进行控制。通过调用realize,可以让播放器进入Realizing状态,开始实现(Realization)的进程。调用prefetch则可以让播放器进入 Prefetching的状态,开始预取的进程。Realize和prefetch方法是异步的(非阻塞的),会迅速return。当播放器完成了相应的操作,就会抛出RealizeCompleteEvent 或 PrefetchCompleteEvent事件。已预取(Prefetched)状态下的播放器已经准备好开始,并且他开始的等待时间已不能被进一步减少。需要注意,Prefetched状态下的Player绑定了系统资源。因为诸如声卡的一些资源,在同一时间有可能只能被一个程序使用,这就可能导致其他播放器无法开始。5.1.2 在播放器Realized前保持阻塞(Blocking)许多方法的调用要求播放器达到Realized状态。有种途径是在call这些方法的时候,调用realize并且在收到RealizeCompleteEvent之前保持阻塞。注意:realize时阻塞会导致令人不满的结果。例如:一个applet中的Player阻塞可能会导致Applet.start和Applet.stop无法切入进程。Realized前保持阻塞,我们实现一个叫做blockingRealize的方法,这个方法去调用realize并且在Player抛出 RealizeCompleteEvent controllerUpdate接收到时return。这要求我们实现ControllerListener 接口并注册为Player的监听者。如果我们注册为多个Player的监听者,那么我们需要在controllerUpdate方法中确定是哪一个 Player抛出的RealizeCompleteEvent。boolean realized = false;public synchronized void blockingRealize(){   myPlayer.realize();   while (!realized) {      try {         wait();      }      catch (java.lang.InterruptedException e) {         status.setText("Interrupted while waiting on                         realize...exiting.");         System.exit(1);      }   }}public synchronized void controllerUpdate (ControllerEventevent){   if (event instanceof RealizeCompleteEvent) {      realized = true;      notify();   }   else if (event instanceof EndOfMediaEvent) {      eomReached = true;   }}5.1.3 确定Player的启动等待时间确定这个播放器开始所需要的时间的方法,我们称之为getStartLatency。Player的启动延时是可变的,getStartLatency的返回值表示启动延时可能的最大值。对于某些类型的媒体,getStartLatency可能会return LATENCY_UNKNOWN.getStartLatency返回的值可能会因播放器当前所处的状态而有所不同。例如:prefetch操作后的返回值一般会比较小。一个能被添加啊的 Player的控制器一旦达到Prefetched状态,会返回一个有用的值。(For more information about added Controllers, see "Using a Player to Manage and Synchronize other Controllers" on page 29.)5.2 播放器的开始和停止调用start可以让Player进入started状态。一旦start被调用,在播放器停止前,只对stopped Player有效的方法就不能被调用了。如果start被调用时播放器还没有被预取(prefetched),start会执行realize和prefetch操作以便进入prefetched状态,Player会在它进入每一个状态时抛出转换事件。调用stop,播放器会立即停止。Stop是同步的方法。然而,一个Player在以下几种情况也可以异步地停止:     到达媒体流的末端。     到达setStopTime预设的停止时间。     播放器数据匮乏。播放器停止时会抛出StopEvent。我们可以通过监听以下事件来确认播放器为何停止:DeallocateEvent, EndOfMediaEvent , RestartingEvent, StopAtTimeEvent, StopByRequestEvent 和 DataStarvedEvent5.3 释放播放器资源Deallocate方法通知播放器释放独占的资源,同时最小化他使用的非独占的资源。尽管未定义播放器缓冲和内存管理的需求,大多数播放器按照标准Java对象来申请缓冲区,一个好的Player的实现在deallocate被调用时应该尽可能多地释放内存。deallocate方法只能在Stopped的方法器上调用。为了避免ClockStartedErrors,我们应该在调用deallocate之前 call一下stop。在一个Prefetching 或 Prefetched 状态下的Player上调用deallocate,Player会回到Realized状态。如果对一个realizing中的player调用 deallocate,播放器会抛出DeallocateEvent 并且回到Unrealized状态。(一个已经realized的播放器是不能回到Unrealized状态的)我们通常在播放器没有被使用的时候调用deallocate。例如:applet应该把调用deallocate作为stop方法的一部分。通过 deallocate,程序能够在整体释放其他资源的时候,保持对Player的引用。(JMF不会阻止一个曾经处于prefetched或 started状态的Realized的Player保持信息,这些信息能够加速以后的启动。)当我们我们结束一个播放器(或其他控制器)并且不再使用它,我们应该调用close。 Close方法表示Controller将会被关闭,不再会被使用。调用close会释放所有控制器使用的资源,and causes the it to cease all activity.一个closed的控制器不能重开,调用其方法可能会导致错误。5.4 实现ControllerListener接口ControllerListener是一个异步处理Controller对象抛出的事件的接口。使用ControllerListener接口可以让我们有效管理诸如prefetch等消耗时间的Player操作。实现ControllerListener接口,可以这样来做:在一个class中实现ControllerListener interface调用想要监听的Controller的addControllerListener将这个class的实例注册为监听者(listener)。当Controller抛出事件时,已注册的listener的controllerUpdate方法就会被调用。controllerUpdate的典型写法(一序列的if-else)如下:if(event instanceof EventType){...} else if(event instanceof OtherEventType){...}这样写可以过滤掉我们不感兴趣的事件。如果一个ControllerListener注册为多个Controller的监听者,我们需要确认是哪一个 Controller抛出的事件。ControllerEvent会带上一个对其来源的引用,这个引用可以通过getSource方法访问到。"Appendix D: ControllerAdapter" on page 73 provides the source for an implementation of ControllerListener that can be easily extended to respond to particular Events.当我们从一个Controller收到事件,在调用一个控制方法前,我们可能需要一些额外的处理来确任状态是否恰当。例如:在call任何受限于 stopped状态的player方法,我们需要调用getTargetState来检查Player的目标状态。如果start已经被调用,即使他可能会抛出准备过程中的转换事件,Player仍会被认为将要进入started状态。某些类型的ControllerEvewnt会被印上额外的状态信息,例如:StartEvent 和 StopEvent都定义了获取事件被抛出时的媒体时间的方法。1 This example code is used with the permission of Bill Day and JavaWorld magazine. The blockingRealize example code was first published by Bill Day in "Java Media Framework Player API: Multimedia Comes to Java" in JavaWorld magazine, an online publication of Web Publishing Inc., April 1997. Please see http://www.javaworld.com/javaworld/jw-04-1997/jw- 04-jmf.html for the complete article, example code listing, and demonstration applets.类别:Jmf | 添加到搜藏 | 浏览(396) | 评论 (0) 上一篇:JMF开发指南-4 开始和停止Player    下一篇:JMF开发指南-6 时间管理 相关文章:•	木人播放器(同步歌词mp3格式)(需...         	 	  最近读者:	登录后,您就出现在这里。							 	 	huanyinghong	tuyun1984	灯火阑珊处的爱	mmxcq	jxh12345j	bdjingchao	 网友评论:发表评论:姓 名: 	   注册 | 登录*姓名最长为50字节  	网址或邮箱: 	(选填)  	内 容: 	插入表情  	验证码: 	看不清?  	    取消回复  	  	 ©2009 Baidu

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -