最近有個多媒體的作業(yè),要求使用visualC++和OpenCV編寫一個簡易的視頻播放器,對于C/C++殘疾者而言是不可能的,于是萌生了用Java編寫的想法。具體經(jīng)驗分享一下。
目標(biāo):制作簡易視頻播放器
開發(fā)工具:eclipse4.5.1;VLC2.2.1
具體內(nèi)容:完成了視頻的加載、播放、退出的功能;實現(xiàn)了視頻播放過程中控制播放進(jìn)程;實現(xiàn)播放過程中控制暫停。
最終程序效果圖如下:
開發(fā)過程參考學(xué)習(xí)資源:
Java framework for the vlc media player
GitHub
一、環(huán)境配置,也是最重要的一步,如果開發(fā)環(huán)境沒有配置好的話,其他的事都是瞎扯淡。
1.下載vlc(點擊打開下載vlc鏈接),下載自己電腦系統(tǒng)對應(yīng)的版本并安裝;
2.下載vlcj(點擊打開下載vlcj鏈接),把下載文件解壓后將其目錄下的
jna-3.5.2.jar、platform-3.5.2.jar、vlcj-3.8.0.jar(不同版本后綴數(shù)字可能會不同)三個文件復(fù)制到對應(yīng)的java工程目錄(新建 lib 文件夾)下;
3.下載slf4j(點擊打開slf4j下載),下載文件后解壓將其目錄下的slf4j-api-1.7.13.jar、
slf4j- nop-1.7.13.jar(不同版本后綴數(shù)字可能會不同)兩個文件復(fù)制到對應(yīng)的java工程目錄(新建 lib 文件夾)下;
4. 將vlc安裝目錄下的libvlc.dll、libvlccore.dll 兩個文件以及plugins問佳佳復(fù)制到對應(yīng)的java工程目錄下;
至此,環(huán)境文件的導(dǎo)入已經(jīng)基本完成。進(jìn)入eclipse將lib文件夾下面的5個 .jar 文件添加到工作路徑。完成后java工程的目錄結(jié)構(gòu)如下:
java工程下的包里是具體的程序?qū)崿F(xiàn)代碼。
二.各種環(huán)境文件導(dǎo)入java工程之后還需要配置一下才可能夠配置到最終的工作環(huán)境。
1.在java工程下新建兩個包,分別存放程序主文件和窗體文件。在在主程序包下建一個主類,主類的main函數(shù)作如下配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public static void main(String[] args) { //環(huán)境配置,將vlc sdk導(dǎo)入到eclipse //if(RuntimeUtil.isWindows()){ } NativeLibrary.addSearchPath( RuntimeUtil.getLibVlcLibraryName(), "D:\\Program Files\\VideoLAN\\VLC\\sdk\\lib" ); //導(dǎo)入的路徑是vlc的安裝路徑 Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(),LibVlc. class ); //System.out.println(LibVlc.INSTANCE.libvlc_get_version()); } |
b保存后運(yùn)行一下改程序,如果不報錯的話則說明開發(fā)環(huán)境已經(jīng)配置完成。如果報錯的話可以參照上文提到的參考學(xué)習(xí)資源解決問題。
三.接下來就是具體的編碼環(huán)節(jié)了,有問題可以參照java學(xué)習(xí)工具。
具體代碼如下:
主文件類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) { //環(huán)境配置,將vlc sdk導(dǎo)入到eclipse //if(RuntimeUtil.isWindows()){ } NativeLibrary.addSearchPath( RuntimeUtil.getLibVlcLibraryName(), "D:\\Program Files\\VideoLAN\\VLC\\sdk\\lib" ); //導(dǎo)入的路徑是vlc的安裝路徑 Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(),LibVlc. class ); //System.out.println(LibVlc.INSTANCE.libvlc_get_version()); //創(chuàng)建主程序界面運(yùn)行窗體 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"); //直接播放視屏,參數(shù)是視屏文件的絕對路徑 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 ) { //獲取視頻播放進(jìn)度并且按百分比顯示 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 ); } //實現(xiàn)播放按鈕的方法 public static void play() { frame.getMediaPlayer().play(); } //實現(xiàn)暫停按鈕的方法 public static void pause() { frame.getMediaPlayer().pause(); } //實現(xiàn)停止按鈕的方法 public static void stop() { frame.getMediaPlayer().stop(); } //實現(xiàn)點擊進(jìn)度條跳轉(zhuǎn)的方法 public static void jumpTo( float to) { frame.getMediaPlayer().setTime(( long )(to*frame.getMediaPlayer().getLength())); } //實現(xiàn)控制聲音的方法 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; //控制區(qū)域容器 private JProgressBar progress; //進(jìn)度條 private JPanel progressPanel; //進(jìn)度條容器 private JPanel controlPanel; //控制按鈕容器 private JButton btnStop,btnPlay,btnPause; //控制按鈕,停止、播放、暫停 private JSlider slider; //聲音控制塊 EmbeddedMediaPlayerComponent playerComponent; //媒體播放器組件 public static void main(String[] args) { } //MainWindow構(gòu)造方法,創(chuàng)建視屏播放的主界面 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("文件"); //設(shè)置菜單名 menuBar.add(mnFile); mnSetting=new JMenu("設(shè)置"); menuBar.add(mnSetting); mnHelp=new JMenu("幫助"); menuBar.add(mnHelp); mnOpenVideo =new JMenuItem("打開文件"); //設(shè)置文件菜單子目錄打開文件 mnFile.add(mnOpenVideo); mnExit =new JMenuItem("退出"); //設(shè)置文件菜單子目錄退出 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(); //實例化控制區(qū)域容器 videoPane.add(panel,BorderLayout.SOUTH); progressPanel= new JPanel(); //實例化進(jìn)度條容器 panel.add(progressPanel, BorderLayout.NORTH); //添加進(jìn)度條 progress= new JProgressBar(); progressPanel.add(progress); //panel.add(progress,BorderLayout.NORTH); progress.addMouseListener( new MouseAdapter() { @Override public void mouseClicked(MouseEvent e){ //點擊進(jìn)度條調(diào)整視屏播放進(jìn)度 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(); } //獲取進(jìn)度條實例 public JProgressBar getProgressBar() { return progress; } } |
至此使用java開發(fā)簡易的視頻播放器就已經(jīng)完成了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。