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

📄 javamf.txt

📁 Java媒体框架,java多媒体技术介绍
💻 TXT
📖 第 1 页 / 共 5 页
字号:
while(!realized)}
    七ry{
        wait();
catch(java.lang.InterruptedException e)}
    status. setText("Interrupted while waiting on realize... exiting
    System.exit(1);
public synchronized void control lerUpdate (Control lerEwent event)
if (event instanceof Real izeCompleteEwent){
realized=true;
notify();
else if (event instanceof EndOfMediaEvent){
    eomReached = true;
    3.决定播放器的启动延时
    可以通过调用getStartLatency决定启动一个播放器需要多长时间。对于具有不同启
动延时的播放器,getStartlatency的返回值代表最大可能的启动延时。对某些媒体类型,
getStartlatency将返回LATENCY- UNKOWNo
    getStartLatency报告的启动延时因播放器的当前状态不同而不同。例如,在prefetch操
作执行后,getStartlatency的返回值相当的小。能够添加到播放器中的控制器,一旦其处于
Prefetched状态将返回一个有用的值。(有关添加控制器的信息,请参阅1.8节“采用播放
器管理和同步控制器”。)
1.5.2启动和停止播放器
调用start方法将使播放器进人Started状态。一旦调用了start方法,就不能调用那些
                                                                                                      17只对停止的播放器是合法的方法,直到播放器停止为止。
    如果调用了start方法,而播放器又没被预取到,start将执行实现和预取操作,这是使
播放器进人Prefetched状态所必需的操作。播放器在进人每个状态时报告事务事件(tran-
sition event)。
    当对播放器调用stop方法时,播放器应当立即停止下来,因为stop是同步的。但是,
播放器在下列情况下也会异步停止:
    ?到达媒体流的尽头。
    .到达用setStopTime预先设置的停止时间。
    ?播放器缺乏数据。
    当播放器停止时,它报告一个StopEvent。为判断播放器停止的原因,我们必须监听特
殊的停止事件:DeallocateEvent, EndOf-MediaEvent, RestartingEvent, StopAtTimeEvent,
StopByRequestEvent和DataStarvedEvent,
.5.3释放播放器资源
    调用deallocate方法将告诉播放器释放任何独占型资源,并尽量减少其对非独占型资
源的使用。虽然播放器的缓冲与内存管理需求并未明确规定,但是,相对Java对象的标
准来讲,绝大多数Java媒体播放器还是分配了较大的缓冲区。一个实现良好的(well-
implemented)播放器在调用deallocate方法时,将尽可能地释放其占用的内存。
    deallocate方法只能对处于Stopped状态的播放器调用。为了避免ClockStartedError,应
当在调用deallocate方法之前调用stop。对处于Prefetching或Prefetched状态的播放器调用
deallocate方法,将使其退回Realized状态。如果正在播放器实现时调用deallocate方法,播
放器将报告一个DeallocateEvent,并返回Unrealized状态。(播放器一旦被实现,就再也不
会返回Unrealized状态了。)
    通常在播放器未被使用时调用deallocate方法。例如,小应用程序应将deallocate作为
其stop方法的一部分。通过调用deallocate,程序可以维持着对播放器的访问(reference ) ,
同时释放整个系统所需使用的其他资源。(JMF并不禁止以前处于Prefetched或Started状
态而现在处于Realized状态的播放器维持允许其将来迅速启动的信息。)
    当结束一个播放器,且再也不会使用它时,应当调用。lose,, Cl,方法指出播放器再
也不能用了,并将其关掉。调用close方法将释放播放器所使用的所有资源,停止播放器
的所有动作。当播放器被关闭时,它报告一个PlsyerClosedEvent。已关闭的播放器不能再
次打开,引用其方法将产生错误。
.5.4实现〔:ontrollerListener接口
    ControllerUstener是用于处理控制器(Controller)对象产生的事件的一个异步接口。通
过使用ControllerUstene:接口,能够实现播放器潜在的耗时操作的计时管理,如预取操作
等。为实现ControllerListener接口,需要:
    (1)在一个类中实现ControllerUstener接口;
    (2)通过对欲从它那里接收事件的控制器调用addControllerUstene:方法,将该类注册
      18为监听器(listener) o
    每当控制器报告一个事件时,它对所有注册的监听器调用controllerUpdate方法
controllerUpdate一般实现为一系列if-else语句:
if(event instanceof Event'Iype)}
else if(event instanceof Other EventType)}
    这样将筛除掉不感兴趣的事件。如果为多个控制器共同注册了一个监听器,那么,必
须判断究竟是哪一个控制器报告的事迹。伴随ControllerEvent的是对事件源的索引,可以
通过调用getSource得到事件源。
    附录D`‘控制器适配器(ControllerAdapter)”提供了一个ControllerListener实现的源代码.
可以很容易地将其扩展,以便处理具体的事件。
    当从一个控制器接收到事件时,或许要做一些额外的处理,以确保在调用控制方法前
控制器处于合适的状态。例如,在调用任何适合于Stopped状态播放器的方法之前,应当
通过调用getTargetState检查播放器的目标状态。假如start被调用的话,播放器应当进人
Started状态,即使它在准备表现媒体时报告事务事件。
    一些类型的ControllerEvent附带着状态信息。例如,StartEvent和StopEvent类各自定义
了一个允许查询事件发生时的media time的方法。
1.6管理计时
    在很多情况下,并不想从头到尾地播放一个媒体流,而只是想播放流中的一部分,或
同步演播多个流。JFM的时基(TimeBase)和时钟(Clock)接口定义了管理媒体演播的计时
(timing)和同步的机制。
    时基代表时间流。时基时间(time - based time)不能变换或重置。Java媒体播放器用
它的时基来计时,就像石英钟利用晶体以已知的频率振动的原理来计时一样。系统维持
着一个基本时基,它从某个特定的时刻开始,如1970年1月1日,以毫微秒为单位进行计
时。系统时基随着系统时钟的变化而变化,它可用Manager. getSystemTimeBase方法得到
    播放器的media time代表其正在表现的媒体流中的一个时间点。media time可以开
始、停止、重置,就像一个秒表(stopwatch) o
    时钟定义了时基(TimeBase)和media time之间的映射关系,如图1.4所示。
仁一1, z-一‘一end of rne
                                                dia
                                                  mad栩自》二‘
  、、气‘气‘
                、‘、、、、
                  、‘气、气、
                  、‘、、‘、
-一-一-共~一一一一二尸一二‘份一一一江气.lima-base Pima
              ’一’、I、、J“‘J
stop start
st中
图1.4 media time与time-base time之间的映射    Java媒体播放器可以回答几个有关它正表现媒体的计时的询问。当然,计时信息受
限于媒体源与存储媒体的网络设备的物理特征和限制。
    一个时间(Time)对象代表某些计时单位,如毫微秒。在询问或设置播放器的计时信
息时,将用到时间对象。
.6.1设置Media Time
    设置播放器的media time等于在媒体流中设置读取位置。对于像文件这样的媒体数
据源,meida time是固定的;最大meida time就是媒体流结束的时间。
    为了设置meida time,可以调用setMediaTime,并传送一个代表设定时刻的时间对象。
.6.2获取当前时间
    调用getMediaTime将返回一个代表播放器当前media time的时间对象。如果播放器
目前没再表现媒体数据,该时间对象代表了将来媒体表现开始的起点。在media time与
具体的帧(frame)之间没有一对一的映射关系。每一帧在确定的一段时间区间里表现,而
media time在该区间中持续增长。例如,假设有一个幻灯显示播放器,每显示一章幻灯片
需要5秒钟,则该播放器的帧播放速度为0.2帧/秒,如图1.5所示。
getMediaTime
            15
10’15
帧1帧2帧3
图1.5幻灯显示播放器的持续时间
    如果在时刻0.0启动播放器,在第一帧被显示时,media time从0.0递增到5.0。如果
从时刻2.0开始启动,第一帧只被显示了3秒钟,时间就到5.0秒了。
    可以通过获取播放器的时基和调用getRefTime来获取播放器的当前time-base time
    myCurrentTBTime = playerl .getTimeBase().getRefTime();
当播放器在运行时,你可以通过调用mapToTimeBase获取time-base time. time-base time对
应着一个具体的media time. .6.3设定播放器的速度
    播放器的速度决定了media time怎样随着time-base time的变化而变化,它定义了对每
一time-base time单位,播放器的media time递增多少单位。播放器的速度可当作一个临时
缩放因子(scale factor)。例如,速度为2.0指出media time流逝的速度是播放器启动时
time-base time的流逝速度的2倍。
    从理论上讲,播放器的速度可设定为任意的实数,速度为负数表示反向播放媒体但
是,许多媒体格式在帧与帧之间存在依赖关系,这就使得反向播放或以非标准速度播放媒
体成为不可能或不现实。
    当对播放器调用setRate时,返回实际设定的速度值,即使速度并未变化。播放器只
被保证支持的速度为1.0.
.6.4获取播放器的持续时间
    由于程序也许需要确定一个给定的媒体流将运行多长时间,所有的控制器
( Controller)皆实现了持续时间(Duration)接口。该接口只包括一个方法getDuration。持续
时间代表在以默认速度1.0播放时,媒体对象运行时间的长度。媒体流的持续时间只有
通过播放器才能访问到。
    如果在调用getDuration时,并未确定持续时间,将返回DURATION- UNKNOWN。如果
播放器尚未进人能访问到媒体源持续时间的状态时,这是有可能发生的。在晚些时间.持
续时间也许可访问得到,调用getDuration将返回持续时间值。如果媒体源没有确切的持
续时间,如实况转播,getDuration将返回DURATION _ UNBOUNDED.
1.7同步播放器
    为了同步多个媒体流的演播,可以通过赋予每个播放器相同的时基(TimeBase),来达
到同步播放器的目的。为做到这一点,只需使用时钟(Clock)接口定义的getTimeBase与
setTimeBase方法即可。例如,为同步Playerl与Player2,只需使Playerl采用Player2的时
基:
      p] ayerl .setTimeBase(player2.getTimeBase());
    当通过赋予其相同时基来同步播放器时,仍需独立管理每个播放器的控制。由于用
这种方式管理同步播放器可能是相当复杂的,因此,JMF提供了一种允许播放器对任何控
制器施加控制的机制。播放器自动地管理控制器的状态,允许通过单个控制点与整组控
制器交互。详细信息,请参阅1.8节“采用一个播放器管理和同步其他控制器”。
    在某些情况下,也许想自己管理多个播放器的同步,以便能独立地控制速度与,lia
time。为了实现该目的,必须:
    ?为每个同步的播放器注册一个监听器。
    ?判断将采用哪一个播放器的时基(time base)来驱动别的播放器,并将该时基设定
                                                                                                        21      为同步播放器的时基。并非所有播放器皆能接受新的时基。例如,如果一个欲同
      步的播放器具有push数据源,则必须采用该播放器的时基来驱动别的播放器c
    ?为所有播放器设定一个速度。假如具体播放器不能支持设定的速度,它将返回其
      所采用的速度。(没有查询播放器支持速度的机制。)
    ?同步播放器的状态(例如,停止所有播放器)。
    ?同步播放器的操作:
      ①为每个播放器设定media time;
      ②预取所有播放器;
      ③确定被同步的所有播放器的最大启动延时;
      ④通过调用syncStart启动播放器,syncStart带一个时间参数作为最大启动延时
    必须监听所有播放器的事务事件,并且记录哪些播放器报告了事件。例如,在预取播

⌨️ 快捷键说明

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