Java调用海康威视接口并抓取Jpeg图片到内存
1. pom依赖:
<dependency>
<groupId>com.hikvision.ga</groupId>
<artifactId>artemis-http-client</artifactId>
<version>1.1.3</version>
</dependency>
2. 工具类
(1)工具类1: HCNetSDK
import com.stian.util.ClientDemoUtil;
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.examples.win32.W32API;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.StdCallLibrary;
import java.nio.ByteBuffer;
public interface HCNetSDK extends StdCallLibrary {
HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(ClientDemoUtil.DLL_PATH+"HCNetSDK.dll", HCNetSDK.class);
public static final int SERIALNO_LEN = 48;
public static final int NAME_LEN = 32;
public static final int PASSWD_LEN = 16;
public static final int MAX_DISKNUM_V30 = 33;
public static final int MAX_AUDIO_V30 = 2;
public static final int MAX_LINK = 6;
public static final int MAX_ANALOG_CHANNUM = 32;
public static final int MAX_ANALOG_ALARMOUT = 32;
public static final int MAX_ANALOG_ALARMIN = 32;
public static final int MAX_IP_DEVICE = 32;
public static final int MAX_IP_CHANNEL = 32;
public static final int MAX_IP_ALARMIN = 128;
public static final int MAX_IP_ALARMOUT = 64;
public static final int MAX_CHANNUM_V30 = (MAX_ANALOG_CHANNUM + MAX_IP_CHANNEL);
public static final int MAX_ALARMOUT_V30 = (MAX_ANALOG_ALARMOUT + MAX_IP_ALARMOUT);
public static final int MAX_ALARMIN_V30 = (MAX_ANALOG_ALARMIN + MAX_IP_ALARMIN);
public static final int NET_DVR_GET_IPPARACFG = 1048;
public static final int NET_DVR_SET_IPPARACFG = 1049;
public static final int NET_DVR_SYSHEAD = 1;
public static final int NET_DVR_STREAMDATA = 2;
public static final int NET_DVR_AUDIOSTREAMDATA = 3;
public static final int NET_DVR_STD_VIDEODATA = 4;
public static final int NET_DVR_STD_AUDIODATA = 5;
class NET_DVR_DEVICEINFO_V30 extends Structure{
public byte[] sSerialNumber = new byte[SERIALNO_LEN];
public byte byAlarmInPortNum;
public byte byAlarmOutPortNum;
public byte byDiskNum;
public byte byDVRType;
public byte byChanNum;
public byte byStartChan;
public byte byAudioChanNum;
public byte byIPChanNum;
public byte[] byRes1 = new byte[24];
}
boolean NET_DVR_Logout_V30(NativeLong lUserID);
class NET_DVR_IPPARACFG extends Structure {
public int dwSize;
public NET_DVR_IPDEVINFO[] struIPDevInfo = new NET_DVR_IPDEVINFO[MAX_IP_DEVICE];
public byte[] byAnalogChanEnable = new byte[MAX_ANALOG_CHANNUM];
public NET_DVR_IPCHANINFO[] struIPChanInfo = new NET_DVR_IPCHANINFO[MAX_IP_CHANNEL];
}
class NET_DVR_IPDEVINFO extends Structure {
public int dwEnable;
public byte[] sUserName = new byte[NAME_LEN];
public byte[] sPassword = new byte[PASSWD_LEN];
public NET_DVR_IPADDR struIP = new NET_DVR_IPADDR();
public short wDVRPort;
public byte[] byres = new byte[34];
}
class NET_DVR_IPCHANINFO extends Structure {
public byte byEnable;
public byte byIPID;
public byte byChannel;
public byte[] byres = new byte[33];
}
class NET_DVR_IPADDR extends Structure {
public byte[] sIpV4 = new byte[16];
public byte[] byRes = new byte[128];
public String toString() {
return "NET_DVR_IPADDR.sIpV4: " + new String(sIpV4) + "\n" + "NET_DVR_IPADDR.byRes: " + new String(byRes) + "\n";
}
}
boolean NET_DVR_Init();
boolean NET_DVR_SetConnectTime(int dwWaitTime, int dwTryTimes );
boolean NET_DVR_SetReconnect(int dwInterval, boolean bEnableRecon );
int NET_DVR_GetLastError();
NativeLong NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, NET_DVR_DEVICEINFO_V30 lpDeviceInfo);
class NET_DVR_WORKSTATE_V30 extends Structure {
public int dwDeviceStatic;
public NET_DVR_DISKSTATE[] struHardDiskStatic = new NET_DVR_DISKSTATE[MAX_DISKNUM_V30];
public NET_DVR_CHANNELSTATE_V30[] struChanStatic = new NET_DVR_CHANNELSTATE_V30[MAX_CHANNUM_V30];
public byte[] byAlarmInStatic = new byte[MAX_ALARMIN_V30];
public byte[] byAlarmOutStatic = new byte[MAX_ALARMOUT_V30];
public int dwLocalDisplay;
public byte [] byAudioChanStatus = new byte[MAX_AUDIO_V30];
public byte[] byRes = new byte[10];
}
class NET_DVR_DISKSTATE extends Structure {
public int dwVolume;
public int dwFreeSpace;
public int dwHardDiskStatic;
}
class NET_DVR_CHANNELSTATE_V30 extends Structure {
public byte byRecordStatic;
public byte bySignalStatic;
public byte byHardwareStatic;
public byte reservedData;
public int dwBitRate;
public int dwLinkNum;
public NET_DVR_IPADDR[] struClientIP = new NET_DVR_IPADDR[MAX_LINK];
public int dwIPLinkNum;
public byte[] byRes = new byte[12];
}
boolean NET_DVR_GetDVRWorkState_V30(NativeLong lUserID, NET_DVR_WORKSTATE_V30 lpWorkState);
boolean NET_DVR_GetDVRConfig(NativeLong lUserID, int dwCommand, NativeLong lChannel, Pointer lpOutBuffer, int dwOutBufferSize, IntByReference lpBytesReturned);
boolean NET_DVR_Logout(NativeLong lUserID);
boolean NET_DVR_Cleanup();
class NET_DVR_CLIENTINFO extends Structure {
public NativeLong lChannel;
public NativeLong lLinkMode;
public W32API.HWND hPlayWnd;
public String sMultiCastIP;
}
interface FRealDataCallBack_V30 extends StdCallCallback {
void invoke(NativeLong lRealHandle, int dwDataType,
ByteByReference pBuffer, int dwBufSize, Pointer pUser);
}
NativeLong NET_DVR_RealPlay_V30(NativeLong lUserID, NET_DVR_CLIENTINFO lpClientInfo, FRealDataCallBack_V30 fRealDataCallBack_V30, Pointer pUser , boolean bBlocked );
boolean NET_DVR_SaveRealData(NativeLong lRealHandle,String sFileName);
boolean NET_DVR_StopRealPlay(NativeLong lRealHandle);
class NET_DVR_JPEGPARA extends Structure {
public short wPicSize;
public short wPicQuality;
}
boolean NET_DVR_CaptureJPEGPicture_NEW(NativeLong lUserID, NativeLong lChannel, NET_DVR_JPEGPARA lpJpegPara, ByteBuffer sJpegPicBuffer, int dwPicSize, IntByReference lpSizeReturned);
boolean NET_DVR_SetExceptionCallBack_V30(int nMessage, int hWnd, FExceptionCallBack fExceptionCallBack, Pointer pUser);
interface FExceptionCallBack extends StdCallCallback {
void invoke(int dwType, NativeLong lUserID, NativeLong lHandle, Pointer pUser);
}
}
(2)工具类2:ClientDemoUtil
import com.stian.sdks.ClientDemo;
import java.io.UnsupportedEncodingException;
public class ClientDemoUtil {
public static String DLL_PATH;
static{
String path=(ClientDemo.class.getResource("/sdk/").getPath()).replaceAll("%20", " ").substring(1).replace("/", "\\");
try {
DLL_PATH= java.net.URLDecoder.decode(path,"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
(3)工具类3:ClientDemo
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.examples.win32.W32API;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.NativeLongByReference;
import com.sun.jna.win32.StdCallLibrary;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ClientDemo extends JFrame {
static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
private JTextField jTextFieldIPAddress;
private JTextField jTextFieldPortNumber;
private JTextField jTextFieldUserName;
private JPasswordField jPasswordFieldPassword;
private JButton jButtonLogin;
private java.awt.Panel panelRealplay;
static PlayCtrl playControl = PlayCtrl.INSTANCE;
boolean bRealPlay;
NativeLong lUserID;
int m_iTreeNodeNum;
DefaultMutableTreeNode m_DeviceRoot;
String m_sDeviceIP;
HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo;
HCNetSDK.NET_DVR_IPPARACFG m_strIpparaCfg;
NativeLongByReference m_lPort;
private void initComponents(){
panelRealplay = new java.awt.Panel();
jTextFieldIPAddress = new JTextField();
jTextFieldIPAddress.setText("172.4.1.170");
jTextFieldPortNumber = new JTextField();
jTextFieldPortNumber.setText("8000");
jTextFieldUserName = new JTextField();
jTextFieldUserName.setText("admin");
jPasswordFieldPassword = new JPasswordField();
jPasswordFieldPassword.setText("12345");
jButtonLogin = new JButton();
jButtonLogin.setText("注册");
jButtonLogin.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
jButtonLoginActionPerformed();
}
});
}
public void jButtonLoginActionPerformed(){
if (bRealPlay){
JOptionPane.showMessageDialog(this,"注册新用户请先停止当前预览!");
return;
}
if (lUserID != null && lUserID.longValue() > -1){
hCNetSDK.NET_DVR_Logout_V30(lUserID);
lUserID = new NativeLong(-1);
m_iTreeNodeNum = 0;
m_DeviceRoot.removeAllChildren();
}
jTextFieldIPAddress = new JTextField();
jTextFieldIPAddress.setText("172.4.1.170");
m_sDeviceIP = jTextFieldIPAddress.getText();
m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
jTextFieldPortNumber = new JTextField();
jTextFieldPortNumber.setText("8000");
int iPort = Integer.parseInt(jTextFieldPortNumber.getText());
jTextFieldUserName = new JTextField();
jTextFieldUserName.setText("admin");
jPasswordFieldPassword = new JPasswordField();
jPasswordFieldPassword.setText("12345");
lUserID =hCNetSDK.NET_DVR_Login_V30(m_sDeviceIP,(short) iPort, jTextFieldUserName.getText(), new String(jPasswordFieldPassword.getPassword()),m_strDeviceInfo);
long userID = lUserID.longValue();
if (userID == -1){
m_sDeviceIP = "";
JOptionPane.showMessageDialog(ClientDemo.this, "注册失败");
}else {
CreateDeviceTree();
}
}
private void CreateDeviceTree(){
IntByReference ibrBytesReturned = new IntByReference(0);
boolean bRet = false;
m_strIpparaCfg = new HCNetSDK.NET_DVR_IPPARACFG();
}
public FRealDataCallBack fRealDataCallBack;
interface PlayCtrl extends StdCallLibrary
{
PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(".\\sdk\\PlayCtrl",
PlayCtrl.class);
public static final int STREAME_REALTIME = 0;
public static final int STREAME_FILE = 1;
boolean PlayM4_GetPort(NativeLongByReference nPort);
boolean PlayM4_OpenStream(NativeLong nPort, ByteByReference pFileHeadBuf, int nSize, int nBufPoolSize);
boolean PlayM4_InputData(NativeLong nPort, ByteByReference pBuf, int nSize);
boolean PlayM4_CloseStream(NativeLong nPort);
boolean PlayM4_SetStreamOpenMode(NativeLong nPort, int nMode);
boolean PlayM4_Play(NativeLong nPort, W32API.HWND hWnd);
boolean PlayM4_Stop(NativeLong nPort);
boolean PlayM4_SetSecretKey(NativeLong nPort, NativeLong lKeyType, String pSecretKey, NativeLong lKeyLen);
}
public class FRealDataCallBack implements HCNetSDK.FRealDataCallBack_V30
{
public void invoke(NativeLong lRealHandle, int dwDataType, ByteByReference pBuffer, int dwBufSize, Pointer pUser)
{
W32API.HWND hwnd = new W32API.HWND(Native.getComponentPointer(panelRealplay));
switch (dwDataType)
{
case HCNetSDK.NET_DVR_SYSHEAD:
if (!playControl.PlayM4_GetPort(m_lPort))
{
break;
}
if (dwBufSize > 0)
{
if (!playControl.PlayM4_SetStreamOpenMode(m_lPort.getValue(), PlayCtrl.STREAME_REALTIME))
{
break;
}
if (!playControl.PlayM4_OpenStream(m_lPort.getValue(), pBuffer, dwBufSize, 1024 * 1024))
{
break;
}
if (!playControl.PlayM4_Play(m_lPort.getValue(), hwnd))
{
break;
}
}
case HCNetSDK.NET_DVR_STREAMDATA:
if ((dwBufSize > 0) && (m_lPort.getValue().intValue() != -1))
{
if (!playControl.PlayM4_InputData(m_lPort.getValue(), pBuffer, dwBufSize))
{
break;
}
}
}
}
}
}
(4)工具类4:CameraInfo
import com.sun.jna.NativeLong;
import lombok.Data;
@Data
public class CameraInfo {
private String address;
private String userName;
private String pwd;
private short port;
private NativeLong userId;
private NativeLong channel;
private NativeLong key;
}
3. 运行类
import com.stian.sdks.HCNetSDK;
import com.stian.sdks.entity.CameraInfo;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestHikvision {
public static void main(String[] args) throws IOException {
TestHikvision app = new TestHikvision();
CameraInfo cameraInfo = new CameraInfo();
cameraInfo.setAddress("192.168.1.213");
cameraInfo.setPort((short) 8000);
cameraInfo.setUserName("admin");
cameraInfo.setPwd("P@ssw0rd");
app.getDVRConfig(cameraInfo);
app.getDVRPic(cameraInfo);
}
public void getDVRConfig(CameraInfo cameraInfo) {
HCNetSDK sdk = HCNetSDK.INSTANCE;
if (!sdk.NET_DVR_Init()) {
System.out.println("SDK初始化失败");
return;
}
HCNetSDK.NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
NativeLong id = sdk.NET_DVR_Login_V30(cameraInfo.getAddress(), (short) cameraInfo.getPort(),
cameraInfo.getUserName(), cameraInfo.getPwd(), devinfo);
cameraInfo.setUserId(id);
if (cameraInfo.getUserId().intValue() < 0) {
System.out.println("设备注册失败");
return;
}
HCNetSDK.NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30();
if (!sdk.NET_DVR_GetDVRWorkState_V30(cameraInfo.getUserId(), devwork)) {
System.out.println("返回设备状态失败");
}
IntByReference ibrBytesReturned = new IntByReference(0);
HCNetSDK.NET_DVR_IPPARACFG ipcfg = new HCNetSDK.NET_DVR_IPPARACFG();
ipcfg.write();
Pointer lpIpParaConfig = ipcfg.getPointer();
sdk.NET_DVR_GetDVRConfig(cameraInfo.getUserId(), HCNetSDK.NET_DVR_GET_IPPARACFG, new NativeLong(0),
lpIpParaConfig, ipcfg.size(), ibrBytesReturned);
ipcfg.read();
System.out.print("IP地址:" + cameraInfo.getAddress());
System.out.println("|设备状态:" + devwork.dwDeviceStatic);
for (int i = 0; i < devinfo.byChanNum; i++) {
System.out.print("Camera" + i + 1);
System.out.print("|是否录像:" + devwork.struChanStatic[i].byRecordStatic);
System.out.print("|信号状态:" + devwork.struChanStatic[i].bySignalStatic);
System.out.println("|硬件状态:" + devwork.struChanStatic[i].byHardwareStatic);
}
sdk.NET_DVR_Logout(cameraInfo.getUserId());
sdk.NET_DVR_Cleanup();
}
public void getDVRPic(CameraInfo cameraInfo) throws IOException {
NativeLong chanLong = new NativeLong(1);
cameraInfo.setChannel(chanLong);
long startTime = System.currentTimeMillis();
HCNetSDK sdk = HCNetSDK.INSTANCE;
if (!sdk.NET_DVR_Init()) {
System.out.println("SDK初始化失败");
return;
}
HCNetSDK.NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
NativeLong id = sdk.NET_DVR_Login_V30(cameraInfo.getAddress(), (short) cameraInfo.getPort(),
cameraInfo.getUserName(), cameraInfo.getPwd(), devinfo);
cameraInfo.setUserId(id);
if (cameraInfo.getUserId().intValue() < 0) {
System.out.println("设备注册失败"+sdk.NET_DVR_GetLastError());
return;
} else {
System.out.println("id:" + cameraInfo.getUserId().intValue());
}
HCNetSDK.NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30();
if (!sdk.NET_DVR_GetDVRWorkState_V30(cameraInfo.getUserId(), devwork)) {
System.out.println("返回设备状态失败");
}
startTime = System.currentTimeMillis();
HCNetSDK.NET_DVR_JPEGPARA jpeg = new HCNetSDK.NET_DVR_JPEGPARA();
jpeg.wPicSize = 2;
jpeg.wPicQuality = 2;
IntByReference a = new IntByReference();
ByteBuffer jpegBuffer = ByteBuffer.allocate(1024 * 1024);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = new Date();
String fileNameString = "D:/CapturePicture/"+sdf.format(date)+".jpg";
File file = new File(fileNameString);
if (!file.exists()) {
file.createNewFile();
}
boolean is = sdk.NET_DVR_CaptureJPEGPicture_NEW(cameraInfo.getUserId(), cameraInfo.getChannel(), jpeg,
jpegBuffer, 1024 * 1024, a);
System.out.println("抓图到内存耗时:[" + (System.currentTimeMillis() - startTime) + "ms]");
if (is) {
System.out.println("抓取成功,返回长度:" + a.getValue());
} else {
System.out.println("抓取失败:"+sdk.NET_DVR_GetLastError());
}
BufferedOutputStream outputStream = null;
try {
outputStream = new BufferedOutputStream(new FileOutputStream(file));
outputStream.write(jpegBuffer.array(), 0, a.getValue());
outputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
sdk.NET_DVR_Logout(cameraInfo.getUserId());
sdk.NET_DVR_Cleanup();
}
}
我是把我用到的工具类都贴出来了,可根据用到了工具类的哪些方法进行删减
代码参考:https://blog.csdn.net/Yuruiyu/article/details/79565261