java创建简易视频播放器

时间:2022-05-12 15:50:48

最近有个多媒体的作业,要求使用visualC++和OpenCV编写一个简易的视频播放器,对于C/C++残疾者而言是不可能的,于是萌生了用Java编写的想法。具体经验分享一下。 

目标:制作简易视频播放器

开发工具:eclipse4.5.1;VLC2.2.1

具体内容:完成了视频的加载、播放、退出的功能;实现了视频播放过程中控制播放进程;实现播放过程中控制暂停。

最终程序效果图如下: 

java创建简易视频播放器

java创建简易视频播放器

java创建简易视频播放器

开发过程参考学习资源:

极客学院视屏教程 

Java framework for the vlc media player

GitHub 

一、环境配置,也是最重要的一步,如果开发环境没有配置好的话,其他的事都是瞎扯淡。 

1.下载vlc(点击打开下载vlc链接),下载自己电脑系统对应的版本并安装; 
2.下载vlcj(点击打开下载vlcj链接),把下载文件解压后将其目录下的

jna-3.5.2.jar、platform-3.5.2.jar、vlcj-3.8.0.jar(不同版本后缀数字可能会不同)三个文件复制到对应的java工程目录(新建 lib 文件夹)下; 

java创建简易视频播放器

3.下载slf4j(点击打开slf4j下载),下载文件后解压将其目录下的slf4j-api-1.7.13.jar、
slf4j- nop-1.7.13.jar(不同版本后缀数字可能会不同)两个文件复制到对应的java工程目录(新建 lib 文件夹)下; 

java创建简易视频播放器

4. 将vlc安装目录下的libvlc.dll、libvlccore.dll 两个文件以及plugins问佳佳复制到对应的java工程目录下; 

java创建简易视频播放器

至此,环境文件的导入已经基本完成。进入eclipse将lib文件夹下面的5个 .jar 文件添加到工作路径。完成后java工程的目录结构如下: 

java创建简易视频播放器

java工程下的包里是具体的程序实现代码。 

二.各种环境文件导入java工程之后还需要配置一下才可能够配置到最终的工作环境。 

1.在java工程下新建两个包,分别存放程序主文件和窗体文件。在在主程序包下建一个主类,主类的main函数作如下配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {
 
//环境配置,将vlc sdk导入到eclipse
 
//if(RuntimeUtil.isWindows()){     }
NativeLibrary.addSearchPath(
RuntimeUtil.getLibVlcLibraryName(), "D:\\Program Files\\VideoLAN\\VLC\\sdk\\lib");
 
//导入的路径是vlc的安装路径
Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(),LibVlc.class);
//System.out.println(LibVlc.INSTANCE.libvlc_get_version());
 
}

 

b保存后运行一下改程序,如果不报错的话则说明开发环境已经配置完成。如果报错的话可以参照上文提到的参考学习资源解决问题。

三.接下来就是具体的编码环节了,有问题可以参照java学习工具。 

具体代码如下:

主文件类PlayerMain: 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*主程序*/
 
package VideoPlayer.Main;
 
import java.awt.EventQueue;
import java.io.File;
 
import javax.swing.JFileChooser;
import javax.swing.SwingWorker;
 
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
 
import VideoPlayer.Window.Window;
import uk.co.caprica.vlcj.binding.LibVlc;
import uk.co.caprica.vlcj.runtime.RuntimeUtil;
 
public class PlayerMain {
 
 static Window frame;
 //private static final String NATIVE_LIBRARY_SEARCH_PATH = "D:\\Program Files\\VideoLAN\\VLC\\sdk\\lib";
 
 public static void main(String[] args) {
 
 //环境配置,将vlc sdk导入到eclipse
 
 //if(RuntimeUtil.isWindows()){  }
 NativeLibrary.addSearchPath(
 RuntimeUtil.getLibVlcLibraryName(), "D:\\Program Files\\VideoLAN\\VLC\\sdk\\lib"); //导入的路径是vlc的安装路径
 Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(),LibVlc.class);
  //System.out.println(LibVlc.INSTANCE.libvlc_get_version());
 
