首先声明,本人不看好这种方式,于是没有深入研究。

FMJ项目入口为:net.sf.fmj.ui.FmjStudio。main如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
System.setProperty("java.util.logging.config.file", "logging.properties");
LogManager.getLogManager().readConfiguration();

if (!ClasspathChecker.checkAndWarn()){
// JMF is ahead of us in the classpath. Let's do some things to make this go more smoothly.
logger.info("Enabling JMF logging");
if (!JmfUtility.enableLogging())
logger.warning("Failed to enable JMF logging");

// Let's register our own prefixes, etc, since they won't generally be if JMF is in charge.
logger.info("Registering FMJ prefixes and plugins with JMF");
RegistryDefaults.registerAll(RegistryDefaults.FMJ);
//RegistryDefaults.unRegisterAll(RegistryDefaults.JMF);
// TODO: this can be used to make some things that work in FMJ but not in JMF, work, like streaming mp3/ogg.
// TODO: what about the removal of some/reordering?
}


// see http://developer.apple.com/technotes/tn/tn2031.html
// see http://java.sun.com/developer/technicalArticles/JavaLP/JavaToMac/
// It doesn't seem to work to set these in code, they have to be set by the calling environment
if (OSUtils.isMacOSX()) {
System.setProperty("com.apple.mrj.application.apple.menu.about.name", "FMJ Studio");
//System.setProperty("com.apple.mrj.application.growbox.intrudes", "false"); // doesn't seem to work
}

//
FmjStudio main = new FmjStudio();
main.run(args);

之所以不想仔细看代码,一个重要的原因就是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存在漏洞也不是一个人两个人了)。

恩,好了,不知不觉协议这些莫名其妙的东西出来,接下来我会说一下我个人认为的可行性最高的解决方法,且经过测试效果很不错。