问题记录:

基于海康的sdk写了一些代码,用于控制摄像头。其中有一段程序主要是用来获取NVR通道配置信息
参考:https://blog.51cto.com/u_15127677/4382288
代码如下,
用到了一个函数NET_DVR_GetDVRConfig

#include <iostream>
#include "HCNetSDK.h"
int main()
{NET_DVR_Init();//设置连接时间与重连时间NET_DVR_SetConnectTime(2000, 1);NET_DVR_SetReconnect(10000, true);// 注册设备LONG lUserID;//登录参数,包括设备地址、登录用户、密码等NET_DVR_USER_LOGIN_INFO struLoginInfo = { 0 };struLoginInfo.bUseAsynLogin = 0; //同步登录方式strcpy(struLoginInfo.sDeviceAddress, "192.168.20.106"); //设备IP地址struLoginInfo.wPort = 8000; //设备服务端口strcpy(struLoginInfo.sUserName, "admin"); //设备登录用户名strcpy(struLoginInfo.sPassword, "111111hk"); //设备登录密码//设备信息, 输出参数NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = { 0 };lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);if (lUserID < 0){printf("Login failed, error code: %d\n", NET_DVR_GetLastError());NET_DVR_Cleanup();return -1;}NET_DVR_IPPARACFG_V40 ipcfg;DWORD bytesReturned = 0;ipcfg.dwSize = sizeof(NET_DVR_IPPARACFG_V40);int iGroupNO = 0;bool resCode = NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_IPPARACFG_V40, iGroupNO,  &ipcfg, sizeof(NET_DVR_IPPARACFG_V40), &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);NET_DVR_Cleanup();return -1;}std::cout << "设备组 " << ipcfg.dwGroupNum << " 数字通道个数 " << ipcfg.dwDChanNum <<  " 起始通道 " << ipcfg.dwStartDChan << std::endl << std::endl;for (int i = 0; i < ipcfg.dwDChanNum; i++){       NET_DVR_PICCFG_V30 channelInfo;bytesReturned = 0;channelInfo.dwSize = sizeof(NET_DVR_PICCFG_V30);int channelNum = i + ipcfg.dwStartDChan;NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_PICCFG_V30, channelNum, &channelInfo,  sizeof(NET_DVR_PICCFG_V30), &bytesReturned);std::cout <<"通道号 "<< channelNum << "\t通道名称 " << channelInfo.sChanName;std::cout << "\t用户名 " << ipcfg.struIPDevInfo[i].sUserName << "\t密码 " <<  ipcfg.struIPDevInfo[i].sPassword;std::cout << "\t设备ID " << (int)ipcfg.struIPDevInfo[i].szDeviceID;std::cout << "\tip地址 " << ipcfg.struIPDevInfo[i].struIP.sIpV4 << "\t端口 " <<  ipcfg.struIPDevInfo[i].wDVRPort << std::endl;}//释放SDK资源NET_DVR_Logout(lUserID);NET_DVR_Cleanup();return 0;
}

这段代码本来运行ok,但是迁移到别的机器上时,出问题了。
报错:NET_DVR_GetDVRConfig failed Device does not support this function
提示这个设备不支持这个函数,原因在手册上面有写。

注意这句话:
如果设备支持IP通道个数大于0,则可以通过远程参数配置接口NET_DVR_GetDVRConfig
也就意味着,你要使用这个函数,需要先检验,设备支持的IP通道个数。
同时,手册上也给了示例程序(先检验,再调用)
示例程序如下:
ps:有一点想吐槽,手册上面关于NET_DVR_GetDVRConfig这个函数的解释,丝毫没有提到这个问题,害的我好找,找了很久才找到这里有写。既然这个函数并不是所有设备都支持的,那么规范的写法就应该先检验,再调用。

