Java跨平台优势与性能挑战:为何视频播放器开发更倾向于C/C++
前言

跳过胡说八道,阅读主要文本
爪哇由于其跨平台的优势而被困在那一年。当时,我想:“写一次并在任何地方运行。”这听起来很棒,这应该是所有语言发展的最终方法,而Java将不可避免地占据世界。
但是,事实证明我当时还太年轻。
俗话说,你不能同时拥有鱼和熊的爪子。如果您想享受跨平台带来的便利,则不可避免地必须接受绩效缺点。实际上,Java一直致力于改善虚拟机(JIT和其他技术)的性能,但是当面对实时计算性能的高要求或涉及使用硬件优化的任务(视频的硬件编码和解码)时,IT仍然很远。不如C或C ++好。因此,很少见到任何人在Java中写这种软件。
回到主题,如果您想编写视频播放器,则必须处理不同的视频格式(MP4,AVI,RMVB,FLV等)。每种格式的视频必须具有相应的解码器要播放。绝大多数解码器库都是基于有效的C或C ++编写的,很少有在Java编写解码器的库。
因此,如果您想在Java中编写视频播放器,则只有以下两个选项:
•用纯Java编写,以主流视频格式编写自己的软件解码器,并将其与Java Media Framework(JMF)结合使用以完成视频解码任务。
•使用JNI调用现有的C或C ++解码器库来完成视频解码任务
使用Java独自编写软件解码器的优点是,它可以真正实现跨平台,并且也可以轻松,灵活地与摇摆框架结合使用。但是,缺点是它太麻烦了。更不用说软件解码器的效率了,是否可以成功地重建各种主流视频格式的解码器的车轮是否值得讨论。
因此,我采用了第二种方法,使用JNI调用现有的第三方视频解码库来完成视频解码任务,并将视频显示和控制逻辑移交给Java。这使一个更有效的视频播放器。值得一提的是,尽管根据平台类型调用不同的平台也可以实现跨平台,但它将受到许多限制,这是不可避免的。
接下来,让我们看一下如何实现视频播放器。
文本
选择解码器
有许多视频格式和许多解码器,因此单独找到相应的解码器并将其包装到JNI接口进行调用是一项繁琐的任务。因此,我们可以找到已经封装多个主流解码器(视频)的媒体处理框架。玩家的库用于直接调用它。 VLC是一个很好的选择。
VLC Media Player VLC是一个免费的开源跨平台多媒体播放器和框架,可以播放大多数多媒体文件,以及DVD,音频CD,VCD和各种流媒体协议。
在VLC库中,我们需要使用JN以某种方式将其封装,以便Java可以用来调用视频解码和播放控制界面。幸运的是,我们不必重建车轮。 VLCJ是由Java外国开发人员开发的媒体处理框架。基础层使用VLC播放器,该播放器通过JNI调用VLC完成了音频解码任务。
发展过程
•安装VLC Media Player(我安装的版本是2.2.4,最好将其安装在默认目录中)
•创建一个普通的Maven项目并添加VLCJ依赖项
uk.co.caprica vlcj 3.10.1
•正式发展
接下来是代码信息,我们将介绍三个项目,所有项目均基于此VLCJ视频播放器。
入门示例
这是VLCJ作者提供的示例程序,当然可以快速实现一个简单的视频播放器,只是播放,并且不提供控制功能。
此处使用了VLCJ中提供的嵌入式视频播放组件嵌入式嵌入式播放器。该视频可以直接通过Mediaplayer的Playmedia方法播放,并且该视频将在嵌入式MediaDiaPlayerComponent上呈现。 EmbeddedMediaPlayerComponent提供了许多其他功能。要实现普通的视频播放器,足以理解该组件。
代码
package tutorial;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.discovery.NativeDiscovery;
public class Tutorial {
private final JFrame frame;
private final EmbeddedMediaPlayerComponent mediaPlayerComponent;
public static void main(final String[] args) {
new NativeDiscovery().discover();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Tutorial(args);
}
});
}
public Tutorial(String[] args) {
frame = new JFrame("My First Media Player");
frame.setBounds(100, 100, 600, 400);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
mediaPlayerComponent.release();
System.exit(0);
}
});
mediaPlayerComponent = new EmbeddedMediaPlayerComponent();
frame.setContentPane(mediaPlayerComponent);
frame.setVisible(true);
mediaPlayerComponent.getMediaPlayer().playMedia(args[0]);
}
}
vlcj-player
这是由VLCJ作者本人基于VLCJ撰写的开源播放器。它具有全面的功能,可以用作普通视频播放器。由于该项目有很多内容,因此列出代码是不便的。
有关详细信息,请参见项目地址
Javaplayer
这是我基于VLCJ编写的简单视频播放器,该播放器支持一些简单的视频播放控制功能和弹力播放功能。
该玩家的开发是出于对Java编写视频播放器的好奇,因此毕竟它没有提供相对完整的功能,这需要时间和精力。它只是结合了我之前写过的弹幕播放器,将弹片播放功能添加到此视频播放器中,以便在本地视频播放期间可以播放B站的弹幕。
有关详细信息,请参见项目地址
后记
在开发过程中,我们遇到了一些陷阱,例如视频渲染组件的透明度以及界面显示中的某些错误是由Swing的重绘制机制引起的。有些已经完全解决,而另一些仅通过使用路边来拯救该国解决了。如果您在开放时遇到了这些问题,请随时进行交流和讨论。
随附的: