Java视频播放器的制作
----------------siwuxie095
使用 Java Swing 框架制作一个简单的视频播放器:
首先到 VideoLAN 的官网下载 VLC media player,制作的视频播放器内核
需要调用
VLC media player
VideoLAN:http://www.videolan.org/
VLC command-line help:https://wiki.videolan.org/VLC_command-line_help/
接着下载相关的在线开源库:vlcj
GitHub 链接:https://github.com/caprica/vlcj
下载链接:
(1)http://capricasoftware.co.uk/#/projects/vlcj
(2)http://capricasoftware.co.uk/#/projects/vlcj/tutorial/installation
(3)http://download.csdn.net/detail/siwuxie095/9807180
vlcj 教程:http://capricasoftware.co.uk/#/projects/vlcj/tutorial
vlcj-3.8.0-dist.tar.gz 解压后一览:

必备的 4 个 jar 包:
(1)jna-3.5.2.jar
(2)platform-3.5.2.jar
(3)vlcj-3.8.0.jar
(4)slf4j-api-1.7.10.jar
虽然这 4 个
jar 包已经够了,但根据控制台的提示:
Failed to load class "org.slf4j.impl.StaticLoggerBinder"

最好还是查看具体的细节:https://www.slf4j.org/codes.html#StaticLoggerBinder
可以导入页面中所提到的 5 个包中的任何一个且只能一个来解决问题
(1)slf4j-nop.jar
(2)slf4j-simple.jar
(3)slf4j-log4j12.jar
(4)slf4j-jdk14.jar
(5)logback-classic.jar
SLF4J 下载链接:
(1)https://www.slf4j.org/download.html
(2)http://download.csdn.net/detail/siwuxie095/9807191

我选择导入
slf4j-nop-1.7.25.jar,即 5 个可选包中的第一个
工程名:MyVideoPlayer
包名:com.siwuxie095.main、com.siwuxie095.view
类名:VideoPlayer.java(主类)、MainWindow.java
打开资源管理器,在工程 MyVideoPlayer 文件夹下,创建一个
文件夹:lib,在其中放入:
(1)jna-3.5.2.jar
(2)platform-3.5.2.jar
(3)vlcj-3.8.0.jar
(4)slf4j-api-1.7.10.jar
(5)
slf4j-nop-1.7.25.jar
工程结构目录如下:

全选这 5 个
jar 文件,右键->Build Path->Add to Build Path
此时,工程结构目录一览:

