llPoint) {
thoroughSkip (position - tellPoint);
} else {
close();
open();
thoroughSkip (position);
}
return tellPoint;
} catch (IOException ioe) {
return 0; // bogus
}
}
使用这个类,Manager可以找到一个可用的Player用于播放.jar文件中的.mov或者.avi文件。我们的示例的TinyPlayer使用ClassLoader.getResource ()方法来在类路径中寻找movie/themovie.mov或者movie/themovie.avi。当类路径只包含.jar文件的时候,我们将对其进行设置。
准备一个合适的.jar文件中的第一步是使用JMF的jmfcustomizer工具来创建一个jar,只使用播放我们的媒体所需要类,去掉用于流、捕捉、译码和其它对于一个简化的播放
程序不需要的函数。不幸的是,Sun在各种Java版本的JMF中都不包含jmfcustomizer的帮助文件,但是各种定制屏幕很容易设计出来:
1.媒体源和媒体汇点:选择"媒体文件"和"播放"。
2.协议:只是"文件"。
3.源媒体格式:"QuickTime (.mov)"和"Avi"。
4.解码器:无论你计划在你的媒体中使用什么解码器,但是用于音频的大部分都是"A - law"、"U - law"或"IMA4",用于视频的是"H263"。不要为编码器、封包器和解包器而费心。
5.渲染:在音频中,我们需要"JavaSound"用于Java 1.3及1.3以上的版本,SunAudio用于Sun的pre-1.3 JVM。对于视频,我们只需要AWT。
其结果是本来用于我们的播放器的jar被从1.9 MB压缩到700K。
假定你已经编译了两个com.mac.invalidname.spmovie类,把它们添加到定制的jar中:
jar uf customized.jar com/mac/invalidname/spmovie/*.class
JMF的许可证有效期需要它的readme文件使用任何JMF或者定制子集来分布。我已经在misc目录中提供了,在TinyPlayer的菜单项可以找到它:
jar uf customized.jar misc/
为了使这个.jar文件可双击,我们提供一个manifest文件告诉Java运行时间在.jar文件中的哪个类中有在双击或者使用简单jar命令行变量的时候调用的main()方法。manifest还提供一个只包含jar自己的类路径:
Main-Class: com.mac.invalidname.spmovie.TinyPlayer
Class-Path: .
这个manifest使用下面的命令来添加:
jar ufm customized.jar manifest-stub.txt
这个文件现在有用于播放jar中的一个电影的所有的代码。为了将来之用,请把它保存为spmovie-engine.jar文件,或者类似的文件。
现在引擎已经具备了,我们所需要的只有媒体了。正如你可从JMF支持类型页面看到的那样,所有Java版本的JMF有一个相当有限的所支持解码器的集合。对于视频来说最好的选择可能是H.263,在很广泛的比特率下能够工作的很好,然而它可能在老机器上会执行得很困难,除非你压缩视频或者保持较低的帧速率。虽然音频较少是事先准备好的,但是我想IMA 4:1执行得相当好。适当地编码或者译码你的媒体,并且把它复制为movie/themovie.mov或者movie/themovie.avi。如果你喜欢你也可以把.jar文件改名(我使用spmovie.jar)并且添加媒体:
jar u0f spmovie.jar media/
注意这里的"0"是数字零,而不是字母O;这表明我们不想压缩这个输入项,因为我们的媒体已经被压缩了。
千辛万苦,我们的自我播放电影终于做成了,这个文件知道在双击的时候运行什么类,提供了多路解编、解码和渲染一部电影所需的所有的代码,以及电影本身。如果你想看看这种小型自我播放电影,你可以去看看。
它扩展了小应用
程序的概念,允许媒体在任何可用于Java的浏览器中播放。
说白了,它是一个Java虚拟机而不是媒体播放机