前言
本文參考了Java利用VLC開發簡易視屏播放器中的核心代碼,本文僅作為個人的學習筆記。
配置
親測依照Java利用VLC開發簡易視屏播放器中的配置環境是可行的。
具體配置如下
(1)下載VLC VlC官網http://www.videolan.org/ 各個版本的下載地址http://download.videolan.org/pub/videolan/vlc/last/ 里面有32位和64位的區分,按照自己的系統下載對應的vlc版本,下載解壓后提取;
(2)下載VLCJ (http://capricasoftware.co.uk/#/projects/vlcj)把下載文件解壓后將其目錄下的jna-3.5.2.jar、platform-3.5.2.jar、vlcj-3.8.0.jar(不同版本后綴數字可能會不同)三個文件復制到對應的java工程目錄(新建 lib 文件夾)下;
(3)下載slf4j(http://www.slf4j.org/),下載文件后解壓將其目錄下的slf4j-api-1.7.13.jar、slf4j- nop-1.7.13.jar(不同版本后綴數字可能會不同)兩個文件復制到對應的java工程目錄(新建 lib 文件夾)下;
(4)將vlc安裝目錄下的libvlc.dll、libvlccore.dll 兩個文件以及plugins文件夾復制到對應的java工程目錄下;
(5)將lib文件中的jar包導入到工程項目中。配置好的項目目錄如下圖所示
功能
實現使用VLC制作簡單的視頻播放器,播放本地視頻文件。
代碼
主體Frame部分
import java.awt.BorderLayout;
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.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
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.SwingUtilities;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
@SuppressWarnings("serial")
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; //聲音控制塊
private Timer timer ;
EmbeddedMediaPlayerComponent playerComponent; //媒體播放器組件
public static void main(String[] args) {
}
//MainWindow構造方法,創建視屏播放的主界面
public Window(){
setTitle("視頻播放器");
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
JFileChooser chooser = new JFileChooser();
int v = chooser.showOpenDialog(null);
if (v == JFileChooser.APPROVE_OPTION) {
File file = chooser.getSelectedFile();
getMediaPlayer().playMedia(file.getAbsolutePath());
}
}
});
//退出
mnExit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
exitActionPerformed();
}
});
/*視屏窗口中播放界面部分*/
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();
getMediaPlayer().setTime((long) ((float)x/progress.getWidth() *getMediaPlayer().getLength()));
}
});
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
getMediaPlayer().stop();
if(timer.isRunning()) {
timer.stop();//停止;
}
getProgressBar().setValue(-1);
}
});
controlPanel.add(btnStop);
//添加播放按鈕
btnPlay=new JButton("播放");
btnPlay.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
getMediaPlayer().play();
//判斷timer是否正在運行;
if(!timer.isRunning()) {
timer.start(); //啟動;
}
}
});
controlPanel.add(btnPlay);
//添加暫停按鈕
btnPause=new JButton("暫停");
btnPause.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
//PlayerMain.dispose();
getMediaPlayer().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
getMediaPlayer().setVolume(slider.getValue());
}
});
controlPanel.add(slider);
//視頻表面的鼠標事件監聽
playerComponent.getVideoSurface().addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("**************");
}
});
timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
long total = getMediaPlayer().getLength();
long curr = getMediaPlayer().getTime();
float percent = (float) curr / total;
getProgressBar().setValue((int)(percent*100));
}
});
timer.start();
addWindowListener(new WindowAdapter() { // 用於監聽此窗口的關閉事件,等同於“退出登錄功能”
@Override
public void windowClosing(WindowEvent e) {
exitActionPerformed();
}
});
}
//獲取播放媒體實例(某個視頻)
public EmbeddedMediaPlayer getMediaPlayer() {
return playerComponent.getMediaPlayer();
}
//獲取進度條實例
public JProgressBar getProgressBar() {
return progress;
}
/**
* 退出;
*/
public void exitActionPerformed() {
getMediaPlayer().release();
System.exit(0);
}
}
測試代碼
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) {
frame = new Window();
frame.setVisible(true);
frame.getMediaPlayer().playMedia("F:\\迅雷下載\\Sintel\\Sintel.mp4"); // 直接播放視屏,參數是視屏文件的絕對路徑
}
}
運行效果圖
說明
相比於Java利用VLC開發簡易視屏播放器主要是對於播放的進度條的更新采用了另外一種方式,更改的原因是參考文中的停止按鈕不起作用,所以我更換了一種方式。