java媒体处理解决方案之FMJ
首先声明,本人不看好这种方式,于是没有深入研究。
FMJ项目入口为:net.sf.fmj.ui.FmjStudio。main如下:
1 | System.setProperty("java.util.logging.config.file", "logging.properties"); |
之所以不想仔细看代码,一个重要的原因就是FMJ的代码很大一部分和JMF的一样,但是个别却又不太,于是看来看去我实在是不知道我看的代码到底是JMF还是FMJ的。因为包名和类名都一样,实在是分不清楚。
看一下界面的布局就可以理解,核心是类net.sf.fmj.ui.application.PlayerPanel,它包括工具栏,播放器的屏幕、进度条等。如果按照C#之类的语言去理解的话,这就是一个控件,用的时候拖过去即可。然后根据不同的需要调用这个组件的方法等。这里不多说,有兴趣去官方下代码跑一下即可。
我要说的另一个重要的项目是fobs4jmf。我是由衷的敬佩这个项目,这个才是牛叉的解决方案。它直接扩展JMF。使用C++的方式调用自己的解码器,以兼容FFMPEG。具体兼容那些格式没有进行完整的测试,记得当时测试mkv等比较常用的格式是没有问题的。项目官方http://fobs.sourceforge.net/。具体使用方法很简单,主要是换机器后代码找不到了于是就不多说,这个项目是加强JMF的,于是你可以在不修改已有的JMF代码的情况下是JMF获得额外的加强。值得一提的是通过FMJ的运行科看出FMJ实际上已经将fobs4jmf纳入其中,当然也包括FFMPEG了。
接下来是泼冷水时间:就像用JMF做播放器那样毫无意义一样(原因很简单,JMF已经是古董了,谁会用一个仅仅播放几种媒体格式的播放器呢,且其中还有各种不稳定)。于是之前FMJ为什么可以播放rmvb,而先无法播放呢?原因很简单,系统,即windows media player没有这些解码器支持,fobs4jmf的一个很牛叉的地方就是它可以调用到系统已经安装的解码器,于是仅仅靠其自己提供的解码功能实际上是意义不大。
另外一个方面:稳定性,个人觉得在以上提及的东西稳定性比较差,当然你自己用自然没问题,但是你如果用到实际项目中,必定会付出较大的代价来维护。特别是用在java项目中,于是顺便吐槽一下java的虚拟机,java虚拟机在调用本地代码是很容易出现崩溃现象,特别是这种解码类的操作,jvm挂掉的可能性非常大,挂掉却报dll里面出错,如果知道dll出什么错还用java做什么。
也许sun也觉得jmf这种东西再维护下去也不会有好结果,再桌面应用,各类播放器已经非常完善了,网络上所以flash为代表的流媒体技术已经处于统治地位,flash虽说现在地位不可动摇,但是其中的缺陷也是有的,比如在firefox下面flash的插件就经常出现崩溃的现象(当然,这不排除是我在搞一些小动作的原因。但是说flash存在漏洞也不是一个人两个人了)。
恩,好了,不知不觉协议这些莫名其妙的东西出来,接下来我会说一下我个人认为的可行性最高的解决方法,且经过测试效果很不错。