#include <stdio.h>
#include <iostream>
#include "Windows.h"
#include "string.h"
#include "HCNetSDK.h"
using namespace std;
void main()
{int i=0;BYTE byIPID,byIPIDHigh;int iDevInfoIndex, iGroupNO, iIPCh;DWORD dwReturned = 0;//---------------------------------------// 初始化NET_DVR_Init();//设置连接时间与重连时间NET_DVR_SetConnectTime(2000, 1);NET_DVR_SetReconnect(10000, true);//---------------------------------------// 注册设备LONG lUserID;//登录参数,包括设备地址、登录用户、密码等NET_DVR_USER_LOGIN_INFO struLoginInfo = {0};struLoginInfo.bUseAsynLogin = 0; //同步登录方式strcpy(struLoginInfo.sDeviceAddress, "192.0.0.64"); //设备IP地址struLoginInfo.wPort = 8000; //设备服务端口strcpy(struLoginInfo.sUserName, "admin"); //设备登录用户名strcpy(struLoginInfo.sPassword, "abcd1234"); //设备登录密码//设备信息, 输出参数NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = {0};lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);if (lUserID < 0){printf("Login failed, error code: %d\n", NET_DVR_GetLastError());NET_DVR_Cleanup();return;}printf("The max number of analog channels: %d\n",struDeviceInfoV40.struDeviceV30.byChanNum); //模拟通道个数printf("The max number of IP channels: %d\n", struDeviceInfoV40.struDeviceV30.byIPChanNum + struDeviceInfoV40.struDeviceV30.byHighDChanNum * 256);//IP通道个数//获取IP通道参数信息NET_DVR_IPPARACFG_V40 IPAccessCfgV40;memset(&IPAccessCfgV40, 0, sizeof(NET_DVR_IPPARACFG));iGroupNO=0;if (!NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_IPPARACFG_V40, iGroupNO, &IPAccessCfgV40, sizeof(NET_DVR_IPPARACFG_V40), &dwReturned)){printf("NET_DVR_GET_IPPARACFG_V40 error, %d\n", NET_DVR_GetLastError());NET_DVR_Logout(lUserID);NET_DVR_Cleanup();return;}else{for (i=0;i<IPAccessCfgV40.dwDChanNum;i++){switch(IPAccessCfgV40.struStreamMode[i].byGetStreamType){case 0: //直接从设备取流if (IPAccessCfgV40.struStreamMode[i].uGetStream.struChanInfo.byEnable){byIPID=IPAccessCfgV40.struStreamMode[i].uGetStream.struChanInfo.byIPID;byIPIDHigh=IPAccessCfgV40.struStreamMode[i].uGetStream.struChanInfo.byIPIDHigh;iDevInfoIndex=byIPIDHigh*256 + byIPID-1-iGroupNO*64;printf("IP channel no.%d is online, IP: %s\n", i+1, IPAccessCfgV40.struIPDevInfo[iDevInfoIndex].struIP.sIpV4);}break;case 1: //从流媒体取流if (IPAccessCfgV40.struStreamMode[i].uGetStream.struPUStream.struStreamMediaSvrCfg.byValid){printf("IP channel %d connected with the IP device by stream server.\n", i+1);printf("IP of stream server: %s, IP of IP device: %s\n",IPAccessCfgV40.struStreamMode[i].uGetStream.\struPUStream.struStreamMediaSvrCfg.struDevIP.sIpV4, IPAccessCfgV40.struStreamMode[i].uGetStream.\struPUStream.struDevChanInfo.struIP.sIpV4);}break;default:break;}}}//配置IP通道5;iIPCh=4;//支持自定义协议NET_DVR_CUSTOM_PROTOCAL struCustomPro;if (!NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_CUSTOM_PRO_CFG, 1, &struCustomPro, sizeof(NET_DVR_CUSTOM_PROTOCAL), &dwReturned))//获取自定义协议1{printf("NET_DVR_GET_CUSTOM_PRO_CFG error, %d\n", NET_DVR_GetLastError());NET_DVR_Logout(lUserID);NET_DVR_Cleanup();return;}struCustomPro.dwEnabled=1;   //启用主码流struCustomPro.dwEnableSubStream=1; //启用子码流strcpy((char *)struCustomPro.sProtocalName,"Protocal_RTSP");  //自定义协议名称:Protocal_RTSP,最大16字节struCustomPro.byMainProType=1;    //主码流协议类型: 1- RTSPstruCustomPro.byMainTransType=2;  //主码流传输协议: 0-Auto, 1-udp, 2-rtp over rtspstruCustomPro.wMainPort=554;     //主码流取流端口strcpy((char *)struCustomPro.sMainPath,"rtsp://192.168.1.65/h264/ch1/main/av_stream");//主码流取流URLstruCustomPro.bySubProType=1;    //子码流协议类型: 1-RTSPstruCustomPro.bySubTransType=2;  //子码流传输协议: 0-Auto, 1-udp, 2-rtp over rtspstruCustomPro.wSubPort=554;     //子码流取流端口strcpy((char *)struCustomPro.sSubPath,"rtsp://192.168.1.65/h264/ch1/sub/av_stream");//子码流取流URLif (!NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_CUSTOM_PRO_CFG, 1, &struCustomPro, sizeof(NET_DVR_CUSTOM_PROTOCAL)))//设置自定义协议1{printf("NET_DVR_SET_CUSTOM_PRO_CFG error, %d\n", NET_DVR_GetLastError());NET_DVR_Logout(lUserID);NET_DVR_Cleanup();return;}printf("Set the custom protocol: %s\n", "Protocal_RTSP");NET_DVR_IPC_PROTO_LIST m_struProtoList;if (!NET_DVR_GetIPCProtoList(lUserID, &m_struProtoList)) //获取设备支持的前端协议{printf("NET_DVR_GetIPCProtoList error, %d\n", NET_DVR_GetLastError());NET_DVR_Logout(lUserID);NET_DVR_Cleanup();return;}IPAccessCfgV40.struIPDevInfo[iIPCh].byEnable=1;     //启用for (i = 0; i<m_struProtoList.dwProtoNum; i++){if(strcmp((char *)struCustomPro.sProtocalName,(char *)m_struProtoList.struProto[i].byDescribe)==0){IPAccessCfgV40.struIPDevInfo[iIPCh].byProType=m_struProtoList.struProto[i].dwType; //选择自定义协议break;}}//IPAccessCfgV40.struIPDevInfo[iIPCh].byProType=0;  //厂家私有协议strcpy((char *)IPAccessCfgV40.struIPDevInfo[iIPCh].struIP.sIpV4,"192.168.1.65"); //前端IP设备的IP地址IPAccessCfgV40.struIPDevInfo[iIPCh].wDVRPort=8000;  //前端IP设备服务端口strcpy((char *)IPAccessCfgV40.struIPDevInfo[iIPCh].sUserName,"admin");  //前端IP设备登录用户名strcpy((char *)IPAccessCfgV40.struIPDevInfo[iIPCh].sPassword,"12345");  //前端IP设备登录密码IPAccessCfgV40.struStreamMode[iIPCh].byGetStreamType=0;IPAccessCfgV40.struStreamMode[iIPCh].uGetStream.struChanInfo.byChannel=1;IPAccessCfgV40.struStreamMode[iIPCh].uGetStream.struChanInfo.byIPID=(iIPCh+1)%256;IPAccessCfgV40.struStreamMode[iIPCh].uGetStream.struChanInfo.byIPIDHigh=(iIPCh+1)/256;//IP通道配置,包括添加、删除、修改IP通道等if (!NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_IPPARACFG_V40, iGroupNO, &IPAccessCfgV40, sizeof(NET_DVR_IPPARACFG_V40))){printf("NET_DVR_SET_IPPARACFG_V40 error, %d\n", NET_DVR_GetLastError());NET_DVR_Logout(lUserID);NET_DVR_Cleanup();return;}else{printf("Set IP channel no.%d, IP: %s\n", iIPCh+1, IPAccessCfgV40.struIPDevInfo[iIPCh].struIP.sIpV4);}//注销用户NET_DVR_Logout(lUserID);//释放SDK资源NET_DVR_Cleanup();return;
}