 //创建主程序界面运行窗体
 EventQueue.invokeLater(new Runnable() {
 
 @Override
 public void run() {
 // TODO Auto-generated method stub
 try{
  frame=new Window();
  frame.setVisible(true);
  //frame.getMediaPlayer().playMedia("F:\\Videos\\Let.mp4"); //直接播放视屏,参数是视屏文件的绝对路径
  frame.getMediaPlayer().prepareMedia("F:\\Videos\\Let_It_Go.mp4"); //控制播放视屏
  new SwingWorker<String, Integer>() {
 
  @Override
  protected String doInBackground() throws Exception {
  // TODO Auto-generated method stub
  while (true) { //获取视频播放进度并且按百分比显示
  long total=frame.getMediaPlayer().getLength();
  long curr=frame.getMediaPlayer().getTime();
  float percent=(float)curr/total;
  publish((int)(percent*100));
  Thread.sleep(100);
  }
  //return null;
  }
  
  protected void process(java.util.List<Integer> chunks) {
  for(int v:chunks){
  frame.getProgressBar().setValue(v);
  }
  }
  }.execute();
 }catch(Exception e){
  e.printStackTrace();
 }
 }
 });
 }
 
 //打开文件
 public static void openVideo() {
 JFileChooser chooser=new JFileChooser();
 int v=chooser.showOpenDialog(null);
 if(v==JFileChooser.APPROVE_OPTION){
 File file=chooser.getSelectedFile();
 frame.getMediaPlayer().playMedia(file.getAbsolutePath());
 }
 }
 
 //退出播放
 public static void exit() {
 frame.getMediaPlayer().release();
 System.exit(0);
 }
 
 //实现播放按钮的方法
 public static void play() {
 frame.getMediaPlayer().play();
 }
 
 //实现暂停按钮的方法
 public static void pause() {
 frame.getMediaPlayer().pause();
 }
 
 //实现停止按钮的方法
 public static void stop() {
 frame.getMediaPlayer().stop();
 }
 
 //实现点击进度条跳转的方法
 public static void jumpTo(float to) {
 frame.getMediaPlayer().setTime((long)(to*frame.getMediaPlayer().getLength()));
 }
 
 //实现控制声音的方法
 public static void setVol(int v) {
 frame.getMediaPlayer().setVolume(v);
 }
 
}

窗体文件类Window: 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
/*视屏播放器主界面*/
 
package VideoPlayer.Window;
 
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JSlider;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
 
import VideoPlayer.Main.PlayerMain;
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
 
public class Window extends JFrame{
 
 private JPanel contentPane; //顶层容器,整个播放页面的容器
 private JMenuBar menuBar; //菜单栏
 private JMenu mnFile,mnSetting,mnHelp; //文件菜单
 private JMenuItem mnOpenVideo,mnExit; //文件菜单子目录,打开视屏、退出
 private JPanel panel; //控制区域容器
 private JProgressBar progress; //进度条
 private JPanel progressPanel; //进度条容器
 private JPanel controlPanel; //控制按钮容器
 private JButton btnStop,btnPlay,btnPause; //控制按钮,停止、播放、暂停
 private JSlider slider; //声音控制块
 
 
 EmbeddedMediaPlayerComponent playerComponent; //媒体播放器组件
 
 public static void main(String[] args) {
 
 }
 
