QT5.6 MSVC编译器 实现-海康摄像头,获取H.264裸码流并通过libmp4V2实现MP4写封装生成MP4视频文件
前言
当前,在国内安防领域,海康摄像头一直是受各个解决方案比较青睐的摄像头选择。本项目主要应用海康摄像头对桥梁道路车辆运行情况进行监控。当桥梁称重系统检测到车辆异常信号后,触发摄像服务程序,采集摄像头在该时间段内的是视频数据(事件的前五秒与后五秒)并保存为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视频文件相关推荐
- Python解码H.264(二)——将海思处理器编码的H.264裸码流转换为jpg序列
上一篇我们历尽千辛万苦完成了PyAV的安装,这一篇我们来小试牛刀. 思路:通过PyAV来把海思Hi3516编码处理器编码的h.264裸码流中的每一帧都转换为一张jpeg编码的图片,然后将这些jpg图像 ...
- 海康API——获取监控点预览取流URL,获取的rtmp流不能播放
取rtmp流时,不要expand这一句
- 【海康摄像头】海康摄像头SDK下载与使用
文章目录 一.海康摄像头SDK官网下载 二.海康摄像头SDK在WinForm/WPF中使用 三.常用接口函数,封装调用函数 一.海康摄像头SDK官网下载 1.进入海康ws官网,下载官网SDK和相关文档 ...
- 海康摄像头YUV420P格式图片缩放
上面文章说过了YUV格式拼接,拼接的数据就需要提前对图像进行缩放的功能 海康摄像头获取到了图像数据解码后,分辨率随着设想头的不同,会造成YUV格式图片分辨率不同,就需要对图片进行缩放,YUV的缩放就用 ...
- web播放海康摄像头rstp流
海康摄像头直接前端播放. 1.获取海康摄像头rstp流地址.这个地址是个固定格式. 老版本的格式 rtsp://[username]:[password]@[ip]:[port]/[codec]/[c ...
- unity通过rtsp协议实现海康摄像头的实时连接(一)
一.前一段时间实现了通过winform调取摄像头的实时监控运行程序,详见源码:https://download.csdn.net/download/lsc_hei/10652399 二.现在需求改变, ...
- 海康摄像头二次开发动态配置.dll与.so文件
需求 再对海康摄像头进行二次开发时,需要将海康提供的.dll(window)文件或.so(linux)文件通过路径的方式进行配置,项目在window上开发.在linux上进行部署,另一方面在linux ...
- 海康摄像头的二次开发(java)
海康摄像头的二次开发(java) 我第一次接触海康摄像头的二次开发的项目,一开始的时候摸不清套路,走了不少弯路,现在准备把我的一些经验留下来,让大家参考一下. 1.首先到海康的官网下载设备网络SDK: ...
- 两个rtsp同时抓流_海康摄像头同时添加到两台海康硬盘录像机上
相信大家都有这种经历,我我为啥要多买两个摄像头呀,我直接一个摄像头添加到两台硬盘录像机上不香吗? 海康摄像头一般不建议同时添加到超过三台录像机,由于取流限制~ 那么如何同时添加到两台海康录像机上呢? ...
最新文章
- python 底层原理_Python 探针实现原理
- [ATF]-ATF的代码学习篇-一篇就够了
- “智慧北京”让生活更美好
- 电商企业怎样用好大数据
- http://circles.arenaofthemes.com/
- 命名规范、MVC 开发模式
- Netfilter分析
- mysql 绕过select报错_Web安全之SQL注入(原理,绕过,防御)
- python pyecharts 折线图_Python数据可视化之pyecharts实现各种图表
- 推荐一个不错的plist拆解工具,untp
- AndroidDeveloper 读者专属福利
- 《Java语言程序设计》(基础篇原书第10版)第五章复习题答案
- matlab可以输出图像吗,MATLAB中使用程序输出图片
- 测试驱动开发(TDD)开发思路
- shiro 框架实现 LDAP 登录
- ERP(企业资源计划)
- IOTOS物联中台从0到1开发Thales800驱动 实例详解
- 同城双活与异地多活架构分析
- 【codeforces85D】
- 怎么恢复电脑删除的文件,误删除数据恢复