使用Java与VLC开发简易视频播放器:Eclipse与OpenCV实现多媒体作业

java创建简易视频播放器

使用Java与VLC开发简易视频播放器:Eclipse与OpenCV实现多媒体作业

更新时间为 2017 年 06 月 06 日 10 时 26 分 22 秒,作者是南柯一梦 xihe

这篇文章主要为大家详细介绍了相关资料,是关于用 java 创建简易视频播放器的。这些资料具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

最近有一个多媒体方面的作业,这个作业要求使用 visualC++ 和 OpenCV 来编写一个简单的视频播放器。对于那些不懂 C/C++ 的人来说,这是不可能完成的任务,所以就萌生了用 Java 来编写的想法。下面具体分享一下相关经验。

目标:制作简易视频播放器

开发工具:eclipse4.5.1;VLC2.2.1

完成了视频加载的功能,完成了视频播放的功能,完成了视频退出的功能;实现了在视频播放过程中对播放进程的控制;实现了在播放过程中对暂停的控制。

最终程序效果图如下:

开发过程参考学习资源:

极客学院视屏教程

GitHub

环境配置非常重要,它是关键的一步。如果开发环境没有配置好,那么其他的事情就都无法顺利进行,就如同瞎扯淡一般。

下载 vlc,即点击打开下载 vlc 的链接。然后,下载与自己电脑系统相对应的版本,并进行安装。

下载 vlcj(点击后开始下载),待下载文件解压完毕,将其所在目录下的

将 jna-3.5.2.jar 这个文件复制到对应的 java 工程目录下,并且新建一个 lib 文件夹;将 platform-3.5.2.jar 这个文件复制到对应的 java 工程目录下,并且新建一个 lib 文件夹;将 vlcj-3.8.0.jar 这个文件复制到对应的 java 工程目录下,并且新建一个 lib 文件夹(不同版本后缀数字可能会不同)。

下载 slf4j,也就是点击打开 slf4j 的下载链接。下载完成文件后,进行解压操作,然后将解压后的目录下的 slf4j-api-1.7.13.jar 等相关文件进行处理。

将 slf4j-nop-1.7.13.jar(不同版本后缀数字可能不同)这一个文件复制到新建的 lib 文件夹中,该 lib 文件夹位于对应的 java 工程目录下;

将 vlc 安装目录下的 plugins 文件夹复制到对应的 java 工程目录下。

环境文件的导入至此已基本完成。接着进入 eclipse,把 lib 文件夹下面的 5 个.jar 文件添加到工作路径。完成这一步后,java 工程的目录结构呈现如下情况:

java工程下的包里是具体的程序实现代码。

各种环境文件导入到 java 工程之后,还需要进行一些配置,这样才有可能将其配置到最终的工作环境中。

在 java 工程中新建两个包,一个包用于存放程序主文件,另一个包用于存放窗体文件。接着在主程序包下创建一个主类,该主类的 main 函数进行如下配置:

公共静态的 void 方法 main,其参数为 String 类型的数组 args。
//环境配置,将vlc sdk导入到eclipse
如果运行时工具是 Windows 系统,那么就进行相应的操作;如果运行时工具不是 Windows 系统,就不进行相应的操作。
NativeLibrary.addSearchPath(
RuntimeUtil 获取 LibVlc 库的名称,其路径为 "D:\\Program Files\\VideoLAN\\VLC\\sdk\\lib"
//导入的路径是vlc的安装路径
Native 加载了名为 RuntimeUtil.getLibVlcLibraryName() 的库,该库的类为 LibVlc 。
LibVlc.INSTANCE.libvlc_get_version() 的结果会被输出到控制台。
}

保存后运行该程序,若不报错,就表明开发环境已配置完成;若报错,可参照上文提及的参考学习资源来解决问题。

接下来是具体的编码环节。如果遇到问题,可以参照 java 学习工具。

具体代码如下:

主文件类PlayerMain:

/*主程序*/
package VideoPlayer.Main;
import java.awt.EventQueue;
import java.io.File;
使用 javax.swing 中的 JFileChooser 类。
引入 javax.swing.SwingWorker;
import com.sun.jna.Native;
引入 com.sun.jna 这个类库中的 NativeLibrary 类。
引入 VideoPlayer.Window 中的 Window 类。
引入 uk.co.caprica.vlcj.binding 中的 LibVlc 。
需要导入 uk.co.caprica.vlcj.runtime 包中的 RuntimeUtil 类。
public class PlayerMain {
 static Window frame;
private static final String 表示私有静态常量,NATIVE_LIBRARY_SEARCH_PATH 为原生库搜索路径,其值为 "D:\\Program Files\\VideoLAN\\VLC\\sdk\\lib" 。
public static void main 方法,参数为 String 类型的数组 args 。
 
