陈拓 2021/08/10-2020/08/10
1. 下载海康威视SDK
见《海康威视SDK实例QtDemo显示NVR视频窗口(Linux+Qt)》
https://zhuanlan.zhihu.com/p/395178052
https://blog.csdn.net/chentuo2000/article/details/119299045
2. 开发环境
我的开发环境:PC机(Win10)+工控机(Ubuntu)+海康NVR+海康摄像头
lsb_release -a
Win10操作Linux见《Win10命令窗口的SSH和SFTP操作》
https://zhuanlan.zhihu.com/p/403558589
https://blog.csdn.net/chentuo2000/article/details/119918637
和《Ubuntu18.04和Win10共享文件夹》
https://zhuanlan.zhihu.com/p/397913390
https://blog.csdn.net/chentuo2000/article/details/119539502
3. 复制consoleDemo到Ubuntu。
如果所有者和组不是当前登录用户,要改变所有者和组:
sudo chown -R ccdc:ccdc consoleDemo/
查看consoleDemo目录
4. 复制库文件
- 查看readme.txt
在构建源代码之前:
- 请将SDK/lib目录下所有的库文件(.so)拷贝到consoleDemo/Linux64/lib
- 进入目录consoleDemo/Linux64/proj,执行make命令。
- 复制库文件
- 安装tree命令
- 查看目录结构
tree linux64/
5. 编译Demo
进入目录consoleDemo/Linux64/proj
- 编译
执行make命令
在lib目录下生成了可执行文件sdkTest:
为方便测试我们修改一下Makefile文件。
将EXE = ../lib/sdkTest改为:EXE = ./hkConsole
再编译make
这样生成的可执行文件就在本地了:
6. 连接NVR
见《Ubuntu18.04网络配置》
https://zhuanlan.zhihu.com/p/398167001
https://blog.csdn.net/chentuo2000/article/details/119564109
设备可以是NVR或者DVR,我用NVR。
我的NVR参数
我的摄像头参数
海康威视DS-IPC-B12-I(4mm)
7. 修改程序代码
将连接参数设置成我们自己的。
- C++程序
- 编辑consolemain.cpp
修改网络连接参数:
nano src/consoleMain.cpp
如图将下面3句:
改为
找到其他要修改的地方:
grep -r "10.8.98.80" src
如同修改consolemain.cpp一样,一一修改。
nano src/Voice.cpp
nano src/GetStream.cpp
nano src/Alarm.cpp
nano src/ConfigParams.cpp
nano src/CapPicture.cpp
nano src/playback.cpp
nano src/playback.cpp
再编译make。
8. 运行Demo
- 运行
./hkConsole
程序可以运行了。
登录设备:Login dev 192.168.137.2:8000.
界面上有太多的调试日志信息,可以改变信息显示等级,我的修改如下:
修改consoleMain.cpp
将NET_DVR_SetLogToFile(3, "./sdkLog");中的3改为0,保存。
日志的等级(默认为0):0-表示关闭日志,1-表示只输出ERROR错误日志,2-输出ERROR错误信息和DEBUG调试信息,3-输出ERROR错误信息、DEBUG调试信息和INFO普通信息等所有信息。你可以根据自己的需要设置日志等级。
编译
警告,在"./sdkLog"前面加上类型。
再编译就没有警告了。
运行
画面干净。
程序虽然可以运行了,但是所列出的功能基本上都不能用,需要根据设备的具体情况修改。
9. 修改连接
例子程序中多个功能程序单独初始化连接设备,下面我们把初始化放在主程序中,以后只要将用户ID作为参数传递到各个功能模块程序就可以了。
- 修改consoleMain.cpp
#include <stdio.h>
#include <iostream>
#include "GetStream.h"
#include "public.h"
#include "ConfigParams.h"
#include "Alarm.h"
#include "CapPicture.h"
#include "playback.h"
#include "Voice.h"
#include "tool.h"
#include <string.h>
using namespace std;
void Demo_SDK_Version();
void Demo_SDK_Ability();
char * iIP = (char *)"192.168.137.2";
WORD wPort = 8000;
char * iUserName = (char *)"admin";
char * iPassword = (char *)"xxxxxxxx";
int lUserID = -1;
// 初始化
int init() {
NET_DVR_Init();
Demo_SDK_Version(); // 显示SDK版本
NET_DVR_SetLogToFile(0, (char*)"./sdkLog");
printf("\nIP %s\n", iIP);
printf("Port %d\n", wPort);
printf("UserName %s\n", iUserName);
printf("Password %s\n", iPassword);
//Login device
NET_DVR_USER_LOGIN_INFO struLoginInfo = {0};
NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = {0};
struLoginInfo.bUseAsynLogin = false; // false=0,同步登录
struLoginInfo.wPort = wPort;
memcpy(struLoginInfo.sDeviceAddress, iIP, NET_DVR_DEV_ADDRESS_MAX_LEN);
memcpy(struLoginInfo.sUserName, iUserName, NAME_LEN);
memcpy(struLoginInfo.sPassword, iPassword, NAME_LEN);
lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40); //接口返回-1表示登录失败,其他值表示返回的用户ID值。用户ID具有唯一性,后续对设备的操作都需要通过此ID实现。
if (lUserID < 0) {
printf("pyd---Login error, %d\n", NET_DVR_GetLastError());
if(NET_DVR_GetLastError() == 7) {
printf("连接设备失败。设备不在线或网络原因引起的连接超时等。\n");
}
NET_DVR_Cleanup();
return HPR_ERROR;
}
cout << "\nlUserID is " << lUserID << endl;
DWORD bytesReturned = 0;
NET_DVR_DEVICECFG devCfg;
devCfg.dwSize = sizeof(NET_DVR_DEVICECFG);
bool resCode = NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_DEVICECFG, -1, &devCfg, sizeof(NET_DVR_DEVICECFG), &bytesReturned);
if (!resCode) {
DWORD code = NET_DVR_GetLastError();
std::cout << "NET_DVR_GetDVRConfig failed " << NET_DVR_GetErrorMsg((LONG*)(&code)) << std::endl;
NET_DVR_Logout(lUserID);
//释放SDK资源
NET_DVR_Cleanup();
::getchar();
return -1;
}
cout << "设备信息: " << endl;
std::cout << "设备名: " << devCfg.sDVRName << ", 序列号: " << devCfg.sSerialNumber << ", 设备ID号: " << devCfg.dwDVRID << ", 设备类型: " << (int)devCfg.byDVRType << std::endl;
return 0;
}
int main() {
int iok = init();
if (iok == 0) cout << "连接设备化成功!" << endl;
else cout << "连接设备失败!" << endl;
char cUserChoose = 'r';
if (lUserID < 0) {
printf("pyd---Login error, %d\n", NET_DVR_GetLastError());
printf("Press any key to quit...\n");
cin>>cUserChoose;
NET_DVR_Cleanup();
return HPR_ERROR;
}
while ('q' != cUserChoose) {
printf("\n");
printf("Input 1, Test GetStream\n");
printf(" 2, Test Configure params\n");
printf(" 3, Test Alarm\n");
printf(" 4, Test Capture Picture\n");
printf(" 5, Test play back\n");
printf(" 6, Test Voice\n");
printf(" 7, Test SDK ability\n");
printf(" 8, Test tool interface\n");
printf(" q, Quit.\n");
printf("Input:");
cin>>cUserChoose;
switch (cUserChoose) {
case '1':
Demo_GetStream_V30(lUserID); //Get stream.
break;
case '2':
Demo_ConfigParams(lUserID); // 设备参数
break;
case '3':
Demo_Alarm(); //Alarm & listen.
break;
case '4':
Demo_Capture(lUserID);
break;
case '5':
Demo_PlayBack((int)lUserID); //record & playback
break;
case '6':
Demo_Voice();
break;
case '7':
Demo_SDK_Ability();
break;
case '8':
Demo_DVRIPByResolveSvr();
break;
default:
break;
}
}
//logout
// NET_DVR_Logout(lUserID);
NET_DVR_Logout_V30(lUserID); //注销用户
NET_DVR_Cleanup(); //释放SDK资源
return 0;
}
void Demo_SDK_Ability() {
NET_DVR_Init();
NET_DVR_SDKABL struSDKABL = {0};
if (NET_DVR_GetSDKAbility(&struSDKABL))
{
printf("SDK Max: %d\n", struSDKABL.dwMaxRealPlayNum);
NET_DVR_Cleanup();
return;
}
NET_DVR_Cleanup();
return;
}
void Demo_SDK_Version() {
unsigned int uiVersion = NET_DVR_GetSDKBuildVersion();
char strTemp[1024] = {0};
sprintf(strTemp, "HCNetSDK V%d.%d.%d.%d\n", \
(0xff000000 & uiVersion)>>24, \
(0x00ff0000 & uiVersion)>>16, \
(0x0000ff00 & uiVersion)>>8, \
(0x000000ff & uiVersion));
printf("%s", strTemp);
}
- 编译运行
接下来我们要取得摄像头的视频通道号,见
《海康威视SDK控制台程序consoleDemo获取视频通道参数》
https://zhuanlan.zhihu.com/p/404390272
https://blog.csdn.net/chentuo2000/article/details/119963580