日常開發(fā)過程中,會(huì)遇到對(duì)接視頻服務(wù)商的需求,一般我們所知的國(guó)內(nèi)大型的視頻硬件服務(wù)商一個(gè)是??低暎粋€(gè)是浙江大華,那如何使用java程序來調(diào)用對(duì)應(yīng)的接口服務(wù)呢?那就是集成SDK
環(huán)境
- java Jdk 1.8
- Centos 7 64位
hikvision SDK 準(zhǔn)備
可以在下面這個(gè)鏈接中下載對(duì)應(yīng)的SDK包:
https://open.hikvision.com/downloadNew/5cda567cf47ae80dd41a54b3?type=10

如上圖所示:我們可以根據(jù)不同的開發(fā)環(huán)境去下載不同的sdk版本(都選用64位),因?yàn)槲疫@邊是部署到linux環(huán)境所以需要下載linux版本。
SDK 包簡(jiǎn)介
當(dāng)我們下載下來后,解壓會(huì)看到如下的文件夾:

Demo 代碼修改
代碼中會(huì)有這么一個(gè)接口文件HCNetSDK 這個(gè)是你調(diào)用sdk的入口,需要引入so文件
HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("/home/adore/hkws/lib/libhcnetsdk.so", HCNetSDK.class);
- 建議
/home/adore/hkws/lib/libhcnetsdk.so這個(gè)地址就用絕對(duì)路徑。 - 部署的話請(qǐng)參考
Linux下JavaDemo使用說明
代碼編寫
代碼的調(diào)用可以查看接口文檔:設(shè)備網(wǎng)絡(luò)SDK使用手冊(cè)
- 實(shí)現(xiàn)截圖功能
/**
* 抓拍圖片
*
* @param imgPath 圖片路徑
* @param cate 是否走內(nèi)存
* @param dvr 用戶信息
* @param channelList 通道
*/
public void getDVRPic(Device dvr, String imgPath, boolean cate, List<Long> channelList) {
log.info("-----------這里處理已經(jīng)getDVRPic----------" + imgPath);
if (!hCNetSDK.NET_DVR_Init()) {
log.warn("hksdk(抓圖)-??祍dk初始化失敗!");
return;
}
// 設(shè)備信息
HCNetSDK.NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
//注冊(cè)設(shè)備
lUserID = hCNetSDK.NET_DVR_Login_V30(dvr.getIp(), Short.valueOf(dvr.getPort()), dvr.getAccount(), dvr.getPassword(), devinfo);
// 返回一個(gè)用戶編號(hào),同時(shí)將設(shè)備信息寫入devinfo
if (lUserID.intValue() < 0) {
log.error("hksdk(抓圖)-設(shè)備注冊(cè)失敗,錯(cuò)誤碼:" + hCNetSDK.NET_DVR_GetLastError());
return;
}
HCNetSDK.NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30();
if (!hCNetSDK.NET_DVR_GetDVRWorkState_V30(lUserID, devwork)) {
// 返回Boolean值,判斷是否獲取設(shè)備能力
log.error("hksdk(抓圖)-返回設(shè)備狀態(tài)失敗" + hCNetSDK.NET_DVR_GetLastError());
}
if (CollectionUtils.isEmpty(channelList)) {
log.error("通道數(shù)據(jù)為空" + dvr.getIp());
return;
}
channelList.forEach(x -> {
String path = "";
path = imgPath + "-" + x + ".jpeg";
NativeLong chanLong = new NativeLong(x);
//內(nèi)存
if (cate) {
picCutCate(lUserID, chanLong, path);
} else {
//非內(nèi)存直接保存
//圖片質(zhì)量
HCNetSDK.NET_DVR_JPEGPARA jpeg = new HCNetSDK.NET_DVR_JPEGPARA();
//設(shè)置圖片分辨率
jpeg.wPicSize = 0;
//設(shè)置圖片質(zhì)量
jpeg.wPicQuality = 0;
//需要加入通道
log.info("-----------這里開始封裝 NET_DVR_CaptureJPEGPicture---------");
boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture(lUserID, chanLong, jpeg, path);
log.info("-----------抓圖工具返回結(jié)果----------" + is);
if (!is) {
log.info("hksdk(抓圖)-抓取失敗,錯(cuò)誤碼:" + hCNetSDK.NET_DVR_GetLastError());
}
}
});
log.info("-----------處理完成截圖數(shù)據(jù)----------");
//退出登錄
hCNetSDK.NET_DVR_Logout(lUserID);
//釋放SDK資源
hCNetSDK.NET_DVR_Cleanup();
}
private void picCutCate(NativeLong lUserID, NativeLong chanLong, String imgPath) {
//圖片質(zhì)量
HCNetSDK.NET_DVR_JPEGPARA jpeg = new HCNetSDK.NET_DVR_JPEGPARA();
//設(shè)置圖片分辨率
jpeg.wPicSize = 0;
//設(shè)置圖片質(zhì)量
jpeg.wPicQuality = 0;
IntByReference a = new IntByReference();
//設(shè)置圖片大小
ByteBuffer jpegBuffer = ByteBuffer.allocate(1024 * 1024);
File file = new File(imgPath);
// 抓圖到內(nèi)存,單幀數(shù)據(jù)捕獲并保存成JPEG存放在指定的內(nèi)存空間中
log.info("-----------這里開始封裝 NET_DVR_CaptureJPEGPicture_NEW---------");
boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(lUserID, chanLong, jpeg, jpegBuffer, 1024 * 1024, a);
log.info("-----------這里開始圖片存入內(nèi)存----------" + is);
if (is) {
/**
* 該方式使用內(nèi)存獲取 但是讀取有問題無法預(yù)覽
* linux下 可能有問題
* */
log.info("hksdk(抓圖)-結(jié)果狀態(tài)值(0表示成功):" + hCNetSDK.NET_DVR_GetLastError());
//存儲(chǔ)到本地
BufferedOutputStream outputStream = null;
try {
outputStream = new BufferedOutputStream(new FileOutputStream(file));
outputStream.write(jpegBuffer.array(), 0, a.getValue());
outputStream.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} else {
log.info("hksdk(抓圖)-抓取失敗,錯(cuò)誤碼:" + hCNetSDK.NET_DVR_GetLastError());
}
}
特別說明:
如果使用的是內(nèi)存方式截圖(linux)下則需要修改SDK接口如下:
boolean NET_DVR_CaptureJPEGPicture_NEW(NativeLong lUserID, NativeLong lChannel, NET_DVR_JPEGPARA lpJpegPara, ByteBuffer jpegBuffer, int dwPicSize, IntByReference lpSizeReturned);
將String buffer 改為 ByteBuffer jpegBuffer,
Device 對(duì)象說明
/**
* device.getAccount() 獲取設(shè)備的訪問賬號(hào)
* device.getPassword() 獲取設(shè)備的訪問密碼
* device.getIp() 獲取設(shè)備所在內(nèi)網(wǎng)的IP地址
* device.getPort() 獲取設(shè)備的訪問端口 rtsp默認(rèn)554
*/
private String account;
private String password;
private String ip;
private String port;
private Long channel;
注意工具類需要使用是用靜態(tài)調(diào)用HCNetSDK
private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
以上就是在linux下調(diào)用??低昐DK實(shí)現(xiàn)抓圖功能