学习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.(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() {
@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 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;
}
}
第一次撰写技术性文章,欢迎指出我的错误。