好久没写东西了,最近也开始整理自己曾经学过的东西。在整理的过程中,我将会每周更新一些Java开发的过程中可能会用到的技术,比如,视频播放、office文档处理、二维码的生成和解析等技术。
本期,与大家分享的是利用vlc实现视频播放器的技术。首先大概介绍一下vlc,简单来说,vlc是一个通用的开源的视频播放软件,它的官网是:https://www.videolan.org/vlc/。而我们现在使用的是vlcj,一个在Java里嵌入VLC的解决方案,它的官方文档是https://github.com/caprica/vlcj、http://capricasoftware.co.uk/projects/vlcj-4/tutorials。
下面进入正题,首先我们准备项目需要的jar包和vlc软件,vlc-3.0.6-win64和相关的jar,他们可以通过官方文档进行下载,当然也可以通过此链接下载,当把相关东西下载好之后,废话不多说,直接上代码。
第一个类文件:
package my;
import java.io.File;
import com.sun.jna.NativeLibrary;
import uk.co.caprica.vlcj.binding.RuntimeUtil;
public class App
{
public static void creatGUI()
{
AppFrame frame = new AppFrame();
frame.setVisible(true);
}
public static void main(String[] args)
{
File vlcRoot = new File("C:\\Users\\andy\\Desktop\\02 视频播放\\(2) 项目准备\\vlcj\\vlc-3.0.6");
NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName()
,vlcRoot.getAbsolutePath() );
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run()
{
// TODO Auto-generated method stub
creatGUI();
}
});
}
}
第二类文件
package my;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.LayoutManager;
import java.io.File;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.filechooser.FileNameExtensionFilter;
import uk.co.caprica.vlcj.media.MediaRef;
import uk.co.caprica.vlcj.media.TrackType;
import uk.co.caprica.vlcj.player.base.MediaPlayer;
import uk.co.caprica.vlcj.player.base.MediaPlayerEventAdapter;
import uk.co.caprica.vlcj.player.base.MediaPlayerEventListener;
import uk.co.caprica.vlcj.player.component.EmbeddedMediaPlayerComponent;
public class AppFrame extends JFrame
{
// VLC控件
private EmbeddedMediaPlayerComponent vlc;
// 几个控件
JTextField pathField = new JTextField();
JButton openButton = new JButton("...");
// 进度显示
JSlider slider = new JSlider();
public AppFrame()
{
super("视频播放测试");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(640, 400);
// Content Pane
JPanel root = new JPanel();
this.setContentPane(root);
root.setLayout(new BorderLayout());
// 创建一个VLC控件
vlc = new EmbeddedMediaPlayerComponent();
root.add(vlc, BorderLayout.CENTER);
// 添加按钮控制
JPanel buttons = new JPanel();
root.add(buttons, BorderLayout.PAGE_START);
buttons.setLayout(new FlowLayout());
openButton.setFocusPainted(false);
buttons.add(pathField);
buttons.add(openButton);
// 选择视频文件,进行播放
openButton.addActionListener((e) -> {
openMedia();
});
//播放进度
Box bottom = Box.createVerticalBox();
bottom.add(slider);
slider.setMinimum(0);
slider.setMaximum(100);
slider.setValue(0);
root.add(bottom , BorderLayout.PAGE_END);
//初始化vlc
initVlcPlayer();
}
//初始化vlc
private void initVlcPlayer()
{
//播放视频中的几个事件
vlc.mediaPlayer().events().addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
@Override
public void error(MediaPlayer mediaPlayer)
{
// TODO Auto-generated method stub
super.error(mediaPlayer);
}
@Override
public void finished(MediaPlayer mediaPlayer)
{
System.out.println("finished ...");
}
@Override
public void lengthChanged(MediaPlayer mediaPlayer, long newLength)
{
// TODO Auto-generated method stub
super.lengthChanged(mediaPlayer, newLength);
}
@Override
public void playing(MediaPlayer mediaPlayer)
{
System.out.println("playing ...");
}
@Override
public void positionChanged(MediaPlayer mediaPlayer, float newPosition)
{
System.out.println("positionChanged.. " + newPosition);
slider.setValue( (int)(100 * newPosition));
}
@Override
public void timeChanged(MediaPlayer mediaPlayer, long newTime)
{
// TODO Auto-generated method stub
super.timeChanged(mediaPlayer, newTime);
}
});
}
private void openMedia()
{
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("视频", "mp4", "avi", "wmv");
chooser.setFileFilter(filter);
int ret = chooser.showOpenDialog(this);
if (ret == JFileChooser.APPROVE_OPTION)
{
// 结果为:已经存在的一个文件
File file = chooser.getSelectedFile();
pathField.setText(file.getAbsolutePath());
// 开始播放视频
vlc.mediaPlayer().media().play(file.getAbsolutePath());
}
}
}
最后,这个例子是基于swing写的,仅供参考。欢迎大家指出不足。