java+vlc开发自己的视频播放器

Dorothy ·
更新时间:2024-11-15
· 583 次阅读

最近在捣鼓ffmpeg,写了一个程序去调用ffmpeg用来录屏,想着录好屏之后能够有个播放器播放。播放器当然可以用第三方的,比如ffmpeg中的ffplay播放器,但是ffplayer似乎并不能达到我的期望。毕竟是想写自己的程序,单纯调用第三方软件显得有点low了。于是就萌发了写自己的视频播放器嵌入到自己的程序中的想法。这里我选择了vlc来开发,因此需要去下载vlc以及必备的一些jar包。

效果如下

在这里插入图片描述

1.首先需要下载vlc的安装包,vlc下载网址 选择相应的系统版本,64位系统需要下载64位的,官网默认下载的是32位的,所以需要自己找到64位的并进行下载。下载完成后安装,安装完成后找到自己的安装目录,复制安装目录下的plugin目录、libvlc.dll和libvlccore.dll,并粘贴到自己的工程目录下(建议建立一个lib目录,方便管理)

2.下载vlcj
(点我下载)

下载完成后解压,并从解压的目录中 ,复制以下的四个jar包到工程目录下(lib)目录。因为这里选择的是我选择的是4.4.0版本的vlcj,跟3.0版本的在配置上是有区别的(4.0不需要再去导入slf4j的jar包,相对会方便一些3.0版本的配置可以看官网,官网也有相应的配置以及案例教程)

在这里插入图片描述
完成上面两个步骤后,需要将jar包导入项目

eclipse导入jar包的方法: 右键导入的jar包,选择buildpath->add
,将jar包逐个导入,C的dll库文件也以相同方式导入。

idea的导入: 点击File-> Project Structure->Libraries 点击➕号找到jar包,逐个导入。

完成以上步骤后已经离成功不远了,上面的步骤没完成的话是没办法开始下面的代码实现过程的。为了验证以上步骤是否正确完成,在新建的类中写入以下代码进行测试:

package tutorial; import uk.co.caprica.vlcj.factory.MediaPlayerFactory; public class Tutorial { public static void main(String[] args) { MediaPlayerFactory factory = new MediaPlayerFactory(); } }

如果以上代码不报错,那么环境配置已经完成了,接下来开始写视频播放器。我自己用的是idea来实现的,比较喜欢idea(可能是因为它强大的提示功能)
代码的编写并没有多大的难度,可以很快的创建自己video播放器。
代码用了JPanel来放视频组件(EmbeddedMediaPlayerComponent)以及控制按钮组件,主要调用了视频组件的api,以及注册加监听事件。

代码如下

