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

📄 javamf.txt

📁 Java媒体框架,java多媒体技术介绍
💻 TXT
📖 第 1 页 / 共 5 页
字号:
    PlayerApplet响应一类事件—RealizeCornpleteEvent。只要播放器报告一个Realize-
CompleteEvent, PlayerApplet将显示播放器的构件。代码如下:
public synchronized void control lerUpdate(ControllerEwent event)
}
if (event instanceof RealizeCompleteEvent){
    Component comp;
  if((comp=player.getVisualComponent())!=null)
      add ("Center", comp);
  if((comp二player.getControlPanelcomponent())!=null)
      add ("South", comp);
  validate();
    播放器的用户接口构件直到其处于Realized状态时才能显示出来;处于Unrealized状
态的播放器获得的关于其媒体流的信息,并不足以支持对其用户接口构件的访问
PlayerApplet等待播放器报告一个RealizeCompleteEvent,然后通过将它们加人小应用程序包
容器来显示播放器的可视构件和默认控制面板。对validat。的调用将触发布局管理器修
改显示画面,从而将新的构件包含进去。
        121.3产生并显示一个播放器
    可以通过媒体管理器间接地产生播放器。为了显示该播放器,可以得到播放器的构
件并将它们加人小应用程序的表现空间或独立应用程序窗口中。
1.3.1产生播放器
    当需要一个新播放器时,可以通过调用createPlaye;向管理器申请。管理器根据定义
的媒体URL和MediaLocato:来产生一个合适的播放器。
    URL只有在已安装了相应URLrStreamHandler的情况下才能被成功地构造,而
MediaLocator4没有这个限制。
    这层间接(level of indirection)允许新的播放器被无缝地集成。即使播放器也许实际上
是从可交换部件构造出来,或是在运行时被动态装人的,但在客户眼里,新的播放器总是
以相同方法产生的。
1.3.2显示播放器和播放器控件
    JMF定义了显示媒体流的计时和绘制模型,但是播放器的接口构件实际上是用Java
屏幕显示的核心包,即以Java. awt显示的。播放器可以有两类AWT构件:可视构件和控
制构件。
    1.显示播放器的可视构件
    播放器用于显示其媒体数据的构件被称为它的可视构件。即使一个音频播放器都可
以有一个可视构件,如波形显示或模拟符号。
    显示播放器可视构件的步骤分为:
    (1)通过调用getVisualComponent获取构件;
    (2)假如构件到小应用程序的表现空间或独立应用程序窗口中。
    还可以通过可视构件访问播放器的显示属性,如x,y坐标。播放器构件的布局是由
AWI’布局管理器控制的。
    2.显示播放器的控制构件
    播放器通常有一个控制面板,允许用户控制媒体表现。例如,播放器可用一套按钮来
开播、停止、暂停媒体流,用一个滑动框来调节音量。
    任何Java媒体播放器都提供一个默认控制面板。为了显示播放器的默认控制面板,
需要通过调用getControlPanelComponent将它获取到,并将其加人到小应用程序的表现空间
或独立应用程序窗口中。如果想定义专用用户接口,则可以使用这些接口,标准控制面板
是通过它们实现的。
    播放器的控制面板构件常常与播放器和播放器的控制紧密相关。例如,控制面板直
接调用播放器来启动、停止播放器,或设置媒体时间。但是许多播放器具有另外一些可被
用户管理的属性。例如,视频播放器允许用户调节亮度和对比度,而亮度和对比度是不能
通过播放器接口管理的。为了处理这类控制,JMF定义了Control接口。
                                                                                                          13    一个媒体播放器可以有任意多个控制对象,这些对象定义了控制动作并具有相应的
用户接口构件。可以通过对该播放器调用getControls来获取这些控制。例如,可以通过
调用getControls来确定一个播放器是否支持CachingControl接口,如果它支持的话,则可获
取CachingControl。一个播放器支持何种控制依赖于播放器的具体实现。
Control(」controls二player.getControls();
    for(int i=0;i<controls.length; i++){
if(controls仁i] instanceof CachingControl)}
  cachingControl=(CachingControl) controls[i]:
    3.显示放大系数控制构件
    GainControl扩展了Control接口,以便提供一个调节音频放大系数的标准API。但必须
调用getGainControl才能获取该项控制;getControls并不返回播放器的GainCOntrol, Gain-
Control提供了调节音量的方法,如setLevel和setMute。类似于其他控制,GainControl与一
个GUI构件相关,该构件可以被加入到小应用程序的表现空间或独立应用程序窗口中。
    4.显示播放器的下载进度
    下载媒体数据是一个费时的过程。在用户等待数据下载的过程中,常常显示一个进
度棒,以提示用户下载正在进行以及还需多长时间。CachingControl接口是播放器支持的
一种特殊类型的控制,它能报告下载的进度。可以用该接口向用户显示一个下载进度棒
    可以通过调用getControls来判断播放器是否支持CachingControl接口。如果它支持该
接口,只要进度棒需要改变,播放器将报告一个CachingControlEvento假如实现了自己的进
度棒构件,就可以监听(listen for)该事件,只要一报告CachingControlEvent,就可以修改下载
进度。
    CachingControl还提供了一个默认的进度棒构件,其随着下载的进展而自动变化在
小应用程序中使用默认进度棒的方法如下:
    (1)实现ControllerListener接口,并在controllerUpdate中监听CachingControlEvent,
    (2)当第一次接收到CachingControlEvent时:
    ①对该事件调用getCachingControt,以便得到高速缓存控制(caching control) ;
    ②对CachingControl调用getprogressBar,以便获取默认进度棒构件;
    ③将进度棒构件加人到小应用程序的表现空间中。
    (3)每当接收到CachingControlEvent时,应检查下载是否完全。当getContentProgress与
getContentlength返回值相同时,删除进度棒。
1.4控制媒体播放器
时钟与播放器接口定义了启动和停止一个播放器的方法。
1.4.1启动播放器
可以通过调用start来启动播放器,这是一种典型的方法。start方法告诉播放器尽快
14开始表现媒体数据。如果必要的话,start通过执行实现和预取操作来为播放器启动做准
备。假如对一个处于Started状态的播放器调用start,唯一的结果就是在该方法调用的应
答中报告StartEvent o
    时钟定义了可用于同步的syncStart方法。关于如何同步播放器,请参阅1.7节。
    为了在媒体流中某一点启动播放器,过程如下:
    (1)通过调用setMediaTime来设置媒体流中想启动播放器的时间点;
    (2)对播放器调用start方法。
.4.2停止播放器
    播放器在以下4种情形中停止:
    ,对播放器调用stop方法;
      ?播放器已到定义的停止时间点;
    ?播放器已播放完媒体数据;
    。播放器接收数据太慢,以致于演播的效果不能接受。
    当一个非广播的播放器被停止时,其media time被冻结起来。如果一个处于Stopped
状态的播放器接着又被再次启动,media time从停止时刻恢复计时。当停止一个广播播放
器时,只是媒体数据的接收被停止了,而数据继续被广播。当再次启动一个广播播放器
时,演播将从目前时刻广播所在位置继续下去(可能跳过中间一段数据)。
    可以用stop方法立即停止播放器。如果对一个处于stopped状态的播放器调用stop
方法,唯一的结果就是在该方法调用的应答中报告StopByRequestEvent o
    也可以通过调用setStopTime来指出播放器应在何时停止。播放器在其media time经
过、top time时便停止。如果播放器的速度是正的,播放器将在其media time大于或等于
stop time时停止。如果播放器的速度是负的,则播放器将在其media ti。小于或等于stop
time时停止。如果播放器当前的media time已经超过了特定的media time,则它会立即停
止。
    例如,假设播放器的media time是5. 0, setStopTime将stop time设置为6.0。如果播放
器的速度是正的,media time不断增长,当media time大于或等于6.0时,播放器便会停止;
如果速度是负的,播放器反向播放并立即停止,因为media time已经超过了st叩time.(关
于播放器速度的详细信息,请参阅1.6.3小节“设置播放器的速度”。)
    可以对一个已停止的播放器调用setStopTime,但是,只能设置处于Started状态播放器
的stop time,如果其stop time目前尚未设置的话。如果播放器已经有了stop time,再调用
setStopTime将会产生错误。
    可以通过调用getStopTime来获取当前预定的stop time。如果时钟没有预定的,top
time, getStopTime将返回 Clock. UNSET。为了消除,top time,以便播放器能连续播放直到媒
体结束,只需调用,etStopTime(UNSET)即可。1.5管理播放器状态
    播放器状态之间的转换是由下面6个方法控制的:
        realize;
      prefetch ;
          starl;
        deallocate ;
          stop;
        close.
    通过控制这些方法的调用时机,就可以管理播放器的状态。例如,可以在实际启动播
放器之前,通过准备播放器启动将其启动延时(start一latency)降到最小。
    可以通过实现ControllerUstener接口来管理这些控制方法,以响应播放器状态的变
化。监听播放器的状态变换在其他情形下同样也是重要的。例如,直到播放器处于Real-
ized状态时,才能获取播放器的构件。通过监听RealizeCompleteEvent,只要播放器一处于
Realized状态,就可获取其构件。
1.5.1准备启动播放器
    大多数媒体播放器不能立即启动,在启动之前,必须满足一些硬件和软件条件。例
如,如果播放器从未启动过,则有必要为其存储媒体数据分配内存缓冲区。另外,如果媒
体数据驻留在一台网络设备上,播放器在下载数据之前要建立起网络连接。即使播放器
以前已被启动,缓冲区中也许存储有对当前媒体位置而言是无效的数据。
    1.实现和预取播放器
    JMF将准备播放器启动的过程分为两个阶段:实现(Realizing)和预取(Prefetching )。在
启动播放器之前实现和预取播放器,将把调用start时播放器用于准备表现媒体数据的时
间降到最低,并且帮助用户增长高度敏感的交互经验。通过实现ControllerUstener接t7 .
能够控制这些操作出现的时机。
    调用realize方法,将使播放器进入Realizing状态,并开始实现过程。调用prefetch方
法,将使播放器进人Prefetching状态,并且初始化预取过程。realize与prefetch方法是异步
的,并立即返回。播放器执行完所需要的操作后,报告一个RealizeCompleteEvent或
PrefetchCompleteEvento 1.1.4小节“播放器状态”描述了播放器在各个状态所执行的操作。
    处于Prefetched状态的播放器正准备启动,其启动延时再也不能降低了。然而,通过
setMediaTime设置media time将使播放器退回到Realized状态,增加其启动延时。
    请牢记,一个处于Prefetched状态的播放器占用了系统资源。由于一些资源,如声卡,
在某时刻只能被一个程序使用,因此,一旦该资源被占用,需要该资源的别的播放器就不
能启动。
    2.在播放器被实现之前一直胆塞
    可以对播放器调用的许多方法都要求播放器处于Realized状态。一条确保在调用这
      16些方法时播放器处于Realized状态的途径,就是实现这样一个方法:它调用realize,并且在
播放器报告RealizeCompleteEvent之前一直阻塞。
    注意:对realize阻塞将产生一些不令人满意的结果。例知,假知一个小应用程序在播
放器正实现时阻塞了,Applet. start与Applet. stop将不能中断该过程。
    你可以通过实现一个称作blockingRealize的方法来达到在播放器进入Realized状态之
前一直阻塞的目的,该方法对播放器调用realize,并在播放器报告一个RealizeComplete-
Event或在你的controllerUpdate方法被调用时返回。这就要求实现ControllerListene:接口,
并将其注册为播放器的一个监听器。如果将其注册为多个播放器的监听器,那么con-
trollerUpdate方法需要判断哪一个播放器报告了RealizeCompleteEvent。代码如下:
boolean realized = false;
public synchronized void blockingRealize()
myPlayer.realize();

⌨️ 快捷键说明

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