海康威视SDK:NET_DVR_GetDVRConfig failed Device does not support this function相关推荐

  1. 海康威视SDK控制台程序consoleDemo获取视频通道参数

    陈拓 2021/08/27-2020/08/27 1. 概述 在<海康威视SDK控制台程序consoleDemo> https://zhuanlan.zhihu.com/p/4039038 ...

  2. 海康威视错误代码0xf_调用海康威视sdk获取车牌号

    环境: win10(10.0.16299.0)+ vs2017 sdk版本:CH-HCNetSDK_Win32_V5.3.2.15_build20171122https://download.csdn ...

  3. 海康威视SDK控制台程序consoleDemo

    陈拓 2021/08/10-2020/08/10 1. 下载海康威视SDK 见<海康威视SDK实例QtDemo显示NVR视频窗口(Linux+Qt)> https://zhuanlan.z ...

  4. 调用海康威视sdk获取车牌号

    环境: win10(10.0.16299.0)+ vs2017 sdk版本:CH-HCNetSDK_Win32_V5.3.2.15_build20171122 https://download.csd ...

  5. 海康威视SDK控制台程序consoleDemo将实时码流保存为视频文件mp4

    陈拓 2021/08/28-2020/08/29 1. 概述 在<海康威视SDK控制台程序consoleDemo> https://zhuanlan.zhihu.com/p/4039038 ...

  6. 海康威视SDK通过NVR获取视频设备的状态

    海康威视SDK通过NVR获取视频设备的状态 前言 项目现场是通过NVR对多路摄像头设备进行集中管理,包括实时画面的预览和视频信号的存储.回放. 现在要实现这样一个功能:定期查询摄像头的状态,以确保摄像 ...

  7. 海康威视SDK实例QtDemo显示NVR视频窗口(Linux+Qt)

    海康威视SDK实例QtDemo显示NVR视频窗口(Linux+Qt) 陈拓 2021/07/312021/08/01 1. 概述 在<海康威视客户端iVMS-4200连接NVR> http ...

  8. win10系统海康威视SDK二次开发Qt环境配置

    先下载海康SDK 我下载的win64版本: 海康SDK官网下载 解压后得到库文件和头文件 头文件 库文件 新建QWidget项目,选择64位的kits工具,在pro目录新建include文件夹和lib ...

  9. 二、JAVA调用海康威视SDK实现摄像头预览完整版

    接上一章:一.JAVA调用海康威视SDK实现摄像头预览 添加摄像头信息输入框 添加视频控制按钮 添加截图功能 代码: PreView.java package com.kx.hcws;import j ...

