一,前言
公司一項目需要拿到海康刻錄機里面某時間段的視頻去刻錄。遇到問題第一時間看官網有么有demo可以套用,哎,一言難盡,打開官網看到文檔后,感覺長得不像,就沒繼續看了,不知道怎么弄的我,迷茫着在網上找答案,網上這方面的資料也少的厲害。最終還是硬着頭皮把官網上的看着像的全下載了,終於找到了自己想要目標
二,下載
官網文檔 https://www.hikvision.com/cn/download_61.html
請根據需要下載,這里我下載的是 設備網絡SDK_Win64 :
三,整理成項目並運行
下載完之后打開該目錄:根據個人的下載盤符,這是我的目錄 H:\海康設備資料\CH-HCNetSDKV5.3.6.30_build20180816_Win64\Demo示例\4- Java 開發示例\1-ClientDemo\ClientDemo-NetBeansPro
然后將整個ClientDemo-NetBeansPro文件拷貝到你的工作空間,用你的idea 或者 eclipse 打開,解決錯誤。這里提一句,切記你的jdk版本,你是用64位的SDK就需要64位 jdk 反之自己想。后面有用的。
eclipse 直接導進去就OK
idea需要手動添加 examples.jar和jna.jar
其中jna.jar可以在Maven的pom.xml中直接添加
1 <!-- https://mvnrepository.com/artifact/com.sun.jna/jna --> 2 <dependency> 3 <groupId>com.sun.jna</groupId> 4 <artifactId>jna</artifactId> 5 <version>3.0.9</version> 6 </dependency> 7
添加examples.jar, 具體怎么添加maven沒有的jar,網上自己搜,很多方式,以下只是我自己的方式。
這個添加完之后一般情況下沒太多的錯誤,有啥錯誤自己瞅瞅改吧改吧也就沒有了,過去半個月了,我也不太記得有啥比較難的錯誤。
這里需要提醒一句,下面圖標紅的這個文件一定的看。
給大家看看我的工程目錄,這里標記的幾個文件需要處於同一級目錄,切記不可以修改 HCNetSDKCom 文件名稱,jar包記得添加
這里看一下HCNetSDK.dll文件的加載
有一個有趣的現象,eclipse里的 HCNetSDK.dll 加載,沒有寫絕對路徑是OK的,沒有報 HCNetSDK.dll 文件找不到的情況,可在idea中 無論如何都得寫絕對路徑,不然加載不上HCNetSDK.dll,希望誰看到可以給我說下是怎么一回事。
報錯,找不到 HCNetSDK.dll文件 一共有倆原因,一個是路徑問題,一個是 jdk 版本問題(官網上下載的64位SDK,請使用64位JDK,這是一個血淋淋的經歷,親身體驗到的痛苦)
給大家看下IDEA下 HCNetSDK.dll 文件的加載
ClientDemo 這個是運行類(mian 方法),跑起來是一個Java swing界面(具體用的是swing 還是啥技術,沒必要糾結)
填寫刻錄機的后台 登陸賬號, 密碼 ,IP,端口號
這里我就不演示成功后的樣子了,沒有現場環境了。
下來直接上菜把。。。 想要自己研究的可以根據這個swing界面跟蹤 代碼接口,也可以查看下載SDK里的文檔說明,里面說的很詳細
第一步 初始化
第二步 注冊登陸
第三步 下載指定視頻(這里我只用到了按時間下載的視頻)
首先再次展示一下項目結構
上代碼(超級簡單,這里是我下載測試使用的)
1 package atest; 2 3 import java.util.Timer; 4 5 import javax.swing.JOptionPane; 6 7 import com.sun.jna.Native; 8 import com.sun.jna.NativeLong; 9 import com.sun.jna.Union; 10 import com.sun.jna.examples.win32.W32API.HWND; 11 import com.sun.jna.ptr.IntByReference; 12 13 import ClientDemo.ClientDemo; 14 import ClientDemo.HCNetSDK; 15 16 public class Test { 17 static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; 18 static HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo;// 設備信息 19 static HCNetSDK.NET_DVR_IPPARACFG m_strIpparaCfg;// IP參數 20 static HCNetSDK.NET_DVR_CLIENTINFO m_strClientInfo;// 用戶參數 21 static NativeLong lUserID;// 用戶句柄 22 static NativeLong m_lLoadHandle;// 下載句柄 23 static String sDeviceIP;// IP 24 static Timer Downloadtimer; 25 26 public void A_d() { 27 // =====================1. 初始化開始==================================== 28 boolean initfalse = hCNetSDK.NET_DVR_Init();// 初始化 29 if (initfalse != true) { 30 System.out.println("初始化失敗!"); 31 } else { 32 System.out.println("初始化成功!"); 33 } 34 // =====================初始化結束===================================== 35 36 // =====================2. 注冊服務開始==================================== 37 sDeviceIP = "92.206.75.30";// IP 38 int iPort = 8000;// 端口號 39 String textFieldUserName = "admin";// 用戶名 40 String passwordFieldPwd = "fpga12345";// 密碼 41 42 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30(); 43 lUserID = hCNetSDK.NET_DVR_Login_V30(sDeviceIP, (short) iPort, textFieldUserName, passwordFieldPwd, 44 m_strDeviceInfo); 45 long userID = lUserID.longValue(); 46 if (userID >= 0) { 47 System.out.println("登陸注冊成功"); 48 } else if (userID == -1) { 49 System.out.println("登陸注冊失敗"); 50 } 51 52 // =====================注冊服務結束==================================== 53 54 55 // =====================按照開始時間和結束時間下載視頻 開始==================================== 56 m_lLoadHandle = new NativeLong(-1); 57 if (m_lLoadHandle.intValue() == -1) { 58 HCNetSDK.NET_DVR_TIME struStartTime; 59 HCNetSDK.NET_DVR_TIME struStopTime; 60 61 struStartTime = new HCNetSDK.NET_DVR_TIME(); 62 struStopTime = new HCNetSDK.NET_DVR_TIME(); 63 struStartTime.dwYear = Integer.parseInt("2019");// 開始時間 64 struStartTime.dwMonth = Integer.parseInt("3"); 65 struStartTime.dwDay = Integer.parseInt("26"); 66 struStartTime.dwHour = Integer.parseInt("18"); 67 struStartTime.dwMinute = Integer.parseInt("0"); 68 struStartTime.dwSecond = Integer.parseInt("0"); 69 70 struStopTime.dwYear = Integer.parseInt("2019");// 結束時間 71 struStopTime.dwMonth = Integer.parseInt("3"); 72 struStopTime.dwDay = Integer.parseInt("26"); 73 struStopTime.dwHour = Integer.parseInt("18"); 74 struStopTime.dwMinute = Integer.parseInt("5"); 75 struStopTime.dwSecond = Integer.parseInt("0"); 76 int m_iChanShowNum = 1;// 通道(攝像頭IP地址) 77 78 String sFileName = "H:\\test\\" + sDeviceIP + m_iChanShowNum + struStartTime.toStringTitle() + struStopTime.toStringTitle() + ".mp4"; 79 System.out.println(sFileName); 80 81 // 視頻下載調用 82 m_lLoadHandle = hCNetSDK.NET_DVR_GetFileByTime(lUserID, new NativeLong(m_iChanShowNum), struStartTime, 83 struStopTime, sFileName); 84 if (m_lLoadHandle.intValue() >= 0) { 85 hCNetSDK.NET_DVR_PlayBackControl(m_lLoadHandle, HCNetSDK.NET_DVR_PLAYSTART, 0, null); 86 Downloadtimer = new Timer();// 新建定時器 87 Downloadtimer.schedule(new DownloadTask(), 0, 5000);// 0秒后開始響應函數 88 // System.out.println("視頻下載成功!"); 89 } else { 90 System.out.println("下載失敗");// 按時間 91 System.out.println("laste error " + hCNetSDK.NET_DVR_GetLastError()); 92 return; 93 } 94 } 95 } 96 97 /************************************************* 98 * 類: DownloadTask 類描述: 下載定時器響應函數 99 *************************************************/ 100 class DownloadTask extends java.util.TimerTask { 101 // 定時器函數 102 @Override 103 public void run() { 104 IntByReference nPos = new IntByReference(0); 105 hCNetSDK.NET_DVR_PlayBackControl(m_lLoadHandle, HCNetSDK.NET_DVR_PLAYGETPOS, 0, nPos); 106 if (nPos.getValue() > 100) { 107 hCNetSDK.NET_DVR_StopGetFile(m_lLoadHandle); 108 m_lLoadHandle.setValue(-1); 109 Downloadtimer.cancel(); 110 System.out.println("由於網絡原因或DVR忙,下載異常終止!"); 111 } 112 if (nPos.getValue() == 100) { 113 hCNetSDK.NET_DVR_StopGetFile(m_lLoadHandle); 114 m_lLoadHandle.setValue(-1); 115 Downloadtimer.cancel(); 116 System.out.println("按時間下載結束!"); 117 } 118 } 119 } 120 121 }
mian調用一下就OK
1 package atest; 2 3 public class Test_Main { 4 public static void main(String[] args) { 5 Test test = new Test(); 6 test.A_d(); 7 } 8 }
這里沒有調用 結束調用SDK的接口,因為沒看到影響 。。。所以 。。。
到此海康NVR或者DVR視頻的下載就OK了,自己往項目中整合。
這里是給自己一個記錄,同時看到哪里有問題,請兄弟們在下方留言指正。