VideoPlayer.java(主类):
|
package com.siwuxie095.main; import java.awt.EventQueue; import java.io.File; import javax.swing.JFileChooser; import javax.swing.SwingWorker; import com.siwuxie095.view.MainWindow; import com.sun.jna.Native; import com.sun.jna.NativeLibrary; import uk.co.caprica.vlcj.binding.LibVlc; import uk.co.caprica.vlcj.discovery.NativeDiscovery; import uk.co.caprica.vlcj.runtime.RuntimeUtil; public class VideoPlayer {
/** * VLC播放器系统库的路径:D:\VLC media player\VLC * 注意需要将路径中的反斜杠改为斜杠,或 * 系统库一般是在含有 libvlc.dll、libvlccore.dll 的路径 */ private static final String NATIVE_LIBRARY_SEARCH_PATH = "D:/VLC media player/VLC";
//将声明转移到类中,并设为 static static MainWindow frame;
public static
//(1)法一:首先要找到本机库(VLC播放器的系统库),这是自动搜索本机库的位置 boolean found = new NativeDiscovery().discover(); System.out.println(found); System.out.println(LibVlc.INSTANCE.libvlc_get_version()); //判断当前的系统是否是Windows //还可以判断Mac和Linux,以传入不同的路径 if (RuntimeUtil.isWindows()) {
//(2)法二:手动设置本机库(VLC播放器的系统库)的路径 NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), NATIVE_LIBRARY_SEARCH_PATH);
System.out.println(LibVlc.INSTANCE.libvlc_get_version()); } //加载VLC播放器的系统库 Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);
//在主方法中创建窗体 EventQueue.invokeLater(new Runnable() { public try { frame = new MainWindow(); frame.setVisible(true); //字幕的编码 String options="--subsdec-encoding=GB18030"; /** * prepareMedia() 先准备而不是马上播放 * 可传入视频文件的路径(和播放参数,如:字幕编码) * 这里使用双反斜杠(通过转义符进行转义) * 关于播放参数,可以参考 VLC command-line * 链接:https://wiki.videolan.org/VLC_command-line_help/ * 进入后搜索 subsdec 设定字幕编码 * 还可以传入更多播放参数 */ frame.getMediaPlayer().prepareMedia("C:\\Users\\siwux\\Desktop\\" + "testvideo\\test.mp4",options);
frame.getMediaPlayer().toggleFullScreen();
//创建一个 SwingWorker 线程,用于实时调节进度 //注意:创建完毕,最后要 execute() 将它运行起来 new SwingWorker<String, Integer>() { @Override protected String doInBackground() throws Exception {
while (true) { //视频总时长,以毫秒计 long total=frame.getMediaPlayer().getLength(); //当前所看时长,以毫秒计 long curr=frame.getMediaPlayer().getTime(); //百分比,并强转为 float float percent=(float)curr/total; //因为进度条不是按百分比进行计算,而是 0-100 的数值范围 ,并强转为 int,publish() 到 process() //(进度条范围可设置,如果改为 0-120,就要乘 120) publish((int)(percent*100));
//每隔 0.1 秒(100毫秒)更新一次进度条,如果不加则刷新过快 Thread.sleep(100); }
}
protected //创建int型变量 value 接收 chunks 中的值 for (int value : chunks) { frame.getProgressBar().setValue(value); }
}; }.execute(); } catch (Exception e) { e.printStackTrace(); } } });
}
//播放 public static frame.getMediaPlayer().play(); }
//暂停 public static frame.getMediaPlayer().pause(); }
//停止 public static frame.getMediaPlayer().stop(); }
public static //为跳转设定时间:百分比乘以视频时间的总长 frame.getMediaPlayer().setTime((long)(to*frame.getMediaPlayer().getLength())); }
public static //创建文件选择器:JFileChooser JFileChooser chooser=new JFileChooser(); //将父级窗体设置成 null int v=chooser.showOpenDialog(null); if (v==JFileChooser.APPROVE_OPTION) { File file=chooser.getSelectedFile(); //获取到文件的绝对路径,开始播放 frame.getMediaPlayer().playMedia(file.getAbsolutePath()); } }
public static JFileChooser chooser=new JFileChooser(); int v=chooser.showOpenDialog(null); if (v==JFileChooser.APPROVE_OPTION) { File file=chooser.getSelectedFile(); //设定字幕,直接传入 file 对象 frame.getMediaPlayer().setSubTitleFile(file); } }
public static //在退出之前,先释放播放器的资源 frame.getMediaPlayer().release(); System.exit(0); }
public static //设定音量 frame.getMediaPlayer().setVolume(vol); }
} |
MainWindow.java:
|
package com.siwuxie095.view; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; 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.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.EmptyBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.siwuxie095.main.VideoPlayer; import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent; import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer; public class MainWindow extends JFrame { private JPanel contentPane;
//创建播放器的界面需要使用 EmbeddedMediaPlayerComponent EmbeddedMediaPlayerComponent playerComponent;
private JPanel bottomPane; private JButton btnPlay; private JButton btnPause; private JButton btnStop; private JPanel controlPane; private JProgressBar progress; private JMenuBar menuBar; private JMenu mnFile; private JMenuItem mntmOpenvideo; private JMenuItem mntmOpensubtitle; private JMenuItem mntmExit; private JSlider slider; /** * Create the frame. */ public MainWindow() {
try { UIManager.setLookAndFeel(new WindowsLookAndFeel()); } catch (UnsupportedLookAndFeelException e) { e.printStackTrace(); }
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300);
menuBar = new JMenuBar(); setJMenuBar(menuBar);
mnFile = new JMenu("File"); menuBar.add(mnFile);
mntmOpenvideo = new JMenuItem("OpenVideo"); mntmOpenvideo.addActionListener(new ActionListener() { public VideoPlayer.openVideo(); } }); mnFile.add(mntmOpenvideo);
mntmOpensubtitle = new JMenuItem("OpenSubtitle"); mntmOpensubtitle.addActionListener(new ActionListener() { public VideoPlayer.openSubtitle(); } }); mnFile.add(mntmOpensubtitle);
mntmExit = new JMenuItem("Exit"); mntmExit.addActionListener(new ActionListener() { public VideoPlayer.exit(); } }); mnFile.add(mntmExit); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new BorderLayout(0, 0)); setContentPane(contentPane);
JPanel videoPane = new JPanel(); contentPane.add(videoPane, BorderLayout.CENTER); videoPane.setLayout(new BorderLayout(0, 0));
//在 videoPane 创建之后实例化 playerComponent playerComponent=new EmbeddedMediaPlayerComponent(); //将 playerComponent 添加到 videoPane 中,并指定布局 videoPane.add(playerComponent, BorderLayout.CENTER);
bottomPane = new JPanel(); videoPane.add(bottomPane, BorderLayout.SOUTH); bottomPane.setLayout(new BorderLayout(0, 0));
controlPane = new JPanel(); bottomPane.add(controlPane);
btnStop = new JButton("Stop"); controlPane.add(btnStop); btnStop.setFocusable(false);
btnPlay = new JButton("Play"); controlPane.add(btnPlay); btnPlay.setFocusable(false);
btnPause = new JButton("Pause"); controlPane.add(btnPause); btnPause.setFocusable(false);
slider = new JSlider(); slider.setFocusable(false); //关于默认音量的设定要在 stateChanged 事件之前 //如果要设定最大音量和最小音量也是如此 slider.setValue(20); //为音量调节 slider 添加 stateChanged 事件 slider.addChangeListener(new ChangeListener() { public VideoPlayer.setVol(slider.getValue()); } });
controlPane.add(slider);
progress = new JProgressBar(); progress.setFocusable(false);
//为进度条 progress 添加 mouseClicked 事件 progress.addMouseListener(new MouseAdapter() { @Override public //获取鼠标点击在进度条上的位置 int x=e.getX(); //计算点击位置占进度条总长的百分比 float per=(float)x/progress.getWidth(); VideoPlayer.jumpTo(per); } }); //让进度条 progress 显示数字百分比 progress.setStringPainted(true); bottomPane.add(progress, BorderLayout.NORTH);
//为 Stop 按钮添加 mouseClicked 事件 btnStop.addMouseListener(new MouseAdapter() { @Override public VideoPlayer.stop(); } });
//为 Play 按钮添加 mouseClicked 事件 btnPlay.addMouseListener(new MouseAdapter() { @Override public VideoPlayer.play(); } });
//为 Pause 按钮添加 mouseClicked 事件 btnPause.addMouseListener(new MouseAdapter() { @Override public VideoPlayer.pause(); } });
}
//返回媒体播放器的实例 public EmbeddedMediaPlayer getMediaPlayer() { return playerComponent.getMediaPlayer(); }
//返回JProgressBar的实例 public JProgressBar getProgressBar() { return progress; } } |
将窗体
JFrame 的 LookAndFeel 设定为 Windows
根面板
contentPane 使用默认布局 Border Layout
在 contentPane 的中间添加一个 JPanel,将其布局改为:
Border Layout,Rename 为 videoPane
在 videoPane 的下方添加一个 JPanel,将其布局改为:
Border Layout,Rename 为 bottomPane
在 bottomPane 的中间添加一个 JPanel,将其布局改为:
Flow Layout,Rename 为 controlPane
在 controlPane 中添加三个 JButton 和一个 JSlider
将三个
JButton 的 focusable 属性设为
false,并将其文本(text)分别改为:
Stop、Play 和 Pause,再分别 Rename 为:btnStop、btnPlay 和 btnPause
为三个 JButton 添加 mouseClicked 事件,实现对应 停止、播放 和 暂停 的功能
将
Slider 的 focusable 属性设为
false
为
JSlider 添加 stateChanged 事件,实现 调节音量 的功能
在
bottomPane 的上方添加一个 JProgressBar
将
JProgressBar 的 focusable 属性设为
false,stringPainted 属性设为 true,
并 Rename 为:progress
为 JProgressBar 添加 mouseClicked 事件,实现 调节进度 的功能
在
JFrame 的上方添加一个 JMenuBar,注意:JMenuBar 和 contentPane 同级
制作
菜单栏,为
菜单项
添加
actionPerformed 事件,实现
打开视频、打开字幕 和 退出 的功能
整体的
Components 视图:

