资源下载链接

第一次使用海康威视的网络摄像头并进行二次开发,海康威视网络摄像头的二次开发的资料已经比较详细,网上关于这方面的介绍也不少。此处基于我的需求做了一些工作,特此记录。

目标:

1、实时预览

2、抓图

3、录制视频

4、监听告警信号

摄像头型号如下:

准备工作:

官网下载对应的版本的SDK:https://www.hikvision.com/cn/download_61.html

在下载的文件中有对应的开发指南、库文件、头文件、Demo示例等

代码分析:

//消息异常回调函数
void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)
{//qDebug("g_ExceptionCallBack: lUserID = %d, dwType = 0x%x\r\n",lUserID, dwType);switch(dwType){case EXCEPTION_RECONNECT:    //预览时重连break;case PREVIEW_RECONNECTSUCCESS:case EXCEPTION_RELOGIN:case RESUME_EXCHANGE: break;default:break;}
}
LONG lPort = -1; //全局的播放库port号
void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize, DWORD dwUser)
{switch (dwDataType){case NET_DVR_SYSHEAD: //系统头if (lPort >= 0){break;  //该通道取流之前已经获取到句柄,后续接口不需要再调用}if (!PlayM4_GetPort(&lPort))  //获取播放库未使用的通道号{break;}//m_iPort = lPort; //第一次回调的是系统头,将获取的播放库port号赋值给全局port,下次回调数据时即使用此port号播放if (dwBufSize > 0){if (!PlayM4_SetStreamOpenMode(lPort, STREAME_REALTIME))  //设置实时流播放模式{break;}if (!PlayM4_OpenStream(lPort, pBuffer, dwBufSize, 1024*1024)) //打开流接口{break;}/*       if (!PlayM4_Play(lPort, m_hWnd)) //播放开始{break;}*/}break;case NET_DVR_STREAMDATA:   //码流数据if (dwBufSize > 0 && lPort != -1){if (!PlayM4_InputData(lPort, pBuffer, dwBufSize)){break;}}break;default: //其他数据if (dwBufSize > 0 && lPort != -1){if (!PlayM4_InputData(lPort, pBuffer, dwBufSize)){break;}}break;}
}
//监听告警
void CALLBACK MessageCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser)
{((camerawidget*)pUser)->msgCallback(lCommand, pAlarmer, pAlarmInfo, dwBufLen);return;
}void camerawidget::msgCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen)
{QString text = QString("msgCallback lCommand = %1").arg(lCommand);NET_VCA_RULE_ALARM struVcaRuleALramInfo;memcpy(&struVcaRuleALramInfo, pAlarmInfo, sizeof(NET_VCA_RULE_ALARM));switch (lCommand){case COMM_ALARM_RULE:{ switch (struVcaRuleALramInfo.struRuleInfo.wEventTypeEx){case ENUM_VCA_EVENT_TRAVERSE_PLANE:{ QString text = QString("越界");break;}case ENUM_VCA_EVENT_ENTER_AREA:{ QString text = QString("进入");break;} case ENUM_VCA_EVENT_LOITER:{ QString text = QString("徘徊");break;}case ENUM_VCA_EVENT_INTRUSION:{ QString text = QString("入侵");break;}case ENUM_VCA_EVENT_EXIT_AREA:{ QString text = QString("离开");break;}default:break; }break;} default:break; }return;
}
//初始化SDK
bool camerawidget::initSDK()
{bool isok = NET_DVR_Init();if(isok == false){QMessageBox::warning(NULL,"error","NET_DVR_Init error;error number is "+QString::number(NET_DVR_GetLastError()));return isok;}//设置连接时间与重连时间NET_DVR_SetConnectTime(2000, 1);NET_DVR_SetReconnect(10000, true);return isok;
}//登录摄像机
void camerawidget::loginCamera(QString ip , int port , QString userName , QString password)
{//设置异常消息回调函数NET_DVR_SetExceptionCallBack_V30(0, NULL,g_ExceptionCallBack, NULL);NET_DVR_DEVICEINFO_V30 DeviceInfoTmp;userID = NET_DVR_Login_V30(ip.toLatin1().data() ,port, userName.toLatin1().data(), password.toLatin1().data() ,&DeviceInfoTmp);//设置报警回调函数BOOL isSuccess = NET_DVR_SetDVRMessageCallBack_V30(MessageCallback, this);if (isSuccess){//"NET_DVR_SetDVRMessageCallBack_V30 success"}//启用布防NET_DVR_SetupAlarmChan_V30(userID);if(m_cameraIndex >= RSPS_MAX_CAMERA_COUNT){return;}if(userID == RSPS_INVALID_CAMERA_USER_ID){QString text = tr("Login camera fail , IP = %1").arg(ip);}
}
//开始预览
void camerawidget::startPreview()
{if(userID == RSPS_INVALID_CAMERA_USER_ID){return;}//预览NET_DVR_PREVIEWINFO struPlayInfo;struPlayInfo={0};struPlayInfo.hPlayWnd = (HWND)ui->label->winId();    //需要 SDK 解码时句柄设为有效值,仅取流不解码时可设为空struPlayInfo.lChannel = 1;//预览通道号struPlayInfo.dwStreamType = 0;//码流类型:0-主码流,1-子码流,2-三码流,3-虚拟码流,以此类推struPlayInfo.dwLinkMode = 0;//0- TCP 方式,1- UDP 方式,2- 多播方式,3- RTP 方式,4-RTP/RTSP,5-RSTP/HTTPstruPlayInfo.bBlocked = 1;//0- 非阻塞取流,1- 阻塞取流IRealPlayHandle = NET_DVR_RealPlay_V40(userID,&struPlayInfo,NULL,NULL);if(IRealPlayHandle <0){QString text = tr("NET_DVR_RealPlay_V40 error, error number = %1").arg(NET_DVR_GetLastError());NET_DVR_Logout(userID);userID=-1;IRealPlayHandle = -1;return;}//注册回调函数if (!NET_DVR_SetRealDataCallBack(IRealPlayHandle, g_RealDataCallBack_V30 , 0)){QString text = tr("NET_DVR_SetRealDataCallBack error, error number = %1").arg(NET_DVR_GetLastError());}
}//开始抓图
void camerawidget::onClickedCapture()
{if(userID!=-1){NET_DVR_JPEGPARA IpJpegPara2;IpJpegPara2.wPicQuality=0;IpJpegPara2.wPicSize=0xff;// 检查目录是否存在,若不存在则新建QString dirStr = RSPS_CAMERA_PIC_DIR;QDir dir;if (!dir.exists(dirStr)){dir.mkpath(dirStr);}QDateTime current_date_time =QDateTime::currentDateTime();QString current_date =current_date_time.toString("yyyy-MM-dd_hh-mm-ss_zzz");QString fileName = dirStr + "\\";fileName += "M" + current_date;fileName += ".jpg";if(NET_DVR_CaptureJPEGPicture(userID,1,&IpJpegPara2, fileName.toLatin1().data())==false){QMessageBox::warning(NULL,"error","NET_DVR_CaptureJPEGPicture error;error number "+QString::number(NET_DVR_GetLastError()));return;}}
}//开始录像
void camerawidget::onClickedStartRecording()
{// 检查目录是否存在,若不存在则新建QString dirStr = RSPS_CAMERA_FILE_DIR;QDir dir;if (!dir.exists(dirStr)){dir.mkpath(dirStr);}//设置当前时间为文件名QString currentTime = QDateTime::currentDateTime().toString("yyyy-MM-dd_hh-mm-ss-zzz");QString sFileName = dirStr + "\\";sFileName += "M" + currentTime;sFileName += ".mp4";if(!NET_DVR_SaveRealData(IRealPlayHandle ,  sFileName.toLatin1().data())){QMessageBox::warning(NULL , "警告" , "启动录像失败"+QString::number(NET_DVR_GetLastError()));}
}

资源下载链接

欢迎大家指教,希望大家喜欢

路漫漫其修远兮,同志仍须努力

基于QT的海康威视网络摄像头二次开发相关推荐

  1. 基于QT的华为网络摄像头二次开发

    资源下载链接 第一次使用华为的网络摄像头并进行二次开发,网上关于QT对华为网络摄像头的二次开发的文章很少,基于项目的需求做了一些工作,特此记录. 目标: 1.实时预览 2.手动控制录制视频 3.监听告 ...

  2. 基于Qt的海康威视网络摄像头SDK的二次开发

    最近用Qt做了一个基于海康威视网络摄像头SDK的二次开发,效果还不错.文章最后将开发的资料和demo软件通过链接方式分享,有兴趣的可以看下效果. 开发情况介绍: qt版本:Qt5.14.2 海康SDK ...

  3. 基于Qt的海康威视网络摄像头SDK的二次开发——摄像头登录和预览

    海康威视网络摄像头SDK的二次开发,需要摄像头IP地址,与主机的IP地址在同一网段,能够ping通摄像头IP,才能登录成功.摄像头是有账户名和密码,这需要记住,在开发的时候需要用到. 在开发前可以先用 ...

  4. 基于QT的海康威视的相机二次开发

    与上一篇不同的是,本篇注重于实现相机的一键开启,注重相机采集过程中调整曝光量和伽马矫正等.(代码来自短学期实践时五位老师提供的,上传以供大家学习借鉴) 代码资源: 链接:https://pan.bai ...

  5. 基于Qt上USBCAN模块的二次开发

    最近用qt做了一个USBCAN二次开发的上位机软件.经过本人实际测试,效果不错,界面和官方的软件类似.做此软件的目的主要是学会调用该模块的二次开发库, 采集数据时也就可以将数据进行简单的处理,这样调试 ...

  6. 海康网络摄像头二次开发

    项目中用到了海康的一款网络摄像头,基于项目自身需求编写软件需要用到海康提供的sdk,通过查看海康提供的示例,决定在第一个分功能示例的基础上进行程序编写.由于我们并没有使用云台,因此将其中的云台控制相关 ...

  7. 漏刻有时API接口实战开发系列(10):海康威视、大华网络摄像头二次开发云直播和监控时技术参数的说明

    项目需求 基于海康威视.大华网络摄像头等硬件设备,实现网络直播监控,同时在web端.H5手机端等实现视频的实时预览.回放等功能. 项目分析 实现云直播和云监控,必须将设备联入公网.常用的解决方案: 参 ...

  8. 基于QT实现对网络摄像头数据的显示

    其实一直有一个想法,就是设计一个远程视频监控软件,目前自己手中有的硬件包括:mini2440开发板,韦东山老师的摄像头模块ov7740,当然这款摄像头提供了基于mini2440下的读取及显示功能,但是 ...

  9. 海康威视网络摄像头sdk的开发(Demo的使用)指南

    如果您是想实现海康sdk包的Demo实例中MFC的分功能,那么请慢慢看,这篇文章百分之九十九可以帮你实现. 提醒:内容来自网络和自己实际操作,如有问题请联系hww168@yeah.net 首先,我们去 ...

最新文章

  1. 论如何骗过计算机视觉AI网络,UCLA专家为你支几招
  2. 第十六届全国大学生智能汽车竞赛总决赛 AI视觉组线上赛细则草案 - 初步版本
  3. bootstrap 固定最底部_bootstrap 固定底部导航自适应
  4. JVM之垃圾收集机制四种GC算法详解
  5. [导入]基类的复制控制函数
  6. CLR via C# 3 读书笔记(4):第1章 CLR执行模型 — 1.4 执行程序集代码
  7. Number 和 Math 类
  8. Java 并发编程之自定义线程池 ThreadPoolExecutor
  9. 互联网内卷之谁也别想好!
  10. Java反序列s ysoserial Spring
  11. 技术人员必备的学习工具
  12. qt可以实现创建临时无线热点吗?_数据线断了,身边又没有路由,如何无线高速传输文件?...
  13. 深度置信网络JAVA代码,DeeBNetV2.2 深度置信网络源码,有配合的文档可以参考,详见内容 matlab 247万源代码下载- www.pudn.com...
  14. 挑战程序设计竞赛:Conscription
  15. ios系统gps测试软件,GPS工具箱
  16. 看完不会你揍我!!Pytorch利用文本数据建立自己的数据集- Dataset Dataloader详解 附案例
  17. 光子晶体的应用背景和研究历史
  18. 学习python第五天
  19. 主流的开源免费erp(至少十年以上历史)
  20. xctf攻防世界 MISC高手进阶区 2017_Dating_in_Singapore

热门文章

  1. 国防科大计算机考博大纲,2020年国防科技大学数字信号处理考博大纲
  2. 接入腾讯云短信(免费+个人开发者)
  3. 【计算机考研复习计划】数学二+英语二+政治+408相关科目的复习建议
  4. java中servlet dal bll model_风云
  5. Flink如何保证数据的一致性
  6. KVM虚拟化平台搭建+理论
  7. 史上最牛叉的程序员招聘信息
  8. 英语发音规则---X字母
  9. 幸福人生讲座(四):孝道与仁爱是根本
  10. 从url到页面渲染浏览器经历了什么?