----------------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
void main(String[] args) {

 

//(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
void run() {

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
void process(java.util.List<Integer> chunks) {

//创建int型变量 value 接收 chunks 中的值

for (int value : chunks) {

frame.getProgressBar().setValue(value);

}

 

};

}.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 openVideo() {

//创建文件选择器: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
void openSubtitle() {

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
void exit() {

//在退出之前,先释放播放器的资源

frame.getMediaPlayer().release();

System.exit(0);

}

 

public static
void setVol(int vol) {

//设定音量

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
void actionPerformed(ActionEvent e) {

VideoPlayer.openVideo();

}

});

mnFile.add(mntmOpenvideo);

 

mntmOpensubtitle = new JMenuItem("OpenSubtitle");

mntmOpensubtitle.addActionListener(new ActionListener() {

public
void actionPerformed(ActionEvent e) {

VideoPlayer.openSubtitle();

}

});

mnFile.add(mntmOpensubtitle);

 

mntmExit = new JMenuItem("Exit");

mntmExit.addActionListener(new ActionListener() {

public
void actionPerformed(ActionEvent e) {

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
void stateChanged(ChangeEvent e) {

VideoPlayer.setVol(slider.getValue());

}

});

 

 

controlPane.add(slider);

 

progress = new JProgressBar();

progress.setFocusable(false);

 

//为进度条 progress 添加 mouseClicked 事件

progress.addMouseListener(new MouseAdapter() {

@Override

public
void mouseClicked(MouseEvent e) {

//获取鼠标点击在进度条上的位置

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
void mouseClicked(MouseEvent e) {

VideoPlayer.stop();

}

});

 

 
 

//为 Play 按钮添加 mouseClicked 事件

btnPlay.addMouseListener(new MouseAdapter() {

@Override

public
void mouseClicked(MouseEvent e) {

VideoPlayer.play();

}

});

 

 

//为 Pause 按钮添加 mouseClicked 事件

btnPause.addMouseListener(new MouseAdapter() {

@Override

public
void mouseClicked(MouseEvent e) {

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视频播放器的制作的更多相关文章

  1. 制作Java视频播放器

    一.工程准备 首先需要下载并安装VLC播放器,然后下载vlcj外部库. 下载slf4j中的slf4j-api-1.7.13.jar. slf4j- nop-1.7.13.jar 将vlc安装目录下的l ...

  2. IOS视频播放器的制作

    利用自带MPMoviePlayerController来实现视频播放,首先要在项目中导入MediaPlayer.Framework框架包. 在视图控制器中 #import "MediaPla ...

  3. FFmpeg再学习 -- FFmpeg+SDL+MFC实现图形界面视频播放器

    继续看雷霄骅的 课程资料 - 基于FFmpeg+SDL的视频播放器的制作最后一篇,主要是想学一下 MFC 创建和配置. 一.创建 MFC 工程 文件->新建->项目->Visual ...

  4. [刘阳Java]_酷炫视频播放器制作_JS篇

    此文章是接着上次写的<酷炫视频播放器制作_界面篇>将其完善,我们主要给大家介绍一下如何利用JS脚本来控制视频的播放.为了让大家能够保持对要完成的功能有直接的了解,我们还是将效果图附到文章里 ...

  5. PyQT制作视频播放器

    Python应用03 使用PyQT制作视频播放器   作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. 最近研究了Python的两个GUI包,Tki ...

  6. Android(java)学习笔记243:多媒体之视频播放器

    1.这里我们还是利用案例演示视频播放器的使用: (1)首先,我们看看布局文件activity_main.xml,如下: <RelativeLayout xmlns:android="h ...

  7. 小强的HTML5移动开发之路(5)——制作一个漂亮的视频播放器

    来自:http://blog.csdn.net/dawanganban/article/details/17679069 在前面几篇文章中介绍了HTML5的特点和需要掌握的基础知识,下面我们开始真正的 ...

  8. 制作VR视频播放器

    最近VR火的不要不要的,但是综合起来,VR资源最多的还是全景图片和全景视频,今天在这里给大家简单介绍一下如何用Unity制作简单的VR视频播放器. 首先找到EasyMovieTexture这个插件,A ...

  9. c# 如何制作RealPlayer 视频播放器

      c# 如何制作RealPlayer 视频播放器 主要介绍了如何使用 RealPlayer G2 Control 控件 那么我们怎么获得到这个控件呢,很简单,操作方法如下 右单击工具箱对话框的[所有 ...

随机推荐

  1. 3.22课·········CSS样式表

    CSS(Cascading Style Sheet,叠层样式表),作用是美化HTML网页. /*注释区域*/    此为注释语法 一.样式表 (一)样式表的分类 1.内联样式表 和HTML联合显示,控 ...

  2. 装箱问题【STL】

    7-9 装箱问题(20 分) 假设有N项物品,大小分别为s​1​​.s​2​​.-.s​i​​.-.s​N​​,其中s​i​​为满足1≤s​i​​≤100的整数.要把这些物品装入到容量为100的一批箱 ...

  3. NFS指定端口,NFS缓存

    nfs服务端: #编辑/etc/nfsmount.conf,在末尾添加: #RQUOTAD_PORT=30001#LOCKD_TCPPORT=30002#LOCKD_UDPPORT=30002#MOU ...

  4. hiho一下 第四十九周 题目1 : 欧拉路·一【无向图 欧拉路问题】

    题目1 : 欧拉路·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最 ...

  5. scp的用法

    scp是有Security的文件copy,基于ssh登录.命令基本格式:scp [OPTIONS] file_source file_target OPTIONS:-v 和大多数 linux 命令中的 ...

  6. 分享知识-快乐自己:Liunx-大数据(Hadoop)初始化环境搭建

    大数据初始化环境搭建: 一):大数据(hadoop)初始化环境搭建 二):大数据(hadoop)环境搭建 三):运行wordcount案例 四):揭秘HDFS 五):揭秘MapReduce 六):揭秘 ...

  7. 分享知识-快乐自己:Struts2 (常用的 constant 总结)

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-/ ...

  8. 浏览器访问web站点原理图

    启动tomcat,在浏览器中输入http://localhost:8080/web_kevin/hello.html,发生的事情如下: 1.浏览器解析主机名,即解析localhost.浏览器首先会到本 ...

  9. JQuery表单验证插件EasyValidator

    本插件的宗旨是:用户无需写一行JS验证代码,只需在要验证的表单中加入相应的验证属性即可,让验证功能易维护,可扩展,更容易上手. DEMO中已经包含了常用的正则表达式,可以直接复用,为了考虑扩展性,所以 ...

  10. 【BZOJ 4709】柠檬 斜率优化dp+单调栈

    题意 给$n$个贝壳,可以将贝壳分成若干段,每段选取一个贝壳$s_i$,这一段$s_i$的数目为$num$,可以得到$num^2\times s_i$个柠檬,求最多能得到几个柠檬 可以发现只有在一段中 ...