最终的视频播放器的实现:
主要功能:
(1) 通过查找文件,打开本地视频
(2) 通过代理打开视频(需要服务计算的相关知识)
(3) 暂停,后退,前进
(4) 视频的进度条,点击进度条视频跳转到相应的位置
(5) 调节音量
(6) 其他功能可以自己添加
1. VLCJ
vlcj项目提供了一个Java框架,允许将本机VLC媒体播放器的实例嵌入到Java AWT窗口或Swing JFrame中。VLCJ学习网址:http://capricasoftware.co.uk/#/projects/vlcj/tutorial
VLCJ项目:
https://github.com/caprica/vlcj
2.VLCJ的配置
(1)下载vlc视频播放器,因为要使用里面的库函数。直接百度下载即可。
(2)http://capricasoftware.co.uk/#/projects/vlcj/tutorial/installation去这个地址下载相应的jar包
(3)配置完成后,可以做一个测试
package tutorial; import uk.co.caprica.vlcj.binding.LibVlc; import uk.co.caprica.vlcj.discovery.NativeDiscovery; public class Tutorial { public static void main(String[] args) { boolean found = new NativeDiscovery().discover(); System.out.println(found); System.out.println(LibVlc.INSTANCE.libvlc_get_version()); } }
3.配置完成后就可以使用VLCJ写程序了
(1)创建视频播放器的窗口代码,为了代码更加具有可读性,把控件和控件对应的事件分开写。
各种事件的添加可以查看文档:
http://caprica.github.io/vlcj/javadoc/2.2.0/overview-summary.html
最主要的就是
EmbeddedMediaPlayerComponent mediaPlayerComponent;的使用
创建播放器窗口
package 视频播放器; import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Font; import java.awt.List; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JList; 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.event.ChangeEvent; import javax.swing.event.ChangeListener; import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent; import uk.co.caprica.vlcj.discovery.NativeDiscovery; import uk.co.caprica.vlcj.player.MediaPlayer; import video.VideoDir; import video.VideoService; import video.VideoServiceService; public class Window extends JFrame { private final JFrame frame; private JMenuBar menuBar; // 菜单栏 private JMenu mnFile, mnSetting, mnHelp, service; // 文件菜单 private JMenuItem mnOpenVideo, mnExit; private final EmbeddedMediaPlayerComponent mediaPlayerComponent; //嵌入的媒体播放器组件 private final JButton pauseButton; private final JButton rewindButton; private final JButton skipButton; private final JPanel ProgressPanel; private final JProgressBar progress; private final JSlider slider; private String dir; private int i; private int length = 0; private String[] videoName; public static void main(final String[] args) { } private void getVideoName() { VideoServiceService vvs = new VideoServiceService(); VideoService vs = vvs.getVideoServicePort(); VideoDir vd = vs.getVideodir(); dir = vd.getDir(); System.out.println(dir); File fdir = new File(dir); File f[] = fdir.listFiles(); videoName = new String[f.length]; i = 0; for (File m : f) { videoName[i++] = m.getName(); length++; System.out.println(length); } } public Window() { frame = new JFrame("视频播放"); frame.setBounds(100, 100, 800, 600); frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { mediaPlayerComponent.release(); System.exit(0); } }); menuBar = new JMenuBar(); setJMenuBar(menuBar); mnFile = new JMenu("文件"); // 设置菜单名 menuBar.add(mnFile); mnSetting = new JMenu("设置"); menuBar.add(mnSetting); mnHelp = new JMenu("帮助"); menuBar.add(mnHelp); service = new JMenu("服务"); menuBar.add(service); getVideoName(); for (int i = 0; i < length; i++) { service.add(videoName[i]); } 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 mainPlay.openVideo(); } }); // 退出 mnExit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub mainPlay.exit(); } }); for (i = 0; i < length; i++) { service.getItem(i).addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub mainPlay.openVideo(dir + "/" + e.getActionCommand()); } }); } JPanel contentPane = new JPanel(); contentPane.setLayout(new BorderLayout()); mediaPlayerComponent = new EmbeddedMediaPlayerComponent(); contentPane.add(menuBar, BorderLayout.NORTH); contentPane.add(mediaPlayerComponent, BorderLayout.CENTER); progress = new JProgressBar(); ProgressPanel = new JPanel(); ProgressPanel.add(progress); progress.setStringPainted(true); JPanel controlsPane = new JPanel(); controlsPane.add(ProgressPanel); pauseButton = new JButton("暂停"); controlsPane.add(pauseButton); rewindButton = new JButton("后退"); controlsPane.add(rewindButton); skipButton = new JButton("前进"); controlsPane.add(skipButton); slider = new JSlider(); slider.setValue(80); slider.setMaximum(100); slider.setVisible(true); controlsPane.add(slider); contentPane.add(controlsPane, BorderLayout.SOUTH); progress.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { // 点击进度条调整视屏播放进度 int x = e.getX(); mainPlay.jumpTo((float) x / progress.getWidth()); } }); progress.setStringPainted(true); pauseButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { mainPlay.pause(); } }); rewindButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { mainPlay.resume(); } }); skipButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { mainPlay.skip(); } }); frame.setContentPane(contentPane); frame.setVisible(true); slider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { mainPlay.setVol(slider.getValue()); } }); } public MediaPlayer getMediaPlayer() { // TODO Auto-generated method stub return mediaPlayerComponent.getMediaPlayer(); } public JProgressBar getProgerss() { return progress; } }
(2)添加相应的事件
package 视频播放器; import java.awt.EventQueue; import java.io.File; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.SwingWorker; import uk.co.caprica.vlcj.discovery.NativeDiscovery; import video.VideoDir; import video.VideoService; import video.VideoServiceService; public class mainPlay { static Window frame; private String dirVideo; public static void main(String[] args) { new NativeDiscovery().discover(); // 创建主程序界面运行窗体 EventQueue.invokeLater(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { frame = new Window(); //frame.getMediaPlayer().playMedia("src/环保小视频.mp4"); // 控制播放视屏 new SwingWorker<String, Integer>() { 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.getProgerss().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 openVideo(String dir){ File file=new File(dir); frame.getMediaPlayer().playMedia(file.getAbsolutePath()); } //退出播放 public static void exit() { frame.getMediaPlayer().release(); System.exit(0); } // 实现暂停按钮的方法 public static void pause() { frame.getMediaPlayer().pause(); } // 实现点击进度条跳转的方法 public static void resume(){ frame.getMediaPlayer().skip(-1000); } public static void skip(){ frame.getMediaPlayer().skip(10000); } public static void jumpTo(float to) { frame.getMediaPlayer().setTime((long) (to * frame.getMediaPlayer().getLength())); } // 实现控制声音的方法 public static void setVol(int v) { frame.getMediaPlayer().setVolume(v); } }
(3)要想程序正常的运行有两种方法。
方法一:删除服务相关的内容,把服务对应的事件删除即可
方法二:学习服务计算相关知识
推荐选择方法二
播放器的下载的地址:http://download.csdn.net/download/a1342772/10005707