最近在捣鼓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的导入:

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

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的录屏,以及自己写的截图、录音,音视频推流等等功能,还是想把这个程序弄得强大一点,继续努力。
如果有什么错误或者建议还请大佬们不吝赐教。