import uk.co.caprica.vlcj.player.base.Marquee; import uk.co.caprica.vlcj.player.base.MarqueePosition; import uk.co.caprica.vlcj.player.base.MediaPlayer; import uk.co.caprica.vlcj.player.base.MediaPlayerEventAdapter; import uk.co.caprica.vlcj.player.component.EmbeddedMediaPlayerComponent; import javax.management.JMRuntimeException; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.util.ArrayList; import java.util.List; /** 重要事情说三遍:导对包,导对包,导对包 *程序主要用到的一些类 EmbeddedMediaPlayerComponent *主要的一些方法 * mediaPlayerComponent.mediaPlayer().media().play(); * mediaPlayerComponent.mediaPlayer().media().skip(); * mediaPlayerComponent.mediaPlayer().media().pause(); * 另外一些功能还有待补充,如进度条等等 * 菜单栏可以去掉如果不需要的话,我主要是想用来选择文件来播放的, * 不过代码中并没有具体的实现 * */ public class videoplayer { public static videoplayer thisApp; private final JFrame frame; private final EmbeddedMediaPlayerComponent mediaPlayerComponent;//声明EmbeddedMediaPlayerComponent对象 public String nextMrl="a.mp4";//下一个视频的文件名,改成你自己 //菜单栏相关组件 public JMenuBar jmb= new JMenuBar(); public JMenuItem jmi= new JMenuItem();//菜单 public JMenu jmu=new JMenu();// public static void main(String[] args) { thisApp = new videoplayer(args); } public videoplayer(String[] args) { JPanel containpane =new JPanel();//用来放视频组件已经控制面板 JPanel control =new JPanel();//播放控制面板 frame = new JFrame("My First Media Player"); frame.setBounds(100, 100, 600, 400);//定位、设置大小 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.addWindowListener(new WindowAdapter() {//监听窗口关闭 @Override public void windowClosing(WindowEvent e) { mediaPlayerComponent.release(); System.exit(0); } }); mediaPlayerComponent = new EmbeddedMediaPlayerComponent();//创建EmbeddedMediaPlayerComponent对象 Marquee marquee = Marquee.marquee()//这里是给视频添加字幕 .text("该程序由wocnz创建") .size(50) .colour(Color.RED) .timeout(2000) .position(MarqueePosition.TOP_LEFT) .opacity(0.8f) .enable(true); marquee.apply(mediaPlayerComponent.mediaPlayer()); JButton pause=new JButton("pause");//暂停按钮 JButton skip=new JButton("skip");//快进按钮 JButton rewind=new JButton("rewind");//后退按钮 control.add(pause); control.add(skip); control.add(rewind); containpane.setLayout(new BorderLayout()); containpane.add(mediaPlayerComponent,BorderLayout.CENTER); containpane.add(control,BorderLayout.SOUTH); pause.addActionListener(new ActionListener() { //暂停 @Override public void actionPerformed(ActionEvent actionEvent) { mediaPlayerComponent.mediaPlayer().controls().pause(); } }); skip.addActionListener(new ActionListener() { //快进按钮注册监听事件 @Override public void actionPerformed(ActionEvent actionEvent) { mediaPlayerComponent.mediaPlayer().controls().skipTime(10000);//前进10秒 } }); rewind.addActionListener(new ActionListener() { //后退按钮注册监听事件 @Override public void actionPerformed(ActionEvent actionEvent) { mediaPlayerComponent.mediaPlayer().controls().skipTime(-10000);//后退10秒 } }); jmi.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { JOptionPane.showMessageDialog(frame,"这个没什么"); } }); frame.setJMenuBar(jmb);//设置JMenuBar jmu.setText("选择文件"); jmi.setText("列表"); jmb.add(jmu);//添加菜单 jmu.add(jmi);//添加菜单项 jmb.add(new JMenu("eidt"));//添加菜单栏 frame.setContentPane(containpane); frame.setVisible(true); //给视频组件注册监听事件,重写playing、finished、error方法 mediaPlayerComponent.mediaPlayer().events().addMediaPlayerEventListener(new MediaPlayerEventAdapter(){ @Override public void playing(MediaPlayer mediaPlayer){ JOptionPane.showMessageDialog(null,"开始播放视频"); } @Override public void finished(MediaPlayer mediaPlayer){ JOptionPane.showMessageDialog(null,"视频播放完成"); mediaPlayer.submit(new Runnable() { @Override public void run() { //mediaPlayer.media().play(nextMrl); //视频播放结束后播放下面的www.mp4视频 //注意mediaPlayer.media().play()方法需要传入一个字符串,代表了播放文件的位置,但是它默认以当前程序运行路径+传入的字符串作为真正的文件播放路径 //所以这里需要new File对象,获得该文件的绝对路径再去传入 File f=new File("E:/www.mp4"); mediaPlayer.media().play(f.getAbsolutePath()); } }); } }); mediaPlayerComponent.mediaPlayer().media().play("L4-D2-2.mp4");//这里是从当前程序的运行目录去查找 } }

程序的主要问题还是在包的导入上,正确的下载并导入包其实已经成功了一大步,我也是花了很多时间在包的下载上,如果看了还是没搞懂的话,建议上官网看下教程,虽然是全英的。但是慢慢琢磨明白之后,相信你也会欣喜若狂的。

更多了解与学习请访问vlcj的官网

以上只是实现了几个简单的功能,更多的功能后续实现了的话会补充上来,比如ffmpeg的录屏,以及自己写的截图、录音,音视频推流等等功能,还是想把这个程序弄得强大一点,继续努力。
如果有什么错误或者建议还请大佬们不吝赐教。


作者:wocnz



JAVA vlc

需要 登录 后方可回复, 如果你还没有账号请 注册新账号