700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 二 JAVA调用海康威视SDK实现摄像头预览完整版

二 JAVA调用海康威视SDK实现摄像头预览完整版

时间:2021-06-25 21:34:16

相关推荐

二 JAVA调用海康威视SDK实现摄像头预览完整版

接上一章:一、JAVA调用海康威视SDK实现摄像头预览

添加摄像头信息输入框添加视频控制按钮添加截图功能

代码:

PreView.java

package com.kx.hcws;import javax.swing.JFrame;import javax.swing.JPopupMenu;import com.kx.hcws.sdk.HCNetSDK;import com.kx.hcws.sdk.HCNetSDKManger;import com.kx.hcws.ui.Player;public class PreView {// private static String ip;// private static String username;// private static String password;public static void main(String[] args) {// 确保一个漂亮的外观风格JFrame.setDefaultLookAndFeelDecorated(true);JPopupMenu.setDefaultLightWeightPopupEnabled(false);// 防止被播放窗口(AWT组件)覆盖// 显示应用 GUIjavax.swing.SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {// 初始化海康播放器HCNetSDKManger.init();_DVR_Init();_DVR_SetConnectTime(5000, 5);_DVR_SetReconnect(1000, true);/** IP地址:摄像头IP地址。 用户名:摄像头登录用户名。 密码:摄像头验证码。 摄像头编号:可以自定义。* * "192.168.2.18", "admin", "axjy123456", 8000, 1L*/new Player();}});}}

HcPlayerPanel.java

package com.kx.hcws.ui;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import javax.swing.JOptionPane;import javax.swing.JPanel;import com.kx.hcws.sdk.HCNetSDK;import com.kx.hcws.sdk.HCNetSDK.FExceptionCallBack;import com.kx.hcws.sdk.HCNetSDKManger;import com.kx.hcws.sdk.PlayCtrl;import com.sun.jna.Native;import com.sun.jna.NativeLong;import com.sun.jna.Pointer;import com.sun.jna.examples.win32.W32API.HWND;import com.sun.jna.ptr.IntByReference;import com.sun.jna.ptr.NativeLongByReference;public class HcPlayerPanel extends JPanel {private static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(HcPlayerPanel.class);/*** */private static final long serialVersionUID = 1L;// 播放控制private static PlayCtrl playControl = PlayCtrl.INSTANCE;private String m_sDeviceIP;private String username;private String password;private int port;private Long deviceId = 1L;private long iChannelNum;private boolean isplay = false;// 用户参数private _DVR_CLIENTINFO m_strClientInfo;// 预览句柄private NativeLong lPreviewHandle = new NativeLong(-1);// 播放界面public java.awt.Panel panelRealplay = new java.awt.Panel();public javax.swing.JPanel jPanelRealplayArea = new javax.swing.JPanel();// 设备指针private NativeLongByReference devicePoint;// 播放端口private NativeLongByReference m_lPort = new NativeLongByReference(new NativeLong(-1));// 异常回调private FExceptionCallBack exceptionCallBack = new FExceptionCallBack() {@Overridepublic void invoke(int dwType, NativeLong lUserID, NativeLong lHandle, Pointer pUser) {NativeLong deviceid = pUser.getNativeLong(0);System.out.println("预览异常:dwType=" + dwType + ",lUserID=" + lUserID + ",lHandle=" + lHandle + ",pUser="+ deviceid.intValue());// EXCEPTION_EXCHANGE = 0x8000;// 用户交互时异常// EXCEPTION_AUDIOEXCHANGE = 0x8001;//语音对讲异常// EXCEPTION_ALARM = 0x8002;// 报警异常// EXCEPTION_PREVIEW = 0x8003;// 网络预览异常// EXCEPTION_SERIAL = 0x8004;// 透明通道异常// EXCEPTION_RECONNECT = 0x8005; // 预览时重连// EXCEPTION_ALARMRECONNECT = 0x8006;//报警时重连// EXCEPTION_SERIALRECONNECT = 0x8007;//透明通道重连// EXCEPTION_PLAYBACK = 0x8010;// 回放异常// EXCEPTION_DISKFMT = 0x8011;// 硬盘格式化if (dwType == HCNetSDK.EXCEPTION_ALARM || dwType == HCNetSDK.EXCEPTION_RECONNECT|| dwType == HCNetSDK.EXCEPTION_ALARMRECONNECT || dwType == HCNetSDK.EXCEPTION_SERIALRECONNECT|| dwType == HCNetSDK.EXCEPTION_PLAYBACK || dwType == 32971 || dwType == 32776 || dwType == 32789|| dwType == 32790 || dwType == 32791 || dwType == 32776 || dwType == 32793 || dwType == 32800|| dwType == 32804 || dwType == 32805 || dwType == 32832 || dwType == 32833 || dwType == 32834) {return;}}};public HcPlayerPanel() {init();}/*** 开始,传入对应参数* * @param m_sDeviceIP* @param username* @param password* @param port* @param deviceId*/public void start(String m_sDeviceIP, String username, String password, int port, Long deviceId) {this.m_sDeviceIP = m_sDeviceIP;this.username = username;this.password = password;this.port = port;this.deviceId = deviceId;}/*** 初始化组件*/private void init() {panelRealplay.setBackground(Color.BLACK);jPanelRealplayArea.setBackground(Color.BLACK);javax.swing.GroupLayout panelRealplayLayout = new javax.swing.GroupLayout(panelRealplay);panelRealplay.setLayout(panelRealplayLayout);javax.swing.GroupLayout jPanelRealplayAreaLayout = new javax.swing.GroupLayout(jPanelRealplayArea);jPanelRealplayArea.setLayout(jPanelRealplayAreaLayout);jPanelRealplayAreaLayout.setHorizontalGroup(jPanelRealplayAreaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(panelRealplay, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE));jPanelRealplayAreaLayout.setVerticalGroup(jPanelRealplayAreaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(panelRealplay,javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE));devicePoint = new NativeLongByReference(new NativeLong(deviceId));// 设备编号panelRealplay.setPreferredSize(new Dimension(getWidth(), getHeight()));// 注册异常信息_DVR_SetExceptionCallBack_V30(0, 0, exceptionCallBack, devicePoint.getPointer());}/*** 开始播放*/public void play() {NativeLong lUserID = new NativeLong(-1);// 用户句柄if (lUserID.longValue() > -1) {// 不注销// 先注销_DVR_Logout_V30(lUserID);lUserID = new NativeLong(-1);}// 注册_DVR_DEVICEINFO_V30 m_strDeviceInfo = new _DVR_DEVICEINFO_V30();lUserID = _DVR_Login_V30(m_sDeviceIP, (short) port, username, password,m_strDeviceInfo);long userID = lUserID.longValue();if (userID == -1) {System.out.println(_DVR_GetLastError());System.out.println("设备注册失败:" + m_sDeviceIP + "--" + username + "--" + password + "--" + port);JOptionPane.showMessageDialog(this, "注册失败");return;} else {// CreateDeviceTree();}if (lUserID == null || lUserID.intValue() == -1) {logger.info("注册失败");return;}panelRealplay.setPreferredSize(new Dimension(getWidth(), getHeight()));removeAll();add(jPanelRealplayArea, BorderLayout.CENTER);revalidate();// 获取窗口句柄HWND hwnd = new HWND(Native.getComponentPointer(panelRealplay));// 获取通道号IntByReference ibrBytesReturned = new IntByReference(0);// 获取IP接入配置参数boolean bRet = false;_DVR_IPPARACFG m_strIpparaCfg = new _DVR_IPPARACFG();m_strIpparaCfg.write();Pointer lpIpParaConfig = m_strIpparaCfg.getPointer();bRet = _DVR_GetDVRConfig(lUserID, _DVR_GET_IPPARACFG, new NativeLong(0),lpIpParaConfig, m_strIpparaCfg.size(), ibrBytesReturned);m_strIpparaCfg.read();// 设备支持IP通道String sChannelName = "";if (!bRet) {// 设备不支持,则表示没有IP通道for (int iChannum = 0; iChannum < m_strDeviceInfo.byChanNum; iChannum++) {sChannelName = "Camera" + (iChannum + m_strDeviceInfo.byStartChan);}} else {// 设备支持IP通道for (int iChannum = 0; iChannum < m_strDeviceInfo.byChanNum; iChannum++) {if (m_strIpparaCfg.byAnalogChanEnable[iChannum] == 1) {sChannelName = "Camera" + (iChannum + m_strDeviceInfo.byStartChan);}}for (int iChannum = 0; iChannum < HCNetSDK.MAX_IP_CHANNEL; iChannum++)if (m_strIpparaCfg.struIPChanInfo[iChannum].byEnable == 1) {sChannelName = "IPCamera" + (iChannum + m_strDeviceInfo.byStartChan);}}iChannelNum = -1;if (sChannelName.charAt(0) == 'C') {// Camara开头表示模拟通道// 子字符串中获取通道号iChannelNum = Integer.parseInt(sChannelName.substring(6));} else {if (sChannelName.charAt(0) == 'I') {// IPCamara开头表示IP通道,子字符创中获取通道号,IP通道号要加32iChannelNum = Integer.parseInt(sChannelName.substring(8)) + 32;} else {logger.info("通道号获取失败");return;}}if (iChannelNum == -1) {logger.info("请选择要预览的通道");return;}m_strClientInfo = new _DVR_CLIENTINFO();m_strClientInfo.lChannel = new NativeLong(iChannelNum);m_strClientInfo.hPlayWnd = hwnd;lPreviewHandle = _DVR_RealPlay_V30(lUserID, m_strClientInfo, null, null, true);long previewSucValue = lPreviewHandle.longValue();// 预览失败时:if (previewSucValue == -1) {System.out.println("预览失败:" + _DVR_GetLastError());return;}System.out.println("预览成功!");validate();isplay = true;}/*** 停止播放*/public void stop() {logger.info("设备" + deviceId + "停止播放===================");if (lPreviewHandle != null && lPreviewHandle.longValue() != -1) {if (!_DVR_StopRealPlay(lPreviewHandle)) {logger.info("设备" + deviceId + "停止播放失败");}if (m_lPort.getValue().intValue() != -1) {if (!playControl.PlayM4_Stop(m_lPort.getValue())) {logger.info("设备" + deviceId + "停止播放失败");}m_lPort.setValue(new NativeLong(-1));}}panelRealplay.repaint();isplay = false;}public boolean isIsplay() {return isplay;}/*** 实现截图*/public void snapshot(String filepath) {if (!_DVR_CapturePicture(lPreviewHandle, filepath)) {JOptionPane.showMessageDialog(this, "设备截屏失败:" + _DVR_GetLastError());System.out.println("设备截屏失败:" + _DVR_GetLastError());}else{JOptionPane.showMessageDialog(this, "截图成功!");}}}

Player.java

package com.kx.hcws.ui;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;import java.util.Date;import javax.swing.JButton;import javax.swing.JFileChooser;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JPasswordField;import javax.swing.JTextField;public class Player extends JFrame implements WindowListener {/*** */private static final long serialVersionUID = 1L;private HcPlayerPanel playerPanel;private JTextField ipField;private JTextField usernameField;private JPasswordField pwdField;public Player() {setSize(1200, 600);setResizable(true);setTitle("设备预览");setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 关闭窗口时关闭系统getContentPane().setLayout(new BorderLayout());playerPanel = new HcPlayerPanel();playerPanel.setBackground(Color.BLACK);playerPanel.setPreferredSize(new Dimension(1000, 600));getContentPane().add(playerPanel, BorderLayout.CENTER);initCtrlPanel();setVisible(true);}private void initCtrlPanel() {JPanel content = new JPanel();content.setLayout(new FlowLayout());{// IPJLabel jLabel = new JLabel("IP:");jLabel.setPreferredSize(new Dimension(60, 30));jLabel.setHorizontalTextPosition(JLabel.CENTER);jLabel.setVerticalAlignment(JLabel.CENTER);content.add(jLabel);ipField = new JTextField();ipField.setPreferredSize(new Dimension(130, 30));content.add(ipField);}{// 用户名JLabel jLabel = new JLabel("用户名:");jLabel.setPreferredSize(new Dimension(60, 30));jLabel.setHorizontalTextPosition(JLabel.CENTER);jLabel.setVerticalAlignment(JLabel.CENTER);content.add(jLabel);usernameField = new JTextField("admin");usernameField.setPreferredSize(new Dimension(130, 30));content.add(usernameField);}{// 密码JLabel jLabel = new JLabel("密码:");jLabel.setPreferredSize(new Dimension(60, 30));jLabel.setHorizontalTextPosition(JLabel.CENTER);jLabel.setVerticalAlignment(JLabel.CENTER);content.add(jLabel);pwdField = new JPasswordField("");pwdField.setPreferredSize(new Dimension(130, 30));content.add(pwdField);}{// 按钮JButton playBtn = new JButton("播放");playBtn.setPreferredSize(new Dimension(150, 30));playBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String m_sDeviceIP = ipField.getText();if (m_sDeviceIP == null || "".equals(m_sDeviceIP)) {JOptionPane.showMessageDialog(Player.this, "IP不能为空");return;}String username = usernameField.getText();if (username == null || "".equals(username)) {JOptionPane.showMessageDialog(Player.this, "用户名不能为空");return;}String password = pwdField.getText();if (password == null || "".equals(password)) {JOptionPane.showMessageDialog(Player.this, "密码不能为空");return;}if (playerPanel.isIsplay()) {// 先停止playerPanel.stop();}playerPanel.start(m_sDeviceIP, username, password, 8000, 1L);new Thread(new Runnable() {@Overridepublic void run() {playerPanel.play();}}).start();}});content.add(playBtn);JButton imgBtn = new JButton("截图");imgBtn.setPreferredSize(new Dimension(150, 30));imgBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if (!playerPanel.isIsplay()) {// 先停止JOptionPane.showMessageDialog(Player.this, "请先预览!");return;}JFileChooser filechooser = new JFileChooser();// 创建文件选择器filechooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);int returnVal = filechooser.showOpenDialog(Player.this);if (returnVal == JFileChooser.APPROVE_OPTION) {String file = filechooser.getSelectedFile().getAbsolutePath() + "\\" + new Date().getTime()+ ".jpg";playerPanel.snapshot(file);}}});content.add(imgBtn);}content.setPreferredSize(new Dimension(200, 600));getContentPane().add(content, BorderLayout.WEST);}@Overridepublic void windowActivated(WindowEvent e) {}@Overridepublic void windowClosed(WindowEvent e) {}@Overridepublic void windowClosing(WindowEvent e) {playerPanel.stop();}@Overridepublic void windowDeactivated(WindowEvent e) {}@Overridepublic void windowDeiconified(WindowEvent e) {}@Overridepublic void windowIconified(WindowEvent e) {}@Overridepublic void windowOpened(WindowEvent e) {}}

预览:

源码:源码下载

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。