|
在第一部分内容中,我描述了怎样借助Java 媒体框架(JMF)的帮助实现在一个Java 3D场景中播放动画片断。其实现主要使用了模型-视图-控制器设计模式: ? 动画屏幕是视图元素,由JMFMovieScreen类描述。 ? 动画是模型部分,由JMFSnapper类所管理。 ? 一个Java 3D Behavior类TimeBehavior是控制器,由它完成从动画中的周期性帧检索,然后在屏幕上画出。 在这篇文章中,我将revisit该动画组件,用 QuickTime for Java (QTJ)来重新实现之。QTJ在QuickTime API之上提供了一个面向对象的Java 层,使之有可能实现播放,编辑和创建QuickTime 动画;捕获音频与视频;执行2D和3D动画。QuickTime在Mac 和Windows上平台都可以使用。关于QTJ的安装,文档和举例的细节信息请参见developer.apple.com/quicktime/qtjava。 由QTJ 来取代JMF 设计模式的结果对应用程序影响很小-只有动画类JMFSnapper分离出来,由QuickTime for Java版本的QTSnapper所代替。 图 1展示了QTJ 版本的Movie3D应用程序中的两幅屏幕快照,其中右边的那幅是屏幕从后面看上去的视图。
如果快点回顾一下第一部分中的图1,你会发现基于QTJ的应用程序和JMF 版本的实现没有太明显的区别。 但是,如果细致比较一下这两处执行程序会发现有两个变化:QTJ版本的动画像素化pixelation 更明显,且播放速度更慢些。像素化的出现是由于原始的动画被从MPEG 格式翻译成QuickTime的MOV格式所致,可以借助于一个更好的转换工具来实现修补。速度问题更为根本性:它与QTSnapper的基本实现有关。 该文中主要涉及到: ?讨论QTSnapper实现中的两种主要方法。一种方法是把动画的每一帧都着色到屏幕上去,另一种方法是基于当前时间选择一帧。 后一种方法意味着,可以跳过一些帧,使得动画颤动一点,但是却使动画播放速度加快。 ?介绍几种简单的帧/秒(FPS)计算方法,我将用之来判断不同实现方式的相对速度的不同,并用来检测跳过的帧。 我不会再细致地介绍动画屏幕和动画更新行为,因为这些与第一部分中是一致的。 下面我将详细介绍的是我应用在QTSnapper中的用于从动画中提取帧的QTJ技术。 1. 程序实现中的两幅轮廓图 下面的图2描述了该应用程序中的场景图。
该图几乎和第一部分中的一模一样。 QuickTime动画由QTSnapper类负责装载。动画屏幕由QTMovieScreen创建,它管理一个放置在跳棋盘地板上的Java 3D四边形。每隔40毫秒,TimeBehavior 对象调用QTMovieScreen中的nextFrame()方法一次,该方法调用中QTSnapper 的getFrame()方法来取得动画中的一帧,该帧最后被放置到由QTMovieScreen管理的四边形上。 JMFSnapper和QTSnapper之间有一个重要的不同。JMFSnapper返回当前正播放动画的当前帧,而QTSnapper依赖于一个递增的索引值返回动画中的当前帧。 例如,当getFrame()在JMFSnapper中被反复调用时,它可以检索帧1,3,6,9,11,等等,具体依赖于调用的方法和动画的播放速度。当在QTSnapper中调用getFrame()时,它将返回帧1,2,3,4,等等。 下面的图3描述了该应用程序的UML类图,其中仅显示了类的公共方法。
除了动画屏幕QTMovieScreen类和动画QTSnapper类名字的区别外,这里的应用程序类继承图与第一部分中的没有区别。事实上,只有Snapper类的内部实现变更了一些。 把应用程序从JMF Movie3D版本迁移到QTJ版本要求代替Snapper类。另外,还需要把动画屏幕类中的两行代码改变一下,其中声明了Snapper 类并被实例化:
这两处变化是把JMFMovieScreen 改名为QTMovieScreen的唯一原因。 所有该示例的代码以及本文的一个早期版本,都能在KGPJ Website处找到。 2. 一部帧到帧Frame-By-Frame 的动画 理解了QTSnapper的内部工作机理,有助于对QuickTime动画的结构有一个基本了解。每个动画可能由多个音频和视频轨道合成,而在时间上相重叠。下图4展示了这种基本思想。
每个轨道管理自己的数据,如它包含的媒体的类型和媒体本身。该媒体容器具有它自己的数据结构,包括持续时间和播放速率(也就是,每秒要显示多少个样本)。这里的媒体实际上是一系列的样本(或者帧),第一个样本从时间0开始(with respect to media time)。样本被索引化了,如第一个样本在位置1处(而不是0)。 简化后的QuickTime轨道和媒体结构如下图5所示。
要想更全面的了解,请参考QuickTime教程的动画部分。 |
欢迎访问米鼠网:http://fac.misuland.com