 //环境配置,将vlc sdk导入到eclipse
 
如果运行时工具是 Windows 系统,那么就执行相应的操作。如果运行时工具不是 Windows 系统,就不执行相应的操作。
 NativeLibrary.addSearchPath(
RuntimeUtil 获取 LibVlc 库的名称,“D:\\Program Files\\VideoLAN\\VLC\\sdk\\lib”;导入的路径即为 vlc 的安装路径。
Native 加载了名为 RuntimeUtil.getLibVlcLibraryName() 的库,该库的类为 LibVlc。
调用 LibVlc.INSTANCE.libvlc_get_version() 方法,并将其输出到控制台。
 //创建主程序界面运行窗体
EventQueue 调用稍后执行的一个新的 Runnable 实例,该实例包含的代码将在事件队列的下一个空闲时间点被执行。 这个 Runnable 实例内部的代码会在一个单独的线程中异步运行,不会阻塞当前线程的执行。 它可以用于在事件分发线程(EDT)上安排后续的任务或更新 UI 组件等操作。 这样可以确保 UI 的更新是在事件队列的上下文中进行的,以保持界面的响应性和一致性。
 
 @Override
 public void run() {
以下是改写后的句子:需要使用中文来重新表述给定的内容,在改写过程中要避免使用原文中已用过的词语,可对句子结构和用词进行调整、充实,以达到差异最大化,同时要保留原意,禁止修改专有名词,禁止穿插英文单词。
 try{
  frame=new Window();
  frame.setVisible(true);
使用 frame.getMediaPlayer() 来播放视频,其参数为视频文件的绝对路径 F:\\Videos\\Let.mp4 ,从而实现直接播放视频的效果。
媒体播放器准备播放“F:\\Videos\\Let_It_Go.mp4”这个视频。
  new SwingWorker() {
  @Override
在后台执行的操作被保护起来。这个操作会抛出异常。它在后台执行特定的任务。
以下是改写后的句子:需要对以下内容进行处理,具体操作暂未明确,仅给出此说明。
//并且将其按百分比的形式进行显示
获取到的媒体播放器的长度赋值给了 long 类型的 total,这个长度是通过 frame.getMediaPlayer().getLength() 方法获取到的。
获取到的当前时间为 long curr,这个时间是通过 frame.getMediaPlayer().getTime() 获取到的。
将当前值 curr 转换为浮点数类型后除以总值 total,得到的结果赋值给浮点数 percent 。
  publish((int)(percent*100));
  Thread.sleep(100);
  } 
  //return null;
  }
  
对一个名为 java.util.List 的对象进行处理。 chunks) {
  for(int v:chunks){
frame 的进度条获取到的值并设置为 v 。
  } 
  }
  }.execute();
 }catch(Exception e){
  e.printStackTrace();
 }
 }
 });
 }
 
 //打开文件
公共静态的 void 方法用于打开视频。
创建了一个 JFileChooser 对象,这个对象被命名为 chooser 。
通过 chooser 显示打开对话框,该对话框的返回值被存储在变量 v 中,其返回值为 null 时的情况。
如果 v 等于 JFileChooser.APPROVE_OPTION 。
选择器选中的文件被获取到并赋值给了文件对象 file 。
获取到的 frame 调用其 getMediaPlayer()方法,然后使用该方法播放 file 的绝对路径 file.getAbsolutePath()。
 }
 }
 
 //退出播放
 public static void exit() {
获取到的 frame 中的媒体播放器被释放了。
 System.exit(0);
 }
 //实现播放按钮的方法
 public static void play() {
获取到的 frame 调用其 getMediaPlayer() 方法,然后让获取到的媒体播放器进行播放操作。
 }
 
 //实现暂停按钮的方法
 public static void pause() {
获取到的 frame 中的媒体播放器被暂停了。
 }
 
 //实现停止按钮的方法
 public static void stop() {
MediaPlayer 在 frame 中被停止了。
 }
 
 //实现点击进度条跳转的方法
公共静态的方法用于跳转到指定的浮点数位置。具体来说,就是要将当前的状态或位置跳转到给定的浮点数“to”所表示的位置。
frame 的媒体播放器获取到时间,将其设置为(长整型)(to 乘以 frame 的媒体播放器的长度)。
 }
 
 //实现控制声音的方法
公共静态方法用于设置音量,参数为整数 v 。 该方法的作用是设置音量相关的值。 它接收一个整数类型的参数 v ,通过这个参数来确定要设置的音量大小。 这个方法主要是针对音量设置进行操作的。 它会根据传入的 v 值来调整音量的设置。
语言风格:保持原文风格,去掉最前面的序号,把
 }
 
}

