3

我在寻找基于 Java 的视频播放器,不,我不需要它。只是看看那里是否有以及有多少 Java 视频播放器。令我大吃一惊的是,我什么也没找到。至少没有任何流行的,例如VLC,WMP等。我认为这些玩家有一些 Java 替代品。

显然,我发现很多说法是 Java 对玩家来说太慢了。从我读到的内容可以分为两个子问题:

首先,人们写到 Java 对视频解码太慢了。但是自从我开始使用Java以来​​,我一直认为它的速度实际上还不错。我发现许多基准测试在热 JVM 的表现几乎与 C++ 编写的程序一样好。喜欢真的很好。我认为这是因为那些基准算法很小且重复,所以 JVM 准备了编译的代码,并且从那里它很快。也许在更大的程序中,由于动态编译,它实际上会慢得多。我真的不知道。但是由于 Java 是由 JVM 编译成本机代码的,所以真正与速度有关的是多少代码以及它预编译的速度,对吧?当然还有其他区别,但最大的区别是实际编译。

其次,人们写道他们有用 C++ 编写的视频解码器,并通过 JNI 获取图片数据。但是他们说 Java 太慢了,甚至无法绘制那些 30 FPS 甚至 HD Ready 图像。但为什么?我一直认为 JVM 使用最快的方法在操作系统中获取它的窗口,而不是在内部操作它的内容。如果我在 JVM 被“加热”时认为 Java 足够快(意味着类似 C++),那么显示图像的问题在哪里?在这种情况下,JVM 所要做的就是将数组写入操作系统特定的显示输出,对吧?

那么,Java 真的很慢,还是我错过了什么?是否有可能用纯 Java 编写全速(或几乎全速)视频播放器?如果不是,为什么?谢谢。

4

2 回答 2

4

第三次谷歌点击“视频播放 java”似乎相关: http ://blog.pirelenito.org/2008/08/java-movie-playback-jogl-fobs4jmf/

我对该主题不够熟悉,无法给出明确的答案,但我可以扩展您提出的某些观点:

但是由于 Java 是由 JVM 编译成本机代码的,所以真正与速度有关的是多少代码以及它预编译的速度,对吧?当然还有其他区别,但最大的区别是实际编译。

有几点我不会立即驳回。一方面,Java 规范要求在每次访问数组元素之前,运行时必须检查索引是否有效,即0 <= index && index < array.length. 我想视频解码将大量使用数组,因此 Java 数组可能不是最适合该任务的。

但是他们说 Java 太慢了,甚至无法绘制那些 30 FPS 甚至 HD Ready 图像。但为什么?我一直认为 JVM 使用最快的方法在操作系统中获取它的窗口,而不是在内部操作它的内容。如果我在 JVM 被“加热”时认为 Java 足够快(意味着类似 C++),那么显示图像的问题在哪里?在这种情况下,JVM 所要做的就是将数组写入操作系统特定的显示输出,对吧?

咳...我不会调用 Java 2D API 高效的默认渲染器。至少在我的计算机上,通过 JOGL 直接调用 Open GL 比使用 JDK 提供的 API 效率高很多(大约是 10 倍)。我怀疑工作中软件和硬件渲染之间的差异......但这主要不是语言的错误,而是它的标准库。无论编程语言如何,没有人会在没有硬件加速的情况下制作高性能图形。

此外,渲染通常不仅仅是复制数组,例如缩放、颜色空间转换和缓冲(以避免撕裂)。

Bottom line: I think it is possible to do video playback in Java, but it will most likely require to use a native library to access hardware acceleration, and probably be somewhat less efficient than a pure native solution.

于 2011-06-19T22:46:04.080 回答
1

已经创建了特殊用途的视频播放器,请参阅http://groups.csail.mit.edu/graphics/pubs/spie3528-26.pdf以获取一些较旧的出版物。

通用库并未广泛使用,因为当前硬件支持视频编码/解码。在大多数情况下,JIT 不使用这些扩展。

出于许多目的,仍然编写了手工制作的汇编代码。当前编译器无法建立此任务,因此 JIT 也无法建立。一些图形硬件也能够加速解码。这对 JIT 也是不可用的(至少在其当前实现中)。因此,与高度优化的代码相比,使用 java 进行视频解码要慢得多(一些视频播放器为不同的 CPU 提供相同代码的不同版本)。

这些详细说明是针对 i386 平台进行的。对于在硬件中运行 java 的平台(例如嵌入式系统),它们可能不再有效。

于 2011-06-19T22:37:18.860 回答