基於海康SDK開發文檔分析+雲台控制實現+經典案例


轉載:https://blog.csdn.net/weixin_43718192/article/details/94719781

 

基於海康SDK開發文檔分析+雲台控制實現+經典案例
上一篇:海康威視java開發+demo運行+調用dll動態庫坑

一、准備
海康的SDK下載 https://www.hikvision.com/cn/download_61.html
開發環境
海康設備(ip、端口、賬號、密碼)
二、SDK開發文檔分析
開發文檔位置:CH-HCNetSDKV5.3.6.30_build20180816_Win64 ->開發文檔 -> 設備網絡SDK使用手冊.chm
打開文檔注意下面這兩個地方(這兩個地方是開發尋找調用的接口的關鍵)

由於該文檔並不是開發文檔,所以我們自己構建結構體不知道應該怎樣定義(舉一個典型的例子)
這是SDK定義


這是Java代碼

//報警設備信息
public static class NET_DVR_ALARMER extends Structure
{
public byte byUserIDValid; /* userid是否有效 0-無效,1-有效 */
public byte bySerialValid; /* 序列號是否有效 0-無效,1-有效 */
public byte byVersionValid; /* 版本號是否有效 0-無效,1-有效 */
public byte byDeviceNameValid; /* 設備名字是否有效 0-無效,1-有效 */
public byte byMacAddrValid; /* MAC地址是否有效 0-無效,1-有效 */
public byte byLinkPortValid; /* login端口是否有效 0-無效,1-有效 */
public byte byDeviceIPValid; /* 設備IP是否有效 0-無效,1-有效 */
public byte bySocketIPValid; /* socket ip是否有效 0-無效,1-有效 */
//原本是NativeLong類型 但是在之后的測試中發現在windows中這個是偏移了4字節 所以改為int
public int lUserID; /* NET_DVR_Login()返回值, 布防時有效 */
public byte[] sSerialNumber = new byte[SERIALNO_LEN]; /* 序列號 */
public int dwDeviceVersion; /* 版本信息 高16位表示主版本,低16位表示次版本*/
public byte[] sDeviceName = new byte[NAME_LEN]; /* 設備名字 */
public byte[] byMacAddr = new byte[MACADDR_LEN]; /* MAC地址 */
public short wLinkPort; /* link port */
public byte[] sDeviceIP = new byte[128]; /* IP地址 */
public byte[] sSocketIP = new byte[128]; /* 報警主動上傳時的socket IP地址 */
public byte byIpProtocol; /* Ip協議 0-IPV4, 1-IPV6 */
public byte[] byRes2 = new byte[11];
}


知道接口需要搜索的時候

三、雲台控制實現
按照上面的分析找到開發的流程結合java版本的Demo


調用接口的時候需要注意

①、海康的demo是啟動了預覽的(如果需要和海康的demo一致的話,海康有些好的web控件)

②、我采用的方案是前端采用Video.js播放,通過EasyNVR流媒體服務(也可以自己搭建,我自

己搭建的不太穩定)拿到對應的RTMP/HLS/FLV播放路徑

根據上面的兩種在調用接口的時候會有區別

①、啟動預覽(海康demo方案)


②、不啟動預覽


四、經典的案例
下面寫出了經典的設置值和獲取值的方法(在一些參數不知道怎么賦值的情況下,可以參照這個)
/**
* 設置視頻參數
*/
public boolean setParm(String lUser, Integer lCannel, VideoParmBean videoParmBean){
IntByReference ibrBytesReturned = new IntByReference(0);
HCNetSDK.NET_DVR_CAMERAPARAMCFG_EX struCameraCfg_ex = new HCNetSDK.NET_DVR_CAMERAPARAMCFG_EX();
Pointer lpOutBuffer = struCameraCfg_ex.getPointer();
struCameraCfg_ex.write();
if(!hCNetSDK.NET_DVR_GetDVRConfig(new NativeLong(Long.parseLong(lUser)), 3368/*NET_DVR_GET_CCDPARAMCFG_EX*/, new NativeLong(lCannel), lpOutBuffer, struCameraCfg_ex.size(), ibrBytesReturned)){
return false;
}
struCameraCfg_ex.read();
struCameraCfg_ex.dwSize = struCameraCfg_ex.size();
//給結構體賦值
struCameraCfg_ex.struVideoEffect.liangdu = videoParmBean.getLiangdu().byteValue();
struCameraCfg_ex.struVideoEffect.ruidu = videoParmBean.getRuidu().byteValue();
struCameraCfg_ex.struVideoEffect.sedu = videoParmBean.getSedu().byteValue();
struCameraCfg_ex.struVideoEffect.baohedu = videoParmBean.getBaohedu().byteValue();
struCameraCfg_ex.struVideoEffect.duibidu = videoParmBean.getDuibidu().byteValue();
struCameraCfg_ex.struNoiseRemove.byDigitalNoiseRemoveLevel = videoParmBean.getQuzao().byteValue();
Pointer lpInBuffer = struCameraCfg_ex.getPointer();
struCameraCfg_ex.write();
if(!hCNetSDK.NET_DVR_SetDVRConfig(new NativeLong(Long.parseLong(lUser)), 3369/*NET_DVR_SET_CCDPARAMCFG_EX*/, new NativeLong(lCannel), lpInBuffer, struCameraCfg_ex.size())){
return false;
}
return true;
}

關於回調函數的設置,可以在報警的地方找到


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM