快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门24小时0524_龟发之家论坛



用Java多媒体框架设计自动播放机

假如把Java媒体框架(http://java.s澳门24小时0524un.com/jmf)看作客户端安装的媒体播放机的话,那么这种框架并不是异常冲感民心。它只支持少量媒体类型,并且事实上这些媒体类型都被象Windows媒体播放机以及QuickTime等其它的利用法度榜样支持。

然则从内容供应商的不雅点来看,下面这个事实加倍故澳门24小时0524意义:JMF在所有的Java类型中都可用,这使在客户端上不需要有任何特定的媒体技巧就可以支配媒体--所必要的只是J2S

E Java运行光阴。

更紧张的是它能使用.jar文件款式的一些机能把解码器和媒体组成到一个文件中,创建一个"自我播放片子",应用了象WinZip和StuffIt这样的压缩利用法度榜样大年夜致相同的要领来创建自我展开文档。

我们把此分为三个阶段:

1.使JMF能够播放.jar文件中的媒体。

2.只应用必要播放本地媒体所需的JMF的一部分创建一个轻量级.jar文件。

3.将代码和媒体放入.jar文件,并且创建一个相宜的manifest文档以使它可以双击。

基础的JMF播放的关键是得到Player,能解码和衬着你的媒体。一样平常来说,这经由过程应用Manager得到相宜的DataSource来完成,在一个播放实例中供给了媒体流和流元数据,例如媒体款式。Manager然后找到一个Player来处置惩罚DataSource。在两种环境下,Manager结合一个带有法度榜样包前缀列表(象javax.media、com.ibm.media等等)的反射规划来试图探求相宜的类,例如假如一个计划的播放法度榜样不能吸收供给给它的DataSource,那么它就会抛出非常。

Manager没有太多事要做,只是不雅察一下URL中的协讲和文件扩展名,以是虽然它可以很轻易的知道若何处置惩罚file:///Users/cadamson/mymp3stash/some.mp3,然则它不知道若何处置惩罚象jar:file:/Users/cadamson/dev/jmftests/spmovie-old/src/gatsbymovie.jar!/movie/themovie.mov这样的URL。

为了缓和这种环境,我们可以写一个DataSource,说得更准确一点便是一个PullDataSource,担任为Manager描述细节的责任。JarEntryDataSource中没有一个措施分外难;我们供给的PullSourceStream还必要实现几个超级接口。

它有些不敷完美,然则这个类寄托文件扩展名来返回"内容类型"。这多若干少有点象一个MIME类型,除了应用句号代替斜线符号来款式化以外,以是它可被用于法度榜样包名称(例如video/mpeg MIME类型变成video.mpeg,以是Manager可以找到com.sun.media.codec.video.mpeg包)。下面是我们的简单的实现:

public String getContentType() {

try {

URL url = getLocator().getURL();

String urlFile = url.getFile();

if (urlFile.endsWith(".mov"))

return "video.quicktime";

else if (urlFile.endsWith(".mpg"))

return "video.mpeg";

else if (urlFile.endsWith(".avi"))

// Manager needs ´_´ insted of ´-´

return "video.x_msvideo";

else

return "unknown";

} catch (MalformedURLException murle) {

return "unknown";

}

}

另一个烦恼是JMF源代码注解假如供给的流是Seekable的话(这是一个供给随机存取seek()措施的接口),默认Player只能播放一个QuickTime DataSource。假如探求点在流的异常上流的地方,那么JarEntryDataSource中的策略是应用InputStream.skip()。假如探求点在当前读取点之后(调用tellPoint,由于它的值经由过程Seekable.tell ()措施返回),然后它必须关闭InputStream,再从新打开,跳到探求点。它应用一个内部的thoroughSkip()措施来确定我们实际上停在哪里。

public long seek (long position) {

try {

if (position > tellPoint) {

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的赞助文件,然则各类定澳门24小时0524制屏幕很轻易设计出来:

1.媒体源和媒体汇点:选择"媒体文澳门24小时0524件"和"播放"。

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.澳门24小时0524spmovie.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虚拟机而不是媒体播放机。然则我们这种"一次编辑,到处播放"的思惟是完全相符Java的本来的目的的。

您可能还会对下面的文章感兴趣: