在Java(Windows系统)中实现vlc播放器功能

来源:互联网 发布:淘宝怎么1元秒杀 编辑:程序博客网 时间:2024/06/08 16:27

  学习Java几个月,刚刚入门。昨天看到极客学院的Java的入门视频最后有一个简易播放器的制作,因为最近学校要做一个项目,正好需要加入一个视频播放器,就按照视频的方法来做,但是在做时发现N多问题,都是在Windows下特殊的问题,希望可以帮助到需要的人。

  这里给出极客学院的视频链接。

  大家会在Windows下遇到的问题居多,因为极客学院的视频里用的机器是MAC所以在环境搭建的时候会和Windows有很多不一样的地方,所以我把我在实现过程中遇到的问题都总结一下。

  此文章适合初学者学习,如有哪里不足请大家指出来。

  搭建环境

  环境搭建也是最重要的一步,如果环境都没有还谈何开发。

  1.首先需要下载vlc播放器,可以在官网下载或者直接百度搜索下载。

  请注意64位Windows系统一定要下载64位vlc播放器,否则就找不到否则在建立主程序时就会报如下的错误。
  
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'libvlc': JNA native support (win32-amd64/libvlc.dll) not found in resource path (F:\我的文档\JAVATEMP\MyVideoPlayer\bin;F:\我的文档\JAVATEMP\MyVideoPlayer\lib\jna-3.5.2.jar;F:\我的文档\JAVATEMP\MyVideoPlayer\lib\platform-3.5.2.jar;F:\我的文档\JAVATEMP\MyVideoPlayer\lib\vlcj-3.0.1.jar)at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:220)at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:322)at com.sun.jna.Library$Handler.<init>(Library.java:142)at com.sun.jna.Native.loadLibrary(Native.java:387)at com.sun.jna.Native.loadLibrary(Native.java:366)at VideoPlayer.main.PlayerMain.main(PlayerMain.java:25)
  此错误就说明你下载的vlc播放器不是对应你系统的位数。

  在官网下载的话好像都是32位的所以这个坎让我过的非常头疼。我在网上找到了vlc64位版,在此贴出下载地址。

  2.下载完vlc播放器之后还需下载vlcj用里面的jar包来驱动vlc,这里给出vlcj的官网和下载地址。

  如果上述下载地址失效,请进入官网
  
 
  然后往下拉

  

  红线标注的地方下载。

  之后再下载slf4j,下载链接。


 3.工具都准备好之后就开始着手搭建环境。

  首先在你准备的工程下导入vlcj中的jna-4.1.0.jar,jna-platform-4.1.0.jar,vlcj-3.10.1.jar 和slf4j中的。如图:


 
 如果不会导入jar包的话请看极客学院教学入门视频,索引为5.1.3外部库的导入与使用。

 在你下载的vlc包的目录中找到libvlc.dll和libvlccore.dll这两个文件和plugins文件夹,把他们复制到你的Java项目中。

  
  
  建立完整后的Java项目结构应该为
  

 其中多出一个包,我也不知道是什么时候进去的,不用在意。

 在开始前需要先开始写出主函数驱动起来vlc播放器。其代码如下:
