package com.netsdk.demo.example; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Image; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import javax.swing.border.Border; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.NetSDKLib.LLong; import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; /** * 实时预览 */ class Preview extends JFrame { /** * */ private static final long serialVersionUID = 1L; static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE; static NetSDKLib configApi = NetSDKLib.CONFIG_INSTANCE; private SDKEnvironment sdkEnv; // 登录参数 private String m_strIp = "172.31.12.139"; private Integer m_nPort = new Integer("37777"); private String m_strUser = "admin"; private String m_strPassword = "admin"; // 设备信息 private NetSDKLib.NET_DEVICEINFO deviceInfo = new NetSDKLib.NET_DEVICEINFO(); private LLong loginHandle = new LLong(0); // 登录句柄 private LLong m_lOperateHandle1 = new LLong(0); // 监控句柄 private LLong m_lOperateHandle2 = new LLong(0); // 监控句柄 /** * Preview 构造 */ public Preview() { sdkEnv = new SDKEnvironment(); sdkEnv.init(); setTitle("实时监控"); setSize(850, 550); setLayout(new BorderLayout()); setLocationRelativeTo(null); setVisible(true); loginPanel = new LoginPanel(); // 登录面板 realPlayPanel1 = new RealPlayPanel1(); // 播放面板1 realPlayPanel2 = new RealPlayPanel2(); // 播放面板2 add(loginPanel, BorderLayout.NORTH); add(realPlayPanel1, BorderLayout.WEST); add(realPlayPanel2, BorderLayout.EAST); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.out.println("RealPlay Window Closing"); LoginOutButtonPerformed(); stopRealPlay1(); stopRealPlay2(); sdkEnv.cleanup(); dispose(); } }); } /** * NetSDK 库初始化 */ private class SDKEnvironment { private boolean bInit = false; private boolean bLogopen = false; private DisConnect disConnect = new DisConnect(); // 设备断线通知回调 private HaveReConnect haveReConnect = new HaveReConnect(); // 网络连接恢复 // 初始化 public boolean init() { // SDK 库初始化, 并设置断线回调 bInit = netsdkApi.CLIENT_Init(disConnect, null); if (!bInit) { System.err.println("Initialize SDK failed"); return false; } // 打开日志,可选 NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO(); File path = new File("."); String logPath = path.getAbsoluteFile().getParent() + "\\sdk_log\\RealPlay_" + System.currentTimeMillis() + ".log"; setLog.bSetFilePath = 1; System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length); setLog.bSetPrintStrategy = 1; setLog.nPrintStrategy = 0; bLogopen = netsdkApi.CLIENT_LogOpen(setLog); if (!bLogopen) { System.err.println("Failed to open NetSDK log !!!"); } // 获取版本, 可选操作 System.out.printf("NetSDK Version [%d]\n", netsdkApi.CLIENT_GetSDKVersion()); // 设置断线重连回调接口,设置过断线重连成功回调函数后,当设备出现断线情况,SDK内部会自动进行重连操作 // 此操作为可选操作,但建议用户进行设置 netsdkApi.CLIENT_SetAutoReconnect(haveReConnect, null); // 设置登录超时时间和尝试次数 , 此操作为可选操作 int waitTime = 5000; // 登录请求响应超时时间设置为 5s int tryTimes = 3; // 登录时尝试建立链接3次 netsdkApi.CLIENT_SetConnectTime(waitTime, tryTimes); // 设置更多网络参数,NET_PARAM的nWaittime,nConnectTryNum成员与CLIENT_SetConnectTime // 接口设置的登录设备超时时间和尝试次数意义相同 // 此操作为可选操作 NetSDKLib.NET_PARAM netParam = new NetSDKLib.NET_PARAM(); netParam.nConnectTime = 10000; // 登录时尝试建立链接的超时时间 netsdkApi.CLIENT_SetNetworkParam(netParam); return true; } // 清除环境 public void cleanup() { if (bLogopen) { netsdkApi.CLIENT_LogClose(); } if (bInit) { netsdkApi.CLIENT_Cleanup(); } } // 设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数 public class DisConnect implements NetSDKLib.fDisConnect { public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("Device[%s] Port[%d] Disconnect!\n" , pchDVRIP , nDVRPort); } } // 网络连接恢复,设备重连成功回调 // 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数 public class HaveReConnect implements NetSDKLib.fHaveReConnect { public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort); } } } /** * 登录面板 */ private class LoginPanel extends JPanel { /** * */ private static final long serialVersionUID = 1L; public LoginPanel() { setLayout(new FlowLayout()); setBorderEx(this, "登录", 2); loginBtn = new JButton("登入"); logoutBtn = new JButton("登出"); nameLabel = new JLabel("用户名"); passwordLabel = new JLabel("密码"); nameTextArea = new JTextField(m_strUser, 6); passwordTextArea = new JPasswordField(m_strPassword, 6); ipLabel = new JLabel("设备地址"); portLabel = new JLabel("端口号"); ipTextArea = new JTextField(m_strIp, 8); portTextArea = new JTextField(m_nPort.toString(), 4); add(ipLabel); add(ipTextArea); add(portLabel); add(portTextArea); add(nameLabel); add(nameTextArea); add(passwordLabel); add(passwordTextArea); add(loginBtn); add(logoutBtn); logoutBtn.setEnabled(false); // 登录按钮. 监听事件 loginBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { LoginButtonPerformed(); } }); // 登出按钮. 监听事件 logoutBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { LoginOutButtonPerformed(); stopRealPlay1(); stopRealPlay2(); sdkEnv.cleanup(); } }); } } /** * 播放面板 1 */ private class RealPlayPanel1 extends PaintPanel { /** * */ private static final long serialVersionUID = 1L; public RealPlayPanel1() { setBorderEx(this, "播放窗口1", 2); setLayout(new BorderLayout()); Dimension dim = getPreferredSize(); dim.width = 410; setPreferredSize(dim); JPanel jp1 = new JPanel(); stBtn1 = new JButton("开始监控1"); endBtn1 = new JButton("停止监控1"); label1 = new JLabel("通道号:"); textArea1 = new JTextField("0", 8); stBtn1.setEnabled(false); endBtn1.setEnabled(false); jp1.setLayout(new FlowLayout()); jp1.add(stBtn1); jp1.add(endBtn1); jp1.add(label1); jp1.add(textArea1); realPlayWindow1 = new Panel(); add(jp1, BorderLayout.NORTH); add(realPlayWindow1, BorderLayout.CENTER); stBtn1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { startRealPlay1(); } }); endBtn1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { stopRealPlay1(); } }); } } /** * 播放面板2 */ private class RealPlayPanel2 extends PaintPanel { /** * */ private static final long serialVersionUID = 1L; public RealPlayPanel2() { setLayout(new BorderLayout()); setBorderEx(this, "播放窗口2", 2); Dimension dim = getPreferredSize(); dim.width = 410; setPreferredSize(dim); JPanel jp2 = new JPanel(); stBtn2 = new JButton("开始监控2"); endBtn2 = new JButton("停止监控2"); label2 = new JLabel("通道号:"); textArea2 = new JTextField("1", 8); stBtn2.setEnabled(false); endBtn2.setEnabled(false); jp2.setLayout(new FlowLayout()); jp2.add(stBtn2); jp2.add(endBtn2); jp2.add(label2); jp2.add(textArea2); realPlayWindow2 = new Panel(); add(jp2, BorderLayout.NORTH); add(realPlayWindow2, BorderLayout.CENTER); stBtn2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { startRealPlay2(); } }); endBtn2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { stopRealPlay2(); } }); } } //带背景的面板组件 private class PaintPanel extends JPanel { /** * */ private static final long serialVersionUID = 1L; private Image image; //背景图片 public PaintPanel() { super(); setOpaque(true); //非透明 setLayout(null); setBackground(new Color(153, 240, 255)); setForeground(new Color(0, 0, 0)); } protected void paintComponent(Graphics g) { //重写绘制组件外观 if(image != null) { g.drawImage(image, 0, 0, getWidth(), getHeight(), this);//绘制图片与组件大小相同 } super.paintComponent(g); // 执行超类方法 } } //////////////////////// Border Extends ////////////////////// /** * 设置边框 */ private void setBorderEx(JComponent object, String title, int width) { Border innerBorder = BorderFactory.createTitledBorder(title); Border outerBorder = BorderFactory.createEmptyBorder(width, width, width, width); object.setBorder(BorderFactory.createCompoundBorder(outerBorder, innerBorder)); } //////////////////////// Operations of PlayBackFrame //////////////// /** * 登录按钮 */ private void LoginButtonPerformed() { m_strIp = ipTextArea.getText(); m_nPort = Integer.parseInt(portTextArea.getText()); m_strUser = nameTextArea.getText(); m_strPassword = new String(passwordTextArea.getPassword()); System.out.println("设备地址:" + m_strIp + "\n端口号:" + m_nPort + "\n用户名:" + m_strUser + "\n密码:" + m_strPassword); // 登录设备 IntByReference nError = new IntByReference(0); loginHandle = netsdkApi.CLIENT_LoginEx(m_strIp, m_nPort.intValue(), m_strUser , m_strPassword , 0, null, deviceInfo, nError); if(loginHandle.longValue() == 0) { System.err.printf("Login Device[%s] Port[%d]Failed. Last Error[%x]\n" , m_strIp , m_nPort , netsdkApi.CLIENT_GetLastError()); JOptionPane.showMessageDialog(this, "登录失败"); } else { System.out.println("Login Success [ " + m_strIp +" ]"); JOptionPane.showMessageDialog(this, "登录成功"); logoutBtn.setEnabled(true); loginBtn.setEnabled(false); stBtn1.setEnabled(true); stBtn2.setEnabled(true); } } /** * 登出按钮 */ private void LoginOutButtonPerformed() { if (loginHandle.longValue() != 0) { System.out.println("LogOut Button Action"); stopRealPlay1(); stopRealPlay2(); if (netsdkApi.CLIENT_Logout(loginHandle)) { System.out.println("Logout Success [ " + m_strIp +" ]"); loginHandle.setValue(0); logoutBtn.setEnabled(false); loginBtn.setEnabled(true); stBtn1.setEnabled(false); endBtn1.setEnabled(false); stBtn2.setEnabled(false); endBtn2.setEnabled(false); } } } // 开始实时预览支持设置码流回调 private void startRealPlay1() { int channel = Integer.parseInt(textArea1.getText()); // 预览通道号, 设备有多通道的情况,可手动更改 int playType = NetSDKLib.NET_RealPlayType.NET_RType_Realplay; // 实时预览 m_lOperateHandle1 = netsdkApi.CLIENT_RealPlayEx(loginHandle, channel, Native.getComponentPointer(realPlayWindow1), playType); if (m_lOperateHandle1.longValue() == 0) { int error = netsdkApi.CLIENT_GetLastError(); System.err.println("开始实时预览失败,错误码:" + String.format("[0x%x]", error)); } else { System.out.println("Success to start realplay"); realPlayWindow1.setVisible(true); realPlayPanel1.setOpaque(false);// 设置透明 stBtn1.setEnabled(false); endBtn1.setEnabled(true); } } private void startRealPlay2() { int channel = Integer.parseInt(textArea2.getText()); // 预览通道号, 设备有多通道的情况,可手动更改 int playType = NetSDKLib.NET_RealPlayType.NET_RType_Realplay; // 实时预览 m_lOperateHandle2 = netsdkApi.CLIENT_RealPlayEx(loginHandle, channel, Native.getComponentPointer(realPlayWindow2), playType); if (m_lOperateHandle2.longValue() == 0) { int error = netsdkApi.CLIENT_GetLastError(); System.err.println("开始实时预览失败,错误码:" + String.format("[0x%x]", error)); } else { System.out.println("Success to start realplay"); realPlayWindow2.setVisible(true); realPlayPanel2.setOpaque(false); stBtn2.setEnabled(false); endBtn2.setEnabled(true); } } // 结束实时预览 private void stopRealPlay1() { System.out.println("Stop Tasks!"); if(!netsdkApi.CLIENT_StopRealPlayEx(m_lOperateHandle1)) { return; } else { System.out.println("StopRealPlay Succeed!"); m_lOperateHandle1.setValue(0); realPlayWindow1.repaint(); stBtn1.setEnabled(true); endBtn1.setEnabled(false); } } private void stopRealPlay2() { System.out.println("Stop Tasks!"); if(!netsdkApi.CLIENT_StopRealPlayEx(m_lOperateHandle2)) { return; } else { System.out.println("StopRealPlay Succeed!"); m_lOperateHandle2.setValue(0); realPlayWindow2.repaint(); stBtn2.setEnabled(true); endBtn2.setEnabled(false); } } public void capturePicture() { File pathFile = new File("."); String path = pathFile.getAbsoluteFile().getParent() + "\\RealPlay_" + System.currentTimeMillis() + ".jpg"; if(netsdkApi.CLIENT_CapturePicture(m_lOperateHandle1, path)) { System.out.println(path); } } //////////////////////// Components of PlayBackFrame /////////////// /** * 登录界面 */ private LoginPanel loginPanel; private JButton loginBtn; private JButton logoutBtn; private JLabel nameLabel; private JLabel passwordLabel; private JTextField nameTextArea; private JPasswordField passwordTextArea; private JLabel ipLabel; private JLabel portLabel; private JTextField ipTextArea; private JTextField portTextArea; /** * 播放界面 */ private RealPlayPanel1 realPlayPanel1; private RealPlayPanel2 realPlayPanel2; private Panel realPlayWindow1; private Panel realPlayWindow2; private JLabel label1; private JTextField textArea1; private JLabel label2; private JTextField textArea2; private JButton stBtn1; private JButton endBtn1; private JButton stBtn2; private JButton endBtn2; public static void main(String[] args) { Preview demo = new Preview(); demo.setVisible(true); } }