Java利用VLC開(kāi)發(fā)簡(jiǎn)易視屏播放器功能
1、環(huán)境配置
(1)下載VLC VlC官網(wǎng)http://www.videolan.org/ 各個(gè)版本的下載地址http://download.videolan.org/pub/videolan/vlc/last/ 里面有32位和64位的區(qū)分,按照自己的系統(tǒng)下載對(duì)應(yīng)的vlc版本,下載解壓后提??;
(2)下載VLCJ (http://capricasoftware.co.uk/#/projects/vlcj)把下載文件解壓后將其目錄下的jna-3.5.2.jar、platform-3.5.2.jar、vlcj-3.8.0.jar(不同版本后綴數(shù)字可能會(huì)不同)三個(gè)文件復(fù)制到對(duì)應(yīng)的java工程目錄(新建 lib文件夾)下;
(3)下載slf4j(http://www.slf4j.org/),下載文件后解壓將其目錄下的slf4j-api-1.7.13.jar、slf4j- nop-1.7.13.jar(不同版本后綴數(shù)字可能會(huì)不同)兩個(gè)文件復(fù)制到對(duì)應(yīng)的java工程目錄(新建 lib文件夾)下;
(4)將vlc安裝目錄下的libvlc.dll、libvlccore.dll 兩個(gè)文件以及plugins問(wèn)佳佳復(fù)制到對(duì)應(yīng)的java工程目錄下;
將lib文件中的jar包導(dǎo)入到工程項(xiàng)目中。配置好的項(xiàng)目目錄如下圖所示

(5)具體代碼如下
播放器主類代碼
package deng.test;
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 uk.co.caprica.vlcj.binding.LibVlc;
import uk.co.caprica.vlcj.runtime.RuntimeUtil;
public class PlayerMain {
static Window frame;
private static int times=1;
private static boolean flag=true;
// 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:\\vlc\\vlc-2.2.6\\sdk\\lib"); //導(dǎo)入的路徑是vlc的安裝路徑
NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "vlcj//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() {
try {
frame = new Window();
frame.setVisible(true);
frame.getMediaPlayer().playMedia("video//style.avi"); // 直接播放視屏,參數(shù)是視屏文件的絕對(duì)路徑
// frame.getMediaPlayer().prepareMedia("video//test.mp4");
// //控制即將播放的視頻
new SwingWorker<String, Integer>() {
@Override
protected String doInBackground() throws Exception {
// TODO Auto-generated method stub
while (flag) { // 獲取視頻播放進(jìn)度并且按百分比顯示
long total = frame.getMediaPlayer().getLength();
if(total==-1){//如果視頻播放完,循環(huán)播放視頻
play();
times++;
System.out.println(times+"******************");
}
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();
}
}
});
}
//關(guān)閉播放器釋放資源
public static void dispose(){
flag=false;
frame.getMediaPlayer().stop();
frame.dispose();
}
// 打開(kāi)文件
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);
}
// 實(shí)現(xiàn)播放按鈕的方法
public static void play() {
frame.getMediaPlayer().play();
}
// 實(shí)現(xiàn)暫停按鈕的方法
public static void pause() {
frame.getMediaPlayer().pause();
}
// 實(shí)現(xiàn)停止按鈕的方法
public static void stop() {
frame.getMediaPlayer().stop();
}
// 實(shí)現(xiàn)點(diǎn)擊進(jìn)度條跳轉(zhuǎn)的方法
public static void jumpTo(float to) {
frame.getMediaPlayer().setTime((long) (to * frame.getMediaPlayer().getLength()));
}
// 實(shí)現(xiàn)控制聲音的方法
public static void setVol(int v) {
frame.getMediaPlayer().setVolume(v);
}
}
播放器窗體類:
package deng.test;
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 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 uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
@SuppressWarnings("serial")
public class Window extends JFrame{
private JPanel contentPane; //頂層容器,整個(gè)播放頁(yè)面的容器
private JMenuBar menuBar; //菜單欄
private JMenu mnFile,mnSetting,mnHelp; //文件菜單
private JMenuItem mnOpenVideo,mnExit; //文件菜單子目錄,打開(kāi)視屏、退出
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(" 小婷婷專屬播放器 Copyright@dengchaoqun");
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("打開(kāi)文件"); //設(shè)置文件菜單子目錄打開(kāi)文件
mnFile.add(mnOpenVideo);
mnExit =new JMenuItem("退出"); //設(shè)置文件菜單子目錄退出
mnFile.add(mnExit);
//打開(kāi)文件
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(); //實(shí)例化控制區(qū)域容器
videoPane.add(panel,BorderLayout.SOUTH);
progressPanel=new JPanel(); //實(shí)例化進(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){ //點(diǎn)擊進(jìn)度條調(diào)整視屏播放進(jìn)度
int x=e.getX();
PlayerMain.jumpTo((float)x/progress.getWidth());
}
});
progress.setStringPainted(true);
controlPanel=new JPanel(); //實(shí)例化控制按鈕容器
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.dispose();
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);
}
//獲取播放媒體實(shí)例(某個(gè)視頻)
public EmbeddedMediaPlayer getMediaPlayer() {
return playerComponent.getMediaPlayer();
}
//獲取進(jìn)度條實(shí)例
public JProgressBar getProgressBar() {
return progress;
}
}
效果如下:

(6)在視頻播放面板上操作視頻接口方法:
playerComponent = new EmbeddedMediaPlayerComponent();
panel.add(playerComponent);
//視頻表面的鼠標(biāo)事件監(jiān)聽(tīng)
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("**************");
}
});
(7)項(xiàng)目總結(jié):應(yīng)用了開(kāi)源vlc,運(yùn)用了jna技術(shù),實(shí)現(xiàn)了多媒體視頻播放。
到此這篇關(guān)于Java利用VLC開(kāi)發(fā)簡(jiǎn)易視屏播放器的文章就介紹到這了,更多相關(guān)Java視屏播放器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java中ByteArray字節(jié)數(shù)組的輸入輸出流的用法
ByteArrayInputStream和ByteArrayOutputStream分別集成自InputStream和OutputStream這兩個(gè)輸入和輸出流,這里我們就來(lái)詳解Java中ByteArray字節(jié)數(shù)組的輸入輸出流的用法,需要的朋友可以參考下2016-06-06
Spring boot監(jiān)控Actuator-Admin實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了Spring boot監(jiān)控Actuator-Admin實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
SpringBoot中TransactionTemplate事務(wù)管理的實(shí)現(xiàn)
Spring Boot提供了多種方式來(lái)管理事務(wù),其中之一是使用TransactionTemplate,本文主要介紹了SpringBoot中TransactionTemplate事務(wù)管理的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04
Java使用Apache POI庫(kù)讀取Excel表格文檔的示例
POI庫(kù)是Apache提供的用于在Windows下讀寫(xiě)各類微軟Office文檔的Java庫(kù),這里我們就來(lái)看一下Java使用Apache POI庫(kù)讀取Excel表格文檔的示例:2016-06-06
java實(shí)現(xiàn)角色及菜單權(quán)限的項(xiàng)目實(shí)踐
在Java中,實(shí)現(xiàn)角色及菜單權(quán)限管理涉及定義實(shí)體類、設(shè)計(jì)數(shù)據(jù)庫(kù)表、實(shí)現(xiàn)服務(wù)層和控制器層,這種管理方式有助于有效控制用戶權(quán)限,適用于企業(yè)級(jí)應(yīng)用,感興趣的可以一起來(lái)了解一下2024-09-09