 //MainWindow构造方法,创建视屏播放的主界面
 public Window(){
 setTitle(" VideoPlayer Copyright@2015 by 南柯一梦");
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 setBounds(200,80,900,600);
 contentPane=new JPanel();
 contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
 contentPane.setLayout(new BorderLayout(0,0));
 setContentPane(contentPane);
 
 
 /*视频播放窗口中的菜单栏*/
 menuBar=new JMenuBar();
 setJMenuBar(menuBar);
 
 mnFile=new JMenu("文件"); //设置菜单名
 menuBar.add(mnFile);
 mnSetting=new JMenu("设置");
 menuBar.add(mnSetting);
 mnHelp=new JMenu("帮助");
 menuBar.add(mnHelp);
 
 mnOpenVideo =new JMenuItem("打开文件"); //设置文件菜单子目录打开文件
 mnFile.add(mnOpenVideo);
 
 mnExit =new JMenuItem("退出"); //设置文件菜单子目录退出
 mnFile.add(mnExit);
 
 //打开文件
 mnOpenVideo.addActionListener(new ActionListener() {
 
 @Override
 public void actionPerformed(ActionEvent e) {
 // TODO Auto-generated method stub
 PlayerMain.openVideo();
 }
 });
 
 //退出
 mnExit.addActionListener(new ActionListener() {
 
 @Override
 public void actionPerformed(ActionEvent e) {
 // TODO Auto-generated method stub
 PlayerMain.exit();
 }
 });
 
 
 /*视屏窗口中播放界面部分*/
 JPanel videoPane=new JPanel();
 contentPane.add(videoPane, BorderLayout.CENTER);
 videoPane.setLayout(new BorderLayout(0,0));
 
 playerComponent=new EmbeddedMediaPlayerComponent();
 videoPane.add(playerComponent);
 
 /*视屏窗口中控制部分*/
 
 panel=new JPanel(); //实例化控制区域容器
 videoPane.add(panel,BorderLayout.SOUTH);
 
 progressPanel=new JPanel(); //实例化进度条容器
 panel.add(progressPanel, BorderLayout.NORTH);
 
 //添加进度条
 progress=new JProgressBar();
 progressPanel.add(progress);
 //panel.add(progress,BorderLayout.NORTH);
 progress.addMouseListener(new MouseAdapter() {
 @Override
 public void mouseClicked(MouseEvent e){ //点击进度条调整视屏播放进度
 int x=e.getX();
 PlayerMain.jumpTo((float)x/progress.getWidth());
 }
 });
 progress.setStringPainted(true);
 
 
 controlPanel=new JPanel(); //实例化控制按钮容器
 panel.add(controlPanel,BorderLayout.SOUTH);
 
 //添加停止按钮
 btnStop=new JButton("停止");
 btnStop.addMouseListener(new MouseAdapter() {
 @Override
 public void mouseClicked(MouseEvent e) {
 // TODO Auto-generated method stub
 PlayerMain.stop();
 }
 });
 controlPanel.add(btnStop);
 
 //添加播放按钮
 btnPlay=new JButton("播放");
 btnPlay.addMouseListener(new MouseAdapter() {
 @Override
 public void mouseClicked(MouseEvent e) {
 // TODO Auto-generated method stub
 PlayerMain.play();
 }
 });
 controlPanel.add(btnPlay);
 
 //添加暂停按钮
 btnPause=new JButton("暂停");
 btnPause.addMouseListener(new MouseAdapter() {
 @Override
 public void mouseClicked(MouseEvent e) {
 // TODO Auto-generated method stub
 PlayerMain.pause();
 }
 });
 controlPanel.add(btnPause);
 
 //添加声音控制块
 slider=new JSlider();
 slider.setValue(80);
 slider.setMaximum(100);
 slider.addChangeListener(new ChangeListener() {
 
 @Override
 public void stateChanged(ChangeEvent e) {
 // TODO Auto-generated method stub
 PlayerMain.setVol(slider.getValue());
 }
 });
 controlPanel.add(slider);
 }
 
 //获取播放媒体实例(某个视频)
 public EmbeddedMediaPlayer getMediaPlayer() {
 return playerComponent.getMediaPlayer();
 }
 
 //获取进度条实例
 public JProgressBar getProgressBar() {
 return progress;
 }
 
}

至此使用java开发简易的视频播放器就已经完成了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。