运行程序:


最后导出为可执行的
Java 程序:
选择工程
MyVideoPlayer,右键->Export->Java->Runnable JAR file
然后选择当前主类:VideoPlayer - MyVideoPlayer,导出
路径指定为:E:\workspace\MyVideoPlayer\release,并
命名为:MyVideoPlayer.jar

【made by siwuxie095】
Java视频播放器的制作的更多相关文章
- 制作Java视频播放器
一.工程准备 首先需要下载并安装VLC播放器,然后下载vlcj外部库. 下载slf4j中的slf4j-api-1.7.13.jar. slf4j- nop-1.7.13.jar 将vlc安装目录下的l ...
- IOS视频播放器的制作
利用自带MPMoviePlayerController来实现视频播放,首先要在项目中导入MediaPlayer.Framework框架包. 在视图控制器中 #import "MediaPla ...
- FFmpeg再学习 -- FFmpeg+SDL+MFC实现图形界面视频播放器
继续看雷霄骅的 课程资料 - 基于FFmpeg+SDL的视频播放器的制作最后一篇,主要是想学一下 MFC 创建和配置. 一.创建 MFC 工程 文件->新建->项目->Visual ...
- [刘阳Java]_酷炫视频播放器制作_JS篇
此文章是接着上次写的<酷炫视频播放器制作_界面篇>将其完善,我们主要给大家介绍一下如何利用JS脚本来控制视频的播放.为了让大家能够保持对要完成的功能有直接的了解,我们还是将效果图附到文章里 ...
- PyQT制作视频播放器
Python应用03 使用PyQT制作视频播放器 作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. 最近研究了Python的两个GUI包,Tki ...
- Android(java)学习笔记243:多媒体之视频播放器
1.这里我们还是利用案例演示视频播放器的使用: (1)首先,我们看看布局文件activity_main.xml,如下: <RelativeLayout xmlns:android="h ...
- 小强的HTML5移动开发之路(5)——制作一个漂亮的视频播放器
来自:http://blog.csdn.net/dawanganban/article/details/17679069 在前面几篇文章中介绍了HTML5的特点和需要掌握的基础知识,下面我们开始真正的 ...
- 制作VR视频播放器
最近VR火的不要不要的,但是综合起来,VR资源最多的还是全景图片和全景视频,今天在这里给大家简单介绍一下如何用Unity制作简单的VR视频播放器. 首先找到EasyMovieTexture这个插件,A ...
- c# 如何制作RealPlayer 视频播放器
c# 如何制作RealPlayer 视频播放器 主要介绍了如何使用 RealPlayer G2 Control 控件 那么我们怎么获得到这个控件呢,很简单,操作方法如下 右单击工具箱对话框的[所有 ...
随机推荐
- Lean In - 读书笔记
以下就是摘录了这本书中的相关内容. 他告诉我,想要“赢得每个人的喜欢”这种想法会阻碍我的发展.他说,当你想要让事情有所改变时,你不可能取悦每个人:而如果你去取悦每个人,你就不会获得充分的进步.扎克伯格 ...
- 【leetcode刷题笔记】Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters. For example, ...
- 从输入url到浏览器呈现网页发生了什么?
大致能分成两个部分:网络通信与页面渲染 一.网络通信 互联网各个网络设备间的通信均基于TCP/IP协议,此协议将整个过程进行分层,由上至下分别为: 应用层.传输层.网络层和数据链路层 1.输入URL ...
- msm8909+android5.1分区及烧录的镜像文件介绍【转】
本文转载自: EMMC的分区及其保存的文件 Partition label filename 说明 PrimaryGPT gpt_main0.bin modem NON-HLOS.bin sbl1 s ...
- Codeforces 294B Shaass and Bookshelf:dp
题目链接:http://codeforces.com/problemset/problem/294/B 题意: 有n本书,每本书的厚度为t[i],宽度为w[i] (1<=t[i]<=2, ...
- Codeforces 505C Mr. Kitayuta, the Treasure Hunter:dp【考虑可用范围】
题目链接:http://codeforces.com/problemset/problem/505/C 题意: 有n个宝石,分别在位置p[i].(1 <= n,p[i] <= 30000) ...
- 九 Django框架,Form表单验证
表单提交 html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Visual C++中min()和max()函数的使用
标准库在<algorithm>头中定义了两个模板函数std::min() 和 std::max().通常用它可以计算某个值对的最小值和最大值. 可惜在 Visual C++ 无法使用它们, ...
- jquery 整理笔记(一)
this:表示当前的上下文对象是一个html对象,可以调用html对象所拥有的属性,方法 $(this),代表的上下文对象是一个jquery的上下文对象,可以调用jquery的方法和属性值. each ...
- codeforces 707B B. Bakery(水题)
题目链接: B. Bakery 题意: 是否存在一条连接特殊和不特殊的边,存在最小值是多少; 思路: 扫一遍所有边: AC代码: #include <iostream> #include ...