public class PlayerMain {public static void main(String[] args) { NativeLibrary.addSearchPath(  //此处的路径是你安装vlc的路径加上sdk和lib下面会给出详细解释    RuntimeUtil.getLibVlcLibraryName(), "d:\\VLC\\sdk\\lib");   Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(),LibVlc.class);  }}
  我在输入路径的时候只输入到我的安装目录,比如我安装到D盘下的VLC文件夹下,如果在上述代码中写在"D:\\VLC"就会报错。一定要在你安装的主目录后面加上"\\sdk\\lib",比如我在添加之后就变为"D:\\VLC\\sdk\\lib",这和MAC系统是不同的请注意。

  把主函数下的代码复制进去后会在几个句子下飘红线,说明你还没有导包,把鼠标放到红线下选择第一个解决方法就自动导包了,在导包完成和改好目录后就可以尝试运行 了。虽然不会发生任何的事,但是只要不报错就说明你的环境配置成功了,接下来就可以着手开发自己的播放器程序了。

  开发代码


  给出我做好的简易播放器的截图,大家可以根据自己的需要自己设计。


  下面贴出我的代码,仅供参考:

  
import java.awt.EventQueue;import java.io.File;import javax.swing.JFileChooser;import javax.swing.SwingWorker;import com.LaoZhao.VideoPlayer.view.MyWindow;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 MyWindow frame;public static void main(String[] args) { NativeLibrary.addSearchPath(      RuntimeUtil.getLibVlcLibraryName(), "d:\\VLC\\sdk\\lib");   Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(),LibVlc.class);      EventQueue.invokeLater(new Runnable() {public void run() {try {frame = new MyWindow();frame.setVisible(true);frame.getMediaPlayer().prepareMedia("d:\\HTML5播放器对比Flash插件.mp4");new SwingWorker<String , Integer>() {@Overrideprotected String doInBackground() throws Exception {while(true){long total = frame.getMediaPlayer().getLength();long curr = frame.getMediaPlayer().getTime();float percent = (float)curr/total;publish((int)(percent*100));Thread.sleep(100);}}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 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);}//打开文件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);}}

import java.awt.BorderLayout;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import com.LaoZhao.VideoPlayer.main.PlayerMain;import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;import javax.swing.JButton;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import javax.swing.JProgressBar;import javax.swing.JMenuBar;import javax.swing.JMenu;import javax.swing.JMenuItem;import javax.swing.JSlider;import javax.swing.event.ChangeListener;import javax.swing.event.ChangeEvent;public class MyWindow extends JFrame {/** *  */private static final long serialVersionUID = 1L;private JPanel contentPane;EmbeddedMediaPlayerComponent playerComponent;private JPanel panel;private JButton btnPlay;private JButton btnPause;private JButton btnStop;private JPanel controlpanel;private JProgressBar progress;private JMenuBar menuBar;private JMenu menu;private JMenuItem openmenu;private JMenuItem closemenu;private JSlider slider;/** * Launch the application. */public static void main(String[] args) {}/** * Create the frame. */public MyWindow() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 640, 480);menuBar = new JMenuBar();setJMenuBar(menuBar);menu = new JMenu("\u6587\u4EF6");menuBar.add(menu);openmenu = new JMenuItem("\u6253\u5F00");menu.add(openmenu);closemenu = new JMenuItem("\u9000\u51FA");menu.add(closemenu);openmenu.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {PlayerMain.openVideo();}});closemenu.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {PlayerMain.exit();}});contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));contentPane.setLayout(new BorderLayout(0, 0));setContentPane(contentPane);JPanel Videopanel = new JPanel();contentPane.add(Videopanel, BorderLayout.CENTER);Videopanel.setLayout(new BorderLayout(0, 0));playerComponent = new EmbeddedMediaPlayerComponent();Videopanel.add(playerComponent);panel = new JPanel();Videopanel.add(panel, BorderLayout.SOUTH);panel.setLayout(new BorderLayout(0, 0));controlpanel = new JPanel();panel.add(controlpanel);btnStop = new JButton("stop");controlpanel.add(btnStop);btnPlay = new JButton("play");controlpanel.add(btnPlay);btnPause = new JButton("pause");controlpanel.add(btnPause);slider = new JSlider();slider.setValue(100);slider.setMaximum(120);slider.addChangeListener(new ChangeListener() {public void stateChanged(ChangeEvent e) {PlayerMain.setvol(slider.getValue());}});controlpanel.add(slider);progress = new JProgressBar();progress.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {int x=e.getX();PlayerMain.jumpTo(((float)x/progress.getWidth()));}});progress.setStringPainted(true);panel.add(progress, BorderLayout.NORTH);btnPause.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {PlayerMain.pause();}});btnPlay.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {PlayerMain.play();}});btnStop.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {PlayerMain.stop();}});}public EmbeddedMediaPlayer  getMediaPlayer() {return playerComponent.getMediaPlayer();}public JProgressBar getProgressBar(){return progress;}}

  第一次撰写技术性文章,欢迎指出我的错误。
  
  
原创粉丝点击