日常開發(fā)過程中晋渺,會遇到對接視頻服務商的需求镰绎,一般我們所知的國內大型的視頻硬件服務商一個是海康威視木西,一個是浙江大華畴栖,那如何使用java程序來調用對應的接口服務呢?那就是集成SDK
環(huán)境
- java Jdk 1.8
- Centos 7 64位
hikvision SDK 準備
可以在下面這個鏈接中下載對應的SDK
包:
https://open.hikvision.com/downloadNew/5cda567cf47ae80dd41a54b3?type=10
喊饲В康威視下載sdk.jpg
如上圖所示:我們可以根據不同的開發(fā)環(huán)境去下載不同的sdk版本(都選用64位)吗讶,因為我這邊是部署到linux環(huán)境所以需要下載linux版本。
SDK 包簡介
當我們下載下來后恋捆,解壓會看到如下的文件夾:
開發(fā)文件.jpg
Demo 代碼修改
代碼中會有這么一個接口文件HCNetSDK
這個是你調用sdk的入口照皆,需要引入so文件
HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("/home/adore/hkws/lib/libhcnetsdk.so", HCNetSDK.class);
- 建議
/home/adore/hkws/lib/libhcnetsdk.so
這個地址就用絕對路徑。 - 部署的話請參考
Linux下JavaDemo使用說明
代碼編寫
代碼的調用可以查看接口文檔:設備網絡SDK使用手冊
- 實現(xiàn)截圖功能
/**
* 抓拍圖片
*
* @param imgPath 圖片路徑
* @param cate 是否走內存
* @param dvr 用戶信息
* @param channelList 通道
*/
public void getDVRPic(Device dvr, String imgPath, boolean cate, List<Long> channelList) {
log.info("-----------這里處理已經getDVRPic----------" + imgPath);
if (!hCNetSDK.NET_DVR_Init()) {
log.warn("hksdk(抓圖)-悍型#康sdk初始化失敗!");
return;
}
// 設備信息
HCNetSDK.NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
//注冊設備
lUserID = hCNetSDK.NET_DVR_Login_V30(dvr.getIp(), Short.valueOf(dvr.getPort()), dvr.getAccount(), dvr.getPassword(), devinfo);
// 返回一個用戶編號膜毁,同時將設備信息寫入devinfo
if (lUserID.intValue() < 0) {
log.error("hksdk(抓圖)-設備注冊失敗,錯誤碼:" + 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值,判斷是否獲取設備能力
log.error("hksdk(抓圖)-返回設備狀態(tài)失敗" + hCNetSDK.NET_DVR_GetLastError());
}
if (CollectionUtils.isEmpty(channelList)) {
log.error("通道數據為空" + dvr.getIp());
return;
}
channelList.forEach(x -> {
String path = "";
path = imgPath + "-" + x + ".jpeg";
NativeLong chanLong = new NativeLong(x);
//內存
if (cate) {
picCutCate(lUserID, chanLong, path);
} else {
//非內存直接保存
//圖片質量
HCNetSDK.NET_DVR_JPEGPARA jpeg = new HCNetSDK.NET_DVR_JPEGPARA();
//設置圖片分辨率
jpeg.wPicSize = 0;
//設置圖片質量
jpeg.wPicQuality = 0;
//需要加入通道
log.info("-----------這里開始封裝 NET_DVR_CaptureJPEGPicture---------");
boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture(lUserID, chanLong, jpeg, path);
log.info("-----------抓圖工具返回結果----------" + is);
if (!is) {
log.info("hksdk(抓圖)-抓取失敗,錯誤碼:" + hCNetSDK.NET_DVR_GetLastError());
}
}
});
log.info("-----------處理完成截圖數據----------");
//退出登錄
hCNetSDK.NET_DVR_Logout(lUserID);
//釋放SDK資源
hCNetSDK.NET_DVR_Cleanup();
}
private void picCutCate(NativeLong lUserID, NativeLong chanLong, String imgPath) {
//圖片質量
HCNetSDK.NET_DVR_JPEGPARA jpeg = new HCNetSDK.NET_DVR_JPEGPARA();
//設置圖片分辨率
jpeg.wPicSize = 0;
//設置圖片質量
jpeg.wPicQuality = 0;
IntByReference a = new IntByReference();
//設置圖片大小
ByteBuffer jpegBuffer = ByteBuffer.allocate(1024 * 1024);
File file = new File(imgPath);
// 抓圖到內存愤钾,單幀數據捕獲并保存成JPEG存放在指定的內存空間中
log.info("-----------這里開始封裝 NET_DVR_CaptureJPEGPicture_NEW---------");
boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(lUserID, chanLong, jpeg, jpegBuffer, 1024 * 1024, a);
log.info("-----------這里開始圖片存入內存----------" + is);
if (is) {
/**
* 該方式使用內存獲取 但是讀取有問題無法預覽
* linux下 可能有問題
* */
log.info("hksdk(抓圖)-結果狀態(tài)值(0表示成功):" + hCNetSDK.NET_DVR_GetLastError());
//存儲到本地
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(抓圖)-抓取失敗,錯誤碼:" + hCNetSDK.NET_DVR_GetLastError());
}
}
特別說明:
如果使用的是內存方式截圖(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 對象說明
/**
* device.getAccount() 獲取設備的訪問賬號
* device.getPassword() 獲取設備的訪問密碼
* device.getIp() 獲取設備所在內網的IP地址
* device.getPort() 獲取設備的訪問端口 rtsp默認554
*/
private String account;
private String password;
private String ip;
private String port;
private Long channel;
注意工具類需要使用是用靜態(tài)調用HCNetSDK
private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
以上就是在linux下調用何帘酰康威視SDK實現(xiàn)抓圖功能