Java多媒体框架设计自动播放机实例详解

2016-02-19 19:30 3 1 收藏

今天给大家分享的是由图老师小编精心为您推荐的Java多媒体框架设计自动播放机实例详解,喜欢的朋友可以分享一下,也算是给小编一份支持,大家都不容易啊!

【 tulaoshi.com - 编程语言 】

  假如把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

  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虚拟机而不是媒体播放机。但是我们这种"一次编辑,到处播放"的思想是完全符合Java的原先的目的的。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

来源:http://www.tulaoshi.com/n/20160219/1621185.html

延伸阅读
标签: 电脑入门
用PowerPoint播放演示文稿在日常办公培训和中小型会议中已被广泛地应用,本人在使用过程中积累了一些经验和技巧,希望能对初涉该软件的读者们有所帮助。 有时我们需要连续播放几个不同的幻灯片文件,如果一个一个地用PowerPoint打开 播放,费时费力。这时我们可以尝试用PowerPoint播放器来实现,PowerPoint播放器的主程序文件名为 Ppview32....
标签: 办公软件
为了能更好地展示演示效果,许多人已经不满足在幻灯片中插入精彩的图象了,他们现在又将精力瞄准在了很时尚的动画以及动感十足的多媒体视频上了。为了能更好地帮助大家合理地在幻灯片中插入和播放动画和多媒体视频文件,本文特向大家介绍PowerPoint XP处理动画和视频方面的几则应用技巧: 一、实现字幕上下移动动画 相信大家一...
1.引言 银行的数字化监视监控系统是目前比较有市场及应用前景的开发项目,基于不同的MPEG采集卡与硬件外围设备开发的监视监控系统在国内外都有比较成型的技术。为了满足实时监视、实时采集压缩、随时回放、压缩数据流的传播等具体要求,在该系统中使用了一种用于网络视频/音频多点传输(视频广播)的视频数据采集卡,提供AVI(MPEGIFrame压...
标签: 电脑入门
前我跟大家提及了windows 7的上帝模式-GodMode,Windows Vista和7超级控制中心。在本教程中,您使用到GodMode控制台来执行这个简单的任务。这个教程可以实现以下目的:停止自动播放的USB 阻止自动播放dvd 禁用自动播放器 阻止自动播放窗口 关闭alll媒体及设备自动播放 进入上帝模式,启动方法请参考:开启windows 7的God Mode(上帝模...
标签: 电脑入门
1、进入系统桌面后,把鼠标移到屏幕最右下角,出现如下图所示界面: 2、把鼠标移动到齿轮图标上,齿轮变成设置字样,点击设置按钮; 3、出现下图所示界面,点击控制面板选项; 4、进入控制面板后,把右上角的查看方式更改为大图标; 5、找到自动播放选项,并点击; 6、在自动播放窗口中,只要取消为所有媒体和设备使用自动播放的...

经验教程

146

收藏

5
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部