窗体文件类Window:

/*视屏播放器主界面*/
package VideoPlayer.Window;
import java.awt.BorderLayout;
import java.awt.EventQueue;
导入 Java 的 awt 事件包中的 ActionEvent 类。
引入了 Java 的 awt 事件中的 ActionListener 类。
引入了 Java 的 awt 事件包中的 MouseAdapter 类。
引入 Java 的 awt 事件中的鼠标事件类。
引入 Java 的 awt 事件中的鼠标监听器。
导入 Java 的 PropertyChangeEvent 类。
导入 Java 的属性变更监听器类。
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
需要导入用于显示进度条的类,即 javax.swing 包中的 JProgressBar 类。
import javax.swing.JSlider;
引入 javax.swing.border.EmptyBorder 类;使用 javax.swing.border.EmptyBorder 类;导入 javax.swing.border.EmptyBorder 类。
引入 javax.swing.event.ChangeEvent 类。
将 javax.swing.event 包中的 ChangeListener 类进行导入处理;
导入 VideoPlayer 主目录下的 PlayerMain 类。
引入 uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent 这个类。
引入 uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
公共类 Window 继承自 JFrame 类。
 
顶层容器是 private JPanel contentPane,它是整个播放页面的容器。
有一个私有的 JMenuBar,它是菜单栏。
有 private 类型的 JMenu 分别是 mnFile、mnSetting、mnHelp,这些是文件菜单。
有两个私有 JMenuItem,分别是 mnOpenVideo 和 mnExit。它们属于文件菜单的子目录,一个用于打开视频,另一个用于退出。
有一个私有 JPanel 类型的 panel,它是控制区域的容器。
有一个私有类型的 JProgressBar 叫做 progress,它是用于表示进度的。
有一个名为 progressPanel 的私有 JPanel ,它是进度条的容器。
一个名为 controlPanel 的 JPanel 是用于存放控制按钮的容器。
有 private JButton 类型的 btnStop、btnPlay、btnPause 这三个控制按钮,分别用于停止、播放、暂停操作。
创建了一个私有类型的 JSlider 组件,它被用于声音的控制。
 
 
存在一个名为 EmbeddedMediaPlayerComponent 的 playerComponent,它是媒体播放器组件。
 
 public static void main(String[] args) {
 
 }
 //MainWindow构造方法,创建视屏播放的主界面
 public Window(){
设置标题为“VideoPlayer Copyright@2015 由南柯一梦所拥有”;将标题设置为“VideoPlayer Copyright@2015 是南柯一梦的”;给标题设定为“VideoPlayer Copyright@2015 属于南柯一梦”
设置默认的关闭操作,即当框架关闭时退出程序;设置框架的关闭操作属性为 JFrame.EXIT_ON_CLOSE;将框架的关闭操作设定为 JFrame.EXIT_ON_CLOSE 这个值,以实现关闭框架时程序退出的功能。
 setBounds(200,80,900,600);
 contentPane=new JPanel();
contentPane 被设置了一个边框,这个边框是一个新的 EmptyBorder,其上下左右的边距分别为 5。
contentPane 采用了新的 BorderLayout 布局,水平间距为 0,垂直间距也为 0。
 setContentPane(contentPane);
 
 
 /*视频播放窗口中的菜单栏*/
 menuBar=new JMenuBar();
 setJMenuBar(menuBar);
 
创建了一个名为 mnFile 的 JMenu,将其菜单名设置为“文件”。
 menuBar.add(mnFile);
 mnSetting=new JMenu("设置");
 menuBar.add(mnSetting);
 mnHelp=new JMenu("帮助");
 menuBar.add(mnHelp);
 
mnOpenVideo 被创建为一个新的 JMenuItem,其文本内容为“打开文件”,用于设置文件菜单的子目录为打开文件。
 mnFile.add(mnOpenVideo);
 
mnExit 是一个新创建的 JMenuItem,其文本内容为“退出”;它被用于设置文件菜单的子目录为“退出”。
 mnFile.add(mnExit);
 
 //打开文件
mnOpenVideo 为一个组件,它添加了一个动作监听器,这个动作监听器是一个实现了 ActionListener 接口的匿名内部类。
 
 @Override
当发生动作事件 e 时,公共的 void 方法 actionPerformed 会被执行。
 // TODO Auto-generated method stub
 PlayerMain.openVideo();
 }
 });
 
 //退出
