Java多媒体框架设计自动播放机实例详解
2008-02-23 08:17:13来源:互联网 阅读 ()
如果把Java媒体框架(http://java.sun.com/jmf)看作客户端安装的媒体播放机的话,那么这种框架并不是非常激动人心。它只支持少量媒体类型,并且事实上这些媒体类型都被象Windows媒体播放机以及QuickTime等其它的应用程序支持。
但是从内容供应商的观点来看,下面这个事实更加有意义:JMF在所有的Java类型中都可用,这使在客户端上不必要有任何特定的媒体技术就可以部署媒体--所需要的只是J2SE 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的帮助文件,但是各种定制屏幕很容易设计出来:
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
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash