JavaFX 在 Ubuntu 上的一个 bug ,万恶的向前不兼容

by

最近在写一些多媒体相关的代码,当了一回 API 拼接工程师,然后踩了不少坑,现在又有了写博客的欲望。

首先来说说这个 OpenJDK 的 bug ,这只是我最近踩坑的一个很小的插曲。

发现问题

这是一个多媒体相关的 bug ,在使用 JavaFX 的 MediaPlayer 播放 mp3 格式的音频和 mp4 格式的视频时出现的。

JavaFX 抛出 com.sun.media.jfxmedia.MediaException 异常,然后又说些什么

Could not create player!

引得 StackOverflow 上的人哄堂大笑。还有人尝试强行解决 ,但他并没有意识到这其实是天灾而不是人祸。

解决方法

方法一

使用我的私货。

即,不使用 JavaFX 的 Media ,而是使用 FriceEngine 提供的 org.frice.utils.media.AudioManager 类, 里面的方法看名字你就会用了。

方法二

使用其他格式的媒体文件。

比如 wav ,就是正常支持的。

方法三

让你的程序不在 Ubuntu 16.04 下调用这个代码。

方法四

也是最有效的方法,就是使用 OpenJDK 9 ,也就是 Java 9 。
这个 bug 早就被发现了,只不过它是在 Java 9 的库里被修复的。

bug 出现的原因

是因为 JavaFX 的 MediaPlayer 在 Linux 上的实现实际上是调用了一个叫 libav 的东西。

这个东西很罪恶,它的版本从 53 到 56 是不兼容的,也就是不向下兼容。
Ubuntu 已经默认让用户更新到 56 ,而 OpenJDK 却还调用着 53 的 API ,场面一度十分尴尬。

这证明了向下兼容的重要性,以及及时修复的重要性。

参考

补充一个推荐

夜雀聚聚写了一篇关于 Kotlin 的坑的博客, 我看了感觉非常有收获,都是些我不知道的坑。

推荐一波。


Tweet this
Top


创建一个 issue 以申请评论
Create an issue to apply for commentary


协议/License

本作品 JavaFX 在 Ubuntu 上的一个 bug ,万恶的向前不兼容 采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可,基于 http://ice1000.org/2017/12/07/JavaFxBugOnUbuntu/ 上的作品创作。
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.
知识共享许可协议