应用场景
1. 播放 海康 或者 大华 监控的 rtsp 实时视频流。
2. 有跨多个系统平台的视频播放需求。
准备材料
1. vlcj程序包,下载地址:
2. vlc软件,下载地址:
3. rtsp视频流:海康或者大华的摄像头账号,并设置rtsp视频流为开启状态。
操作步骤(以windows系统为例)
1. 下载vlc软件;
2. 安装vlc-3.0.16-win32.exe文件到系统中,安装路径为C:\Program Files\VideoLAN\VLC;
3. 下载vlcj程序包;
4. 复制程序包中的jar包到Java项目中,将jar包添加到项目运行环境中。
5. 编写播放器实现程序;
程序实现步骤
第一步,开启vlcj的自动发现本地库。
第二步,指定加载VLC的路径。
第三步,根据摄像头参数配置,拼装rtsp协议请求字符串。
第四步,创建播放窗体。
第五步,获取vlcj的播放器,将rstp参数传入播放器,调用播放方法。
实战代码
package cn.easthope.lk.LKClient.biz;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing. JFrame ;
import javax.swing. JPanel ;
import javax.swing.border.EmptyBorder;
import org.apache. log4j .Logger;
import com.sun.jna.NativeLibrary;
import uk.co.caprica.vlcj.binding.LibVlc;
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.discovery.NativeDiscovery;
import uk.co.caprica.vlcj.player.MediaPlayer;
import uk.co.caprica.vlcj.runtime.RuntimeUtil;
/*****
* @author chenliang
* @date 2021.7.30
* ****/
public class VlcjPlayer {
protected Logger logger = Logger.getLogger(VlcjPlayer.class);
public static VlcjPlayer ins;
public List<EmbeddedMediaPlayerComponent> playerEmList = new ArrayList<EmbeddedMediaPlayerComponent>();
public static VlcjPlayer getInstance() {
if (ins == null) {
ins = new VlcjPlayer();
}
return ins;
}
/**
* @Title: Rtsp Url拼装
* @Description: url拼装
* @param ip
* @param username
* @param password
* @param channel
* @return
* @return CameraPojo
* @throws IOException
**/
public String buildRtspUrl(String ip, String username, String password, String channel,
String manufacturer) {
String rtsp = "";
String stream = "main";
String IP = ip;
// --------------直播流拼接地址-----------------
if("HK".equals(manufacturer)){
//海康摄像头RSTP地址拼接
// rtsp://admin:111@127.0.0.1:554/h265/ch1/main/av_stream
rtsp = "rtsp://" + username + ":" + password + "@" + IP + ":554/h265/ch" + channel + "/" + stream + "/av_stream";
}else if("DH".equals(manufacturer)){//大华摄像头RSTP地址拼接
// 大华 rtsp://admin:111@127.0.0.1:37777/cam/realmonitor?channel=1&subtype=0
stream = "main".equalsIgnoreCase(stream)?"0":"1";
rtsp = "rtsp://" + username + ":" + password + "@" + IP + ":554/cam/realmonitor?channel=" + channel + "&subtype=" + stream;
}
logger.info("--->" + rtsp);
return rtsp;
}
public boolean initVlc() {
//实例化NativeDiscovery类
boolean found = new NativeDiscovery().discover();
//通过判断选择系统,Windows, Mac OS ,Liunx。以下都是各个系统的VLC默认安装路径
if (RuntimeUtil.isWindows()) {
NativeLibrary.addSearchPath(
RuntimeUtil.getLibVlcLibraryName(), "C:\\Program Files\\VideoLAN\\VLC");
}else if (RuntimeUtil.isMac()) {
NativeLibrary.addSearchPath(
RuntimeUtil.getLibVlcLibraryName(), "/Applications/VLC.app/Contents/MacOS/lib");
}else if (RuntimeUtil.isNix()) {
NativeLibrary.addSearchPath(
RuntimeUtil.getLibVlcLibraryName(), "/home/linux/vlc/install/lib");
}
// NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), FileUtil.DLL_PATH+"//Dll//vlc");
// boolean found = new NativeDiscovery().discover();
System.out.println(found);
System.out.println(LibVlc.INSTANCE.libvlc_get_version());
return found;
}
private VlcjPlayer() {
}
public void showDemo() {
JFrame frame = new JFrame("vlcDemo");
EmbeddedMediaPlayerComponent mediaPlayerComponent = new EmbeddedMediaPlayerComponent();
mediaPlayerComponent.setSize(980, 960);
frame.getContentPane().setLayout(null);
frame.add(mediaPlayerComponent);
frame.setLocation(100, 100);
frame.setSize(940, 824);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
MediaPlayer player = mediaPlayerComponent.getMediaPlayer();
String[] options =
{"video-filter=motionblur", "network-caching=200", "no-plugins-cache"};
player.playMedia("rtsp://admin:xl@123456@127.0.0.1:554/h265/ch1/main/av_stream",options);
player.stop();
player.start();
}
public void playBoy(JPanel contentPane,JPanel videopanel,EmbeddedMediaPlayerComponent playerComponent,String rtsp) {
//将播放器界面添加到videopanel中,用来播放视频,并设置布局为居中
MediaPlayer player = playerComponent.getMediaPlayer();
playerEmList.add(playerComponent);
String[] options =
{"video-filter=motionblur", "network-caching=200", "no-plugins-cache"};
player.playMedia(rtsp,options);
player.start();
videopanel.repaint();
}
/***
* 释放视频资源
* @author chenl285
* @date 2021.7.29
* ***/
public void release() {
for (EmbeddedMediaPlayerComponent emp : playerEmList) {
emp.getMediaPlayer().release();
emp.release();
}
}
public static void main(String[] args) {
// new VlcjPlayer().showDemo();
//
VlcjPlayer vp = VlcjPlayer.getInstance();
vp.initVlc();
String rtsp = "rtsp://admin:111@127.0.0.1:554/h265/ch1/main/av_stream";
EmbeddedMediaPlayerComponent playerComponent = new EmbeddedMediaPlayerComponent();
EmbeddedMediaPlayerComponent playerComponent2 = new EmbeddedMediaPlayerComponent();
JFrame frame = new JFrame("vlcDemo");
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(100, 100, 1200, 300);
JPanel contentPane;
//创建播放器界面组件
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new GridLayout(1, 4));
frame.setContentPane(contentPane);
JPanel videopanel = new JPanel();
//因为playerComponent布局为边界布局,所以Jpanl布局也必须边界布局,不然只能听到声音,看不到画面
contentPane.add(videopanel);
videopanel.setLayout(new BorderLayout(0, 0));
videopanel.add(playerComponent, BorderLayout.CENTER);
// 加载第二个视频
JPanel videopanel2 = new JPanel();
//因为playerComponent布局为边界布局,所以Jpanl布局也必须边界布局,不然只能听到声音,看不到画面
contentPane.add(videopanel2);
videopanel2.setLayout(new BorderLayout(0, 0));
videopanel2.add(playerComponent2, BorderLayout.CENTER);
frame.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
vp.release();
System.exit(0);
}
});
// 添加第一个监控
vp.playBoy(contentPane,videopanel,playerComponent,rtsp);
// 添加第二个监控
vp.playBoy(contentPane,videopanel2,playerComponent2,rtsp);
}
}