http://blog.youkuaiyun.com/nankeyimengxihe/article/details/50419449
目标:制作简易视屏播放器
开发工具:eclipse4.5.1;VLC2.2.1
具体内容:完成了视屏的加载、播放、退出的功能;实现了视屏播放过程中控制播放进程;实现播放过程中控制暂停。
最终程序效果图如下:
开发过程参考学习资源:极客学院视屏教程http://www.jikexueyuan.com/course/248_1.html?ss=1;
Java framework for the vlc media playerhttp://capricasoftware.co.uk/#/projects/vlcj
GitHub
一、环境配置,也是最重要的一步,如果开发环境没有配置好的话,其他的事都是瞎扯淡。
1.下载vlc(点击打开下载vlc链接:http://www.videolan.org/),下载自己电脑系统对应的版本并安装;
2.下载vlcj(点击打开下载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(点击打开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工程目录下;
至此,环境文件的导入已经基本完成。进入eclipse将lib文件夹下面的5个 .jar 文件添加到工作路径。完成后java工程的目录结构如下:
java工程下的包里是具体的程序实现代码。
二.各种环境文件导入java工程之后还需要配置一下才可能够配置到最终的工作环境。
1.在java工程下新建两个包,分别存放程序主文件和窗体文件。在在主程序包下建一个主类,主类的main函数作如下配置:
- 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());
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:
- /*主程序*/
- 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);
- }
- }
/*主程序*/ 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:
- /*视屏播放器主界面*/
- 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;
- }
- }
/*视屏播放器主界面*/ 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开发简易的视屏播放器就已经完成了。
2015年12月28日 By 七戒
</div>