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