本文主要介绍JMF整体框架概念。
author: ZJ 06-11-14
Blog: [url]http://zhangjunhd.blog.51cto.com/[/url]
author: ZJ 06-11-14
Blog: [url]http://zhangjunhd.blog.51cto.com/[/url]
4.1播放器(Players)
播放器(Player)对一个媒体数据输入流进行处理,并实现时间上的精确播放。数据源(DataSource)将输入流传递到播放器。播放器将声音或(和)视频传递到相应的目标地(destination)。
图9为JMF播放器模型
播放器(Player)对一个媒体数据输入流进行处理,并实现时间上的精确播放。数据源(DataSource)将输入流传递到播放器。播放器将声音或(和)视频传递到相应的目标地(destination)。
图9为JMF播放器模型
播放器在处理和显示媒体数据过程中不提供任何控制。通过继承Clock和Controller类,播放器可支持标准的用户控制功能以及部分限制操作。
图10为JMF 播放器
图10为JMF 播放器
4.1.1播放器状态(Player States)
播放器对象有多种状态,JMF中定义了6 种状态。在正常情况下播放器对象需要经历每个状态,然后才能播放媒体数据。下面是对这些状态的说明:
(1)Unrealized:在这种状态下播放器对象已经被实例化,但是并不知道它需要播放的媒体的任何信息。
(2)Realizing:当调用realize方法时,播放器对象的状态从Unrealized转变为Realizing。 在这种状态下Player对象正在确定它需要占用资源。在此过程中,播放器取得的资源都是那些只需取得一次的资源,不是那些独占的资源。
(3)Realized:在这种状态下播放器对象已经确定了它需要的资源并且也知道要播放的媒体的类型(type)。
(4)Prefetching:当调用prefectch方法时,播放器对象的状态从Realized变为Prefetching 在该状态下的播放器对象正在为播放媒体做一些准备工作。其中包括加载媒体数据而需要获得的独占资源等。这个过程被称为预取Prefetch。
(5)Refetched:当播放器对象完成了预取操作后就到达了该状态。
(6)Started:当调用start方法后播放器对象就进入了该状态并开始播放媒体。
图11为播放器的状态转换图
播放器对象有多种状态,JMF中定义了6 种状态。在正常情况下播放器对象需要经历每个状态,然后才能播放媒体数据。下面是对这些状态的说明:
(1)Unrealized:在这种状态下播放器对象已经被实例化,但是并不知道它需要播放的媒体的任何信息。
(2)Realizing:当调用realize方法时,播放器对象的状态从Unrealized转变为Realizing。 在这种状态下Player对象正在确定它需要占用资源。在此过程中,播放器取得的资源都是那些只需取得一次的资源,不是那些独占的资源。
(3)Realized:在这种状态下播放器对象已经确定了它需要的资源并且也知道要播放的媒体的类型(type)。
(4)Prefetching:当调用prefectch方法时,播放器对象的状态从Realized变为Prefetching 在该状态下的播放器对象正在为播放媒体做一些准备工作。其中包括加载媒体数据而需要获得的独占资源等。这个过程被称为预取Prefetch。
(5)Refetched:当播放器对象完成了预取操作后就到达了该状态。
(6)Started:当调用start方法后播放器对象就进入了该状态并开始播放媒体。
图11为播放器的状态转换图
当一个播放器从一个状态转换到另一个状态时,它将给出TransitionEvents。通过ControllerListener接口,你的程序可以确定播放器在什么状态并作出相应的反应。
使用这种时间报告机制,你可以通过控制一个播放器对象的Realizing和Prefetching的开始点来管理它的缓冲时间(start latency)。同时,你也可以在调用播放器的方法前确定播放器是否在其适当的状态。
使用这种时间报告机制,你可以通过控制一个播放器对象的Realizing和Prefetching的开始点来管理它的缓冲时间(start latency)。同时,你也可以在调用播放器的方法前确定播放器是否在其适当的状态。
4.1.2每个状态下播放器对象可执行的方法
为了避免混乱情况,在一个播放器所有状态下,不是所有的方法都能被调用的。下表定义了JMF规定的限制。如果你在一个播放器对象的当前状态下,调用了一个非法的方法,播放器对象将抛出异常或错误。
为了避免混乱情况,在一个播放器所有状态下,不是所有的方法都能被调用的。下表定义了JMF规定的限制。如果你在一个播放器对象的当前状态下,调用了一个非法的方法,播放器对象将抛出异常或错误。
Method
|
Unrealized Player
|
Realized Player
|
Prefetched Player
|
Started Player
|
addController
|
NotRealizedError
|
legal
|
legal
|
ClockStartedError
|
deallocate
|
Legal
|
legal
|
legal
|
ClockStartedError
|
getControlPanelComponent
|
NotRealizedError
|
legal
|
legal
|
legal
|
getGainControl
|
NotRealizedError
|
legal
|
legal
|
legal
|
getStartLatency
|
NotRealizedError
|
legal
|
legal
|
legal
|
getTimeBase
|
NotRealizedError
|
legal
|
legal
|
legal
|
getVisualComponent
|
NotRealizedError
|
legal
|
legal
|
legal
|
mapToTimeBase
|
ClockStoppedException
|
ClockStoppedException
|
ClockStoppedException
|
legal
|
removeController
|
NotRealizedError
|
legal
|
legal
|
ClockStartedError
|
setMediaTime
|
NotRealizedError
|
legal
|
legal
|
legal
|
setRate
|
NotRealizedError
|
legal
|
legal
|
legal
|
setStopTime
|
NotRealizedError
|
legal
|
legal
|
StopTimeSetError if previously set |
setTimeBase
|
NotRealizedError
|
legal
|
legal
|
ClockStartedError
|
syncStart
|
NotPrefetchedError
|
NotPrefetchedError
|
legal
|
ClockStartedError
|
4.2处理器(Processors)
处理器(Processors)同样可以用来播放媒体数据。处理器是一种特殊的播放器,它可以对输入媒体流进行过程控制。处理器支持所有播放器拥有的播放控制功能。
除了将媒体数据传送至播放终端外,处理器可以将媒体数据输出至一个数据源(DataSource),此数据源可以作为其它的播放器或处理器的数据源,或是通过其它的处理器对其进行进一步操作控制,或将其传输到一个文件进行存储。
图12为处理器模型
处理器(Processors)同样可以用来播放媒体数据。处理器是一种特殊的播放器,它可以对输入媒体流进行过程控制。处理器支持所有播放器拥有的播放控制功能。
除了将媒体数据传送至播放终端外,处理器可以将媒体数据输出至一个数据源(DataSource),此数据源可以作为其它的播放器或处理器的数据源,或是通过其它的处理器对其进行进一步操作控制,或将其传输到一个文件进行存储。
图12为处理器模型
处理器对应的接口是Processor。在JMF API中Processor接口继承了Player接口。
图13 为JMF处理器
图13 为JMF处理器
如图12 所示,处理器对象除了支持播放器对象支持的所有功能外,还可以对输入的媒体数据流进行处理,并通过数据源向其他的播放器对象或处理器对象输出数据。
4.2.1处理器状态(Processor States)
如图13所示,除了在播放器中提到了的6种状态以外,处理器对象还包括两种新的状态。这两种状态是在Unrealized状态之后,在Realizing 状态之前。
(1)Configuring:当调用configure方法后,处理器对象进入该状态。在该状态下处理器对象连接到数据源并获取输入数据的格式信息。
(2)Configured:当完成数据源连接,获得输入数据格式的信息后,处理器对象就处于Configured状态。
图14为处理器的状态转换图
如图13所示,除了在播放器中提到了的6种状态以外,处理器对象还包括两种新的状态。这两种状态是在Unrealized状态之后,在Realizing 状态之前。
(1)Configuring:当调用configure方法后,处理器对象进入该状态。在该状态下处理器对象连接到数据源并获取输入数据的格式信息。
(2)Configured:当完成数据源连接,获得输入数据格式的信息后,处理器对象就处于Configured状态。
图14为处理器的状态转换图
4.2.2每个状态下控制器对象可执行的方法
Method
|
Unrealized Processor
|
Configuring Processor
|
Configured Processor
|
Realized Processor
|
addController
|
NotRealizedError
|
NotRealizedError
|
NotRealizedError
|
legal
|
deallocate
|
legal
|
legal
|
legal
|
legal
|
getControlPanelComponent
|
NotRealizedError
|
NotRealizedError
|
NotRealizedError
|
legal
|
getControls
|
legal
|
legal
|
legal
|
legal
|
getDataOutput
|
NotRealizedError
|
NotRealizedError
|
NotRealizedError
|
legal
|
getGainControl
|
NotRealizedError
|
NotRealizedError
|
NotRealizedError
|
legal
|
getOutputContentDescriptor
|
NotConfiguredError
|
NotConfiguredError
|
legal
|
legal
|
getStartLatency
|
NotRealizedError
|
NotRealizedError
|
NotRealizedError
|
legal
|
getSupportedContent- Descriptors |
legal
|
legal
|
legal
|
legal
|
getTimeBase
|
NotRealizedError
|
NotRealizedError
|
NotRealizedError
|
legal
|
getTrackControls
|
NotConfiguredError
|
NotConfiguredError
|
legal
|
FormatChange- Exception |
getVisualComponent
|
NotRealizedError
|
NotRealizedError
|
NotRealizedError
|
legal
|
mapToTimeBase
|
ClockStoppedException
|
ClockStoppedException
|
ClockStoppedException
|
ClockStopped- Exception |
realize
|
legal
|
legal
|
legal
|
legal
|
removeController
|
NotRealizedError
|
NotRealizedError
|
NotRealizedError
|
legal
|
setOutputContentDescriptor
|
NotConfiguredError
|
NotConfiguredError
|
legal
|
FormatChange- Exception |
setMediaTime
|
NotRealizedError
|
NotRealizedError
|
NotRealizedError
|
legal
|
setRate
|
NotRealizedError
|
NotRealizedError
|
NotRealizedError
|
legal
|
setStopTime
|
NotRealizedError
|
NotRealizedError
|
NotRealizedError
|
legal
|
setTimeBase
|
NotRealizedError
|
NotRealizedError
|
NotRealizedError
|
legal
|
syncStart
|
NotPrefetchedError
|
NotPrefetchedError
|
NotPrefetchedError
|
NotPrefetchedError
|
4.3 Controller 事件
Controller(播放器或控制器)注册的ControllerEvents被分为三类:改变通知(change notifications),关闭事件(closed events),状态转变事件(transtion events):
(1)改变通知事件如RateChangeEvent,DurationUpdateEvent,FormatChangeEvent表明一些Controller的属性的改变。
(2)状态转变事件可以使你的程序对Controller对象的状态转变作出反应。
(3)当Controller关闭时,它将注册关闭事件。
图15 为JMF Controller事件
Controller(播放器或控制器)注册的ControllerEvents被分为三类:改变通知(change notifications),关闭事件(closed events),状态转变事件(transtion events):
(1)改变通知事件如RateChangeEvent,DurationUpdateEvent,FormatChangeEvent表明一些Controller的属性的改变。
(2)状态转变事件可以使你的程序对Controller对象的状态转变作出反应。
(3)当Controller关闭时,它将注册关闭事件。
图15 为JMF Controller事件
5.媒体处理者结构(MediaHandler Construction)
播放器(Players),处理器(Processors),数据池(DataSinks)都是媒体处理者的一种,它们都从数据源(DataSource)中读取数据。每个媒体处理者都是为专为一个数据源创建的。
图16为JMF的媒体处理者结构
播放器(Players),处理器(Processors),数据池(DataSinks)都是媒体处理者的一种,它们都从数据源(DataSource)中读取数据。每个媒体处理者都是为专为一个数据源创建的。
图16为JMF的媒体处理者结构
6.参考资料
JMF2.0 API Guide
JMF2.0 API Guide
JMF介绍之媒体框架一