mnExit 为一个组件,它添加了一个动作监听器,该动作监听器是一个实现了 ActionListener 接口的匿名内部类,在这个匿名内部类的 actionPerformed 方法中可以编写处理 mnExit 组件触发动作的逻辑代码。
 
 @Override
 public void actionPerformed(ActionEvent e) {
 // TODO Auto-generated method stub
 PlayerMain.exit();
 }
 });
 
 
 /*视屏窗口中播放界面部分*/
JPanel 被创建出来,它被命名为 videoPane,并且是一个 JPanel 类型的对象。
contentPane 把 videoPane 添加到了 BorderLayout.CENTER 位置。
视频面板设置了新的边框布局,水平和垂直间距都为 0 。
 
创建了一个名为 playerComponent 的嵌入式媒体播放器组件。
视频窗格添加了播放器组件。
 
 /*视屏窗口中控制部分*/
 
创建了一个名为 panel 的对象,该对象是一个 JPanel 类型的实例,用于实例化控制区域的容器。
videoPane 向其容器中添加了 panel,添加的位置是 BorderLayout 的 SOUTH 方向。
 
实例化了一个名为 progressPanel 的 JPanel 对象,用于作为进度条的容器。
panel 将 progressPanel 添加到了 BorderLayout 的 NORTH 位置。
 //添加进度条
 progress=new JProgressBar(); 
 progressPanel.add(progress);
panel 添加了 progress,添加的位置在 BorderLayout 的 NORTH 方向。
progress 增加了一个鼠标监听器,这个监听器是一个 MouseAdapter 的实例。
 @Override
公共的 void 方法 mouseClicked,该方法接收一个 MouseEvent 类型的参数 e,用于在点击进度条时调整视频的播放进度。
 int x=e.getX();
PlayerMain 跳转到 (float)x 除以 progress.getWidth() 的结果。
 }
 });
progress 被设置为字符串绘制为真。
 
 
创建了一个名为 controlPanel 的 JPanel 对象,用于实例化控制按钮容器。
panel 向其布局中添加了 controlPanel,添加的位置在 BorderLayout 的南方。
 
 //添加停止按钮
 btnStop=new JButton("停止");
btnStop 增加了一个鼠标监听器,这个监听器是一个 MouseAdapter 的实例。
 @Override
当鼠标被点击时,会触发此方法。此方法接收一个 MouseEvent 类型的参数 e。通过这个参数 e 可以获取到关于鼠标点击事件的相关信息。
 // TODO Auto-generated method stub
 PlayerMain.stop();
 }
 });
 controlPanel.add(btnStop);
 
 //添加播放按钮
 btnPlay=new JButton("播放");
btnPlay 增加了鼠标监听器,这个监听器是一个新的 MouseAdapter()。
 @Override
 public void mouseClicked(MouseEvent e) {
 // TODO Auto-generated method stub
 PlayerMain.play();
 }
 });
 controlPanel.add(btnPlay);
 
 //添加暂停按钮
 btnPause=new JButton("暂停");
btnPause 为其添加了鼠标监听器,这个鼠标监听器是一个新的 MouseAdapter()对象。
 @Override
 public void mouseClicked(MouseEvent e) {
 // TODO Auto-generated method stub
 PlayerMain.pause();
 }
 });
 controlPanel.add(btnPause);
 
 //添加声音控制块
 slider=new JSlider();
 slider.setValue(80);
 slider.setMaximum(100);
slider 新增了一个变更监听器,这个监听器是一个实现了 ChangeListener 接口的对象。它用于监听 slider 的状态变化,并在状态发生改变时执行相应的操作。
 
 @Override
公共的 void 方法 stateChanged(ChangeEvent e) ,用于处理状态改变的相关操作。当发生状态改变事件时,此方法会被触发并执行相应的逻辑。它是一个用于响应状态变化的特定方法,在特定的编程环境或框架中被定义和使用,以实现对状态变化的监控和处理。
 // TODO Auto-generated method stub
PlayerMain 会将滑块的值设置为音量值。 即 PlayerMain.setVol(slider.getValue()) 表示把滑块当前的值赋予 PlayerMain 的音量设置。 这意味着通过调整滑块的位置,就能改变 PlayerMain 的音量大小,当滑块的值发生变化时,PlayerMain 的音量也会相应地进行调整。
 }
 });
 controlPanel.add(slider);
 }
 
 //获取播放媒体实例(某个视频)
获取媒体播放器的方法是 public EmbeddedMediaPlayer getMediaPlayer()。
获取播放器组件中的媒体播放器并返回。
 }
 
 //获取进度条实例
获取进度条的方法是一个公共的 JProgressBar 方法。
 return progress;
 }
 
}

至此使用java开发简易的视频播放器就已经完成了。

本文就这些内容啦,希望能助力大家学习,也期望大家多多支持脚本之家。

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

25阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

25阅读