最新文章

  1. git rebase(变基)—— Git 学习笔记 19
  2. java例7_在Java 7中处理周数
  3. 【题解】 [HEOI2016]排序题解 (二分答案,线段树)
  4. ThreadLocal的空指针异常问题
  5. 什么时候使用mysql触发器_MySQL触发器的使用
  6. 无数种求逆元的方法总结
  7. 【impala】impala的shell命令使用
  8. 【烟雾检测】基于matlab背景模糊模型视频烟雾检测【含Matlab源码 153 期】
  9. plc原理及应用_一年只一次,百篇电工+PLC技术资料大合集,不看真的亏!
  10. android 垂直方向布局,Android详解4种基本布局
  11. 写论文时优雅的在word中添加程序代码
  12. EML-NET: An Expandable Multi-Layer NETwork for Saliency Prediction【论文笔记】
  13. 干货分享!软考中高项案例分析10大管理领域理论背诵要点
  14. graphpad两组t检验_如何用GraphPad Prism进行两组连续变量的比较
  15. TI-RTOS---Semaphores
  16. 学会使用Composer
  17. 华为鸿蒙太空人壁纸,华为太空人动态壁纸下载-华为太空人动态壁纸图片高清版-丫丫安卓网...
  18. kali 切换root账号
  19. java非主流火星文输入法_火星文转换器,火星文转换器在线转换
  20. Ubuntu系统中如何截图和修改截图快捷键

热门文章

  1. 属于我们的学生时代杀青啦
  2. 传真百科:电子传真邮件客户端
  3. arcgis for js 画圆圈(会跟地图一起缩小),而不是打点然后加半径的圆点(不会缩小),制作打卡功能选点。可以点击地图自动画圆圈
  4. 拼多多竞价成功后多久有流量?万顿思教育
  5. 使用APICloud AVM框架开发人事档案管理助手APP
  6. 纠正你读错的电脑英文词汇(程序员真的可以看看)
  7. C语言----小游戏
  8. 2019年春节春晚红包大战战报!30亿!
  9. php页眉,FPDF页眉和页脚 - php
  10. 周周有惊喜奖,第三期开奖名单 --2007中国软件开发者大调查