在Java实现视频播放器(vlc)

  学习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>() {

									@Override
									protected 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() {
			
			@Override
			public void actionPerformed(ActionEvent e) {

				PlayerMain.openVideo();
			}
		});
		
		closemenu.addActionListener(new ActionListener() {
			
			@Override
			public 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() {
			@Override
			public 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() {
			@Override
			public void mouseClicked(MouseEvent e) {
				PlayerMain.pause();
			}
		});
		btnPlay.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				PlayerMain.play();
			}
		});
		btnStop.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				
				PlayerMain.stop();
			}
		});
	}

	public EmbeddedMediaPlayer  getMediaPlayer() {
		
		return playerComponent.getMediaPlayer();
	}
public JProgressBar getProgressBar(){
		
		return progress;
	}
	
}


  第一次撰写技术性文章,欢迎指出我的错误。

  

  

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值