前言

当前,在国内安防领域,海康摄像头一直是受各个解决方案比较青睐的摄像头选择。本项目主要应用海康摄像头对桥梁道路车辆运行情况进行监控。当桥梁称重系统检测到车辆异常信号后,触发摄像服务程序,采集摄像头在该时间段内的是视频数据(事件的前五秒与后五秒)并保存为MP4文件,上传至FTP服务供后期使用。

视频知识补充


海康摄像头获取回放视频文件通常为H.264编码格式,rtp,ps,ts封装协议的视频文件,安放领域较长使用的视频封装协议。而web页面只支持MP4封装协议的文件播放。所以本方案采用获取裸码流,并使用libmp4V2的方法进行MP4协议封装

关键代码

海康裸码获取

static void CALLBACK PlayBackH264DataCallBack(LONG lPlayHandle, NET_DVR_PACKET_INFO_EX *struPackInfo, void *pUser)
{StructH264Process *obj = static_cast<StructH264Process *>(pUser);switch (struPackInfo->dwPacketType){case FILE_HEAD:     // 头break;case VIDEO_I_FRAME: // I 帧obj->MP4.getConvertMP4File(struPackInfo->pPacketBuffer, struPackInfo->dwPacketSize, struPackInfo->dwPacketType);break;case VIDEO_B_FRAME: // B 帧break;case VIDEO_P_FRAME: // P 帧obj->MP4.getConvertMP4File(struPackInfo->pPacketBuffer, struPackInfo->dwPacketSize, struPackInfo->dwPacketType);break;default:       // 其他数据break;}
}CHKProcess::CHKProcess(QObject *parent) : QObject(parent)
{}int CHKProcess::init(QString host, int port, QString usr, QString pwd)
{//---------------------------------------// 初始化NET_DVR_Init();//设置连接时间与重连时间NET_DVR_SetConnectTime(2000, 1);NET_DVR_SetReconnect(10000, true);//---------------------------------------// 注册设备//登录参数,包括设备地址、登录用户、密码等NET_DVR_USER_LOGIN_INFO struLoginInfo = {0};struLoginInfo.bUseAsynLogin = 0; //同步登录方式strcpy(struLoginInfo.sDeviceAddress, host.toStdString().data()); //设备IP地址struLoginInfo.wPort = port; //设备服务端口strcpy(struLoginInfo.sUserName, usr.toStdString().data()); //设备登录用户名strcpy(struLoginInfo.sPassword, pwd.toStdString().data()); //设备登录密码//设备信息, 输出参数NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = {0};m_userId = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);if (m_userId< 0){qDebug()<<"HIKVISION login fail,last error"<<NET_DVR_GetLastError();NET_DVR_Cleanup();return -1;}qDebug()<<"HIKVISION connect!";return 0;
}void CHKProcess::downLoadFile(uint64_t startTime, uint64_t endTime,QString enventId,QString did)
{p_H264Process.isfinish = false;p_H264Process.isok = false;QString fileName = QCoreApplication::applicationDirPath()+"/cache/V_"+enventId+"_"+did+".mp4";if(!p_H264Process.MP4.CreateMP4File(fileName.toStdString())){qDebug()<<"Failed to create MP4 file";p_H264Process.isfinish = true;p_H264Process.isok = false;p_H264Process.MP4.getMP4FileClose();p_H264Process.MP4.init();return;}uint64_t currentTime = QDateTime::currentDateTime().toTime_t();if((startTime>endTime) || (startTime>currentTime)){qDebug()<<"startTime:Command time parameter error";p_H264Process.isfinish = true;p_H264Process.isok = false;p_H264Process.MP4.getMP4FileClose();p_H264Process.MP4.init();return;}if(currentTime<endTime){if(endTime - currentTime>100){qDebug()<<"Error:The end time is more than 100 seconds ahead of the current time";p_H264Process.isfinish = true;p_H264Process.isok = false;p_H264Process.MP4.getMP4FileClose();p_H264Process.MP4.init();return;}QThread::sleep(endTime-currentTime);}QString strStartTime = QDateTime::fromTime_t(startTime).toString("yyyyMMddhhmmss");QString strEndTime = QDateTime::fromTime_t(endTime).toString("yyyyMMddhhmmss");QDate startDate = QDate::fromString(strStartTime.mid(0,8),"yyyyMMdd");QDate endDate = QDate::fromString(strEndTime.mid(0,8),"yyyyMMdd");QTime qstartTime = QTime::fromString(strStartTime.mid(8,6),"hhmmss");QTime qendTime = QTime::fromString(strEndTime.mid(8,6),"hhmmss");//按时间回放NET_DVR_VOD_PARA struVodPara = { 0 };struVodPara.dwSize = sizeof(struVodPara);struVodPara.struIDInfo.dwSize = sizeof(NET_DVR_STREAM_INFO);struVodPara.struIDInfo.dwChannel = 1;struVodPara.hWnd = NULL;struVodPara.struBeginTime.dwYear = startDate.year();struVodPara.struBeginTime.dwMonth = startDate.month();struVodPara.struBeginTime.dwDay = startDate.day();struVodPara.struBeginTime.dwHour = qstartTime.hour();struVodPara.struBeginTime.dwMinute = qstartTime.minute();struVodPara.struBeginTime.dwSecond = qstartTime.second();struVodPara.struEndTime.dwYear = endDate.year();struVodPara.struEndTime.dwMonth = endDate.month();struVodPara.struEndTime.dwDay = endDate.day();struVodPara.struEndTime.dwHour = qendTime.hour();struVodPara.struEndTime.dwMinute = qendTime.minute();struVodPara.struEndTime.dwSecond = qendTime.second();//---------------------------------------//按时间回放p_H264Process.hPlayback = NET_DVR_PlayBackByTime_V40(m_userId, &struVodPara);if(p_H264Process.hPlayback < 0){printf("NET_DVR_PlayBackByTime_V40 fail,last error %d\n", NET_DVR_GetLastError());p_H264Process.isfinish = true;p_H264Process.isok = false;p_H264Process.MP4.getMP4FileClose();p_H264Process.MP4.init();return;}//---------------------------------------//开始if (!NET_DVR_PlayBackControl_V40(p_H264Process.hPlayback, NET_DVR_PLAYSTART, NULL, 0, NULL, NULL)){printf("HK play back control start failed [%d]\n", NET_DVR_GetLastError());p_H264Process.isfinish = true;p_H264Process.isok = false;p_H264Process.MP4.getMP4FileClose();p_H264Process.MP4.init();return;}NET_DVR_SetPlayBackESCallBack(p_H264Process.hPlayback,PlayBackH264DataCallBack,&p_H264Process);QThread::sleep(10); //10s延迟用于等待视频流数据返回if(!NET_DVR_StopPlayBack(p_H264Process.hPlayback)){printf("HK failed to stop play back [%d]\n",NET_DVR_GetLastError());p_H264Process.isfinish = true;p_H264Process.isok = false;p_H264Process.MP4.getMP4FileClose();p_H264Process.MP4.init();return;}p_H264Process.MP4.getMP4FileClose();p_H264Process.MP4.init();p_H264Process.isok = true;p_H264Process.isfinish = true;qDebug()<<"HK"<<" Video download complete %100";qDebug()<<"*";//---------------------------------------//设置文件封装格式int p = 4;if(!NET_DVR_PlayBackControl_V40(hPlayback,NET_DVR_SET_TRANS_TYPE,&p,4,NULL,NULL)){qDebug()<<"HK Play setting failed,last error "<<NET_DVR_GetLastError();p_isok = false;return;}//开始下载if(!NET_DVR_PlayBackControl_V40(hPlayback, NET_DVR_PLAYSTART, NULL, 0, NULL,NULL)){qDebug()<<"HK Play back control failed,last error "<<NET_DVR_GetLastError();p_isok = false;return;}int nPos = 0;for(nPos = 0; nPos < 100&&nPos>=0; nPos = NET_DVR_GetDownloadPos(hPlayback)){QThread::msleep(500);}if(!NET_DVR_StopGetFile(hPlayback)){printf("HK failed to stop get file [%d]\n",NET_DVR_GetLastError());p_isok = false;return;}if(nPos<0||nPos>100){qDebug()<<"HK download err,last error "<<NET_DVR_GetLastError();QFile file(fileName);if(file.open(QIODevice::ReadOnly)){if(file.size() == 0){p_isok = false;qDebug()<<"Video download fail,not upload ftp!";return;}}}p_isok = true;qDebug()<<"HK"<<QString("V_")+enventId+"_"+did+".mp4"<<" Video download complete %"<<nPos<<"\n";qDebug()<<"*";
}CHKProcess::~CHKProcess()
{//注销用户NET_DVR_Logout(m_userId);//释放SDK资源NET_DVR_Cleanup();
}

QT5.6 MSVC编译器 实现-海康摄像头,获取H.264裸码流并通过libmp4V2实现MP4写封装生成MP4视频文件相关推荐

  1. Python解码H.264(二)——将海思处理器编码的H.264裸码流转换为jpg序列

    上一篇我们历尽千辛万苦完成了PyAV的安装,这一篇我们来小试牛刀. 思路:通过PyAV来把海思Hi3516编码处理器编码的h.264裸码流中的每一帧都转换为一张jpeg编码的图片,然后将这些jpg图像 ...

  2. 海康API——获取监控点预览取流URL,获取的rtmp流不能播放

    取rtmp流时,不要expand这一句

  3. 【海康摄像头】海康摄像头SDK下载与使用

    文章目录 一.海康摄像头SDK官网下载 二.海康摄像头SDK在WinForm/WPF中使用 三.常用接口函数,封装调用函数 一.海康摄像头SDK官网下载 1.进入海康ws官网,下载官网SDK和相关文档 ...

  4. 海康摄像头YUV420P格式图片缩放

    上面文章说过了YUV格式拼接,拼接的数据就需要提前对图像进行缩放的功能 海康摄像头获取到了图像数据解码后,分辨率随着设想头的不同,会造成YUV格式图片分辨率不同,就需要对图片进行缩放,YUV的缩放就用 ...

  5. web播放海康摄像头rstp流

    海康摄像头直接前端播放. 1.获取海康摄像头rstp流地址.这个地址是个固定格式. 老版本的格式 rtsp://[username]:[password]@[ip]:[port]/[codec]/[c ...

  6. unity通过rtsp协议实现海康摄像头的实时连接(一)

    一.前一段时间实现了通过winform调取摄像头的实时监控运行程序,详见源码:https://download.csdn.net/download/lsc_hei/10652399 二.现在需求改变, ...

  7. 海康摄像头二次开发动态配置.dll与.so文件

    需求 再对海康摄像头进行二次开发时,需要将海康提供的.dll(window)文件或.so(linux)文件通过路径的方式进行配置,项目在window上开发.在linux上进行部署,另一方面在linux ...

  8. 海康摄像头的二次开发(java)

    海康摄像头的二次开发(java) 我第一次接触海康摄像头的二次开发的项目,一开始的时候摸不清套路,走了不少弯路,现在准备把我的一些经验留下来,让大家参考一下. 1.首先到海康的官网下载设备网络SDK: ...

  9. 两个rtsp同时抓流_海康摄像头同时添加到两台海康硬盘录像机上

    相信大家都有这种经历,我我为啥要多买两个摄像头呀,我直接一个摄像头添加到两台硬盘录像机上不香吗? 海康摄像头一般不建议同时添加到超过三台录像机,由于取流限制~ 那么如何同时添加到两台海康录像机上呢? ...

最新文章

  1. python 底层原理_Python 探针实现原理
  2. [ATF]-ATF的代码学习篇-一篇就够了
  3. “智慧北京”让生活更美好
  4. 电商企业怎样用好大数据
  5. http://circles.arenaofthemes.com/
  6. 命名规范、MVC 开发模式
  7. Netfilter分析
  8. mysql 绕过select报错_Web安全之SQL注入(原理,绕过,防御)
  9. python pyecharts 折线图_Python数据可视化之pyecharts实现各种图表
  10. 推荐一个不错的plist拆解工具,untp
  11. AndroidDeveloper 读者专属福利
  12. 《Java语言程序设计》(基础篇原书第10版)第五章复习题答案
  13. matlab可以输出图像吗,MATLAB中使用程序输出图片
  14. 测试驱动开发(TDD)开发思路
  15. shiro 框架实现 LDAP 登录
  16. ERP(企业资源计划)
  17. IOTOS物联中台从0到1开发Thales800驱动 实例详解
  18. 同城双活与异地多活架构分析
  19. 【codeforces85D】
  20. 怎么恢复电脑删除的文件,误删除数据恢复

热门文章

  1. 基于Linux视频驱动接口V4L2视频采集编程
  2. SnagIt32截图工具的使用
  3. java phash算法 图片_图片相似度——hash算法简介
  4. lisp填挖横断面提取_CASS横断面提取程序,望大侠们改善改善
  5. 基于 HTML5 的 3D 飞机飞行轨道控制
  6. oracle 创建只有查询表权限的用户
  7. 苹果cmsv10泡泡影视自适应美化简洁高端简约模板
  8. QNX Hypervisor —— 时间
  9. ercharts一个页面能放几个_在同一页面中显示多个echart图表
  10. 电脑锁屏后一直亮屏的解决方法?