一、前言

在视频监控行业领域,海康当之无愧是老大,稳坐第一的宝座很多年了,近期需要将视频监控系统改成采用海康sdk的内核,于是特意去查阅了sdk的使用手册,sdk相关的文档和文件可以直接官网下载到,而且是经常更新的,目前提供了windows和linux上的,win上的sdk还是更新比较快而且完整的,但是在linux上的就不得不吐槽下了,很旧很旧的版本,不要看打包文件很新,其实里面的内容是很老的,不知道为啥官方不也同步更新linux上的sdk,也许现在linux上的需求还不是很多吧,但是随着国产化的大力推进,估计不久的将来linux上的也会慢慢的完善起来的,说不定官方早就有了此计划,还有一种个人的猜测是linux上的开发包估计官方自己内部用的新的,可能打算自己做linux上的各种客户端吧。

官方的sdk手册做的还是非常详细的,而且还给到了VC/JAVA/C#等语言的demo代码,这点肯定值的表扬的,一个产品持续卖得很好,肯定有他深层次的原因,除了产品本身质量过硬以外,周边的服务也是必须要跟上的。由于本人习惯用Qt来做开发,所以直接编译了VC的demo,一步到位跑起来了,界面相对来说简单丑陋了点,但是要的大部分的功能还是有的,可能很多按钮也没摆摆整齐呢,管他呢,我们要的就是功能,演示如何使用对应的方法函数等,至于界面美化这块,尽量交给专业的UI妹子吧,没有UI妹子那就自己搞点qss样式表弄上去凑合着用吧,界面的美化核心主要就两点:布局+配色。

官方把他们常用的大类设备的sdk都封装到一起了,一个头文件老大了,光HCNetSDK.h这个头文件都47451行,我的乖乖,估计是为了方便用户使用,都放到一个头文件里面了,其实这些sdk不光只是支持摄像机,NVR/CVR等设备也都是支持的,兼容性比价好,用同一个sdk都可以,官方只是对一个大类的都统一起来了,不同大类的硬件产品之间的sdk还是有点区别出入,比如现在流行的人脸识别、红外测温等,那都是新增加的硬件和功能,但是总体接口和使用流程上都大体一致。

解码处理流程:

  1. 调用NET_DVR_Init初始化sdk,一个项目中只需要初始化一次。
  2. 调用NET_DVR_SetConnectTime、NET_DVR_SetReconnect设置连接时间与重连时间。
  3. 填充NET_DVR_PREVIEWINFO结构体数据用来登录。
  4. 调用NET_DVR_Login_V30登录设备。
  5. 调用NET_DVR_RealPlay_V40播放视频。
  6. 调用NET_DVR_StopRealPlay停止播放。
  7. 调用NET_DVR_Logout登出设备。

二、功能特点

  1. 支持播放视频流和本地MP4文件。
  2. 支持句柄和回调两种模式。
  3. 多线程显示图像,不卡主界面。
  4. 自动重连网络摄像头。
  5. 可设置边框大小即偏移量和边框颜色。
  6. 可设置是否绘制OSD标签即标签文本或图片和标签位置。
  7. 可设置两种OSD位置和风格。
  8. 可设置是否保存到文件以及文件名。
  9. 可直接拖曳文件到haikangwidget控件播放。
  10. 支持h264/h265视频流。
  11. 可暂停播放和继续播放。
  12. 支持存储单个视频文件和定时存储视频文件。
  13. 自定义顶部悬浮条,发送单击信号通知,可设置是否启用。
  14. 可设置画面拉伸填充或者等比例填充。
  15. 可设置解码是速度优先、质量优先、均衡处理。
  16. 可对视频进行截图(原始图片)和截屏(视频窗体)。
  17. 录像文件存储为MP4文件。
  18. 支持焦距控制、云台控制。
  19. 可定制功能。

三、效果图

四、相关站点

  1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
  2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
  3. 个人主页:https://blog.csdn.net/feiyangqingyun
  4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
  5. 体验地址:https://blog.csdn.net/feiyangqingyun/article/details/97565652

五、核心代码

bool HaiKangThread::playRtsp()
{
bool ok = false;
QString ip, userName, userPwd;
int port, streamType;
getInfo(ip, port, streamType, userName, userPwd); //登录设备
NET_DVR_DEVICEINFO_V30 deviceInfo;
long userid = NET_DVR_Login_V30(ip.toUtf8().data(), port, userName.toUtf8().data(), userPwd.toUtf8().data(), &deviceInfo);
if (userid >= 0) {
qDebug() << TIMEMS << "登录海康设备成功" << userid << deviceInfo.sSerialNumber;
//这里还需要拿到视频流的宽高
//qDebug() << TIMEMS << url << "videoWidth:" << videoWidth << "videoHeight:" << videoHeight; //以下参数具体见对应头文件说明
NET_DVR_PREVIEWINFO previewInfo;
previewInfo.lChannel = 1;
previewInfo.dwStreamType = streamType;
previewInfo.dwLinkMode = (transport == "tcp" ? 0 : 1);
previewInfo.bBlocked = 0;
previewInfo.byProtoType = 1;
previewInfo.byPreviewMode = 0;
previewInfo.dwDisplayBufNum = 15; //回调则可以拿到音视频数据,否则就直接句柄播放
if (callback) {
hand = NET_DVR_RealPlay_V40(userid, &previewInfo, RealDataCallBack, this);
} else {
previewInfo.hPlayWnd = (HWND)playWidget->winId();
hand = NET_DVR_RealPlay_V40(userid, &previewInfo, NULL, NULL);
} if (hand >= 0) {
ok = true;
qDebug() << TIMEMS << "打开视频数据成功" << url << "码流" << streamType;
} else {
qDebug() << TIMEMS << "打开视频数据失败" << url << NET_DVR_GetLastError();
}
} else {
qDebug() << TIMEMS << "登录海康设备失败" << NET_DVR_GetLastError();
} return ok;
} bool HaiKangThread::playLocal()
{
//转码以便支持中文路径
QTextCodec *codec = QTextCodec::codecForName("gb2312");
QByteArray data = codec->fromUnicode(url); PlayM4_GetPort(&port);
bool ok = PlayM4_OpenFile(port, data.data());
if (ok) {
//设置文件播放完毕回调函数
PlayM4_SetFileEndCallback(port, FileEndCallback, this); //回调则可以拿到音视频数据,否则就直接句柄播放
if (callback) {
PlayM4_SetDecCallBackMend(port, DecCallBack, (quser)this);
PlayM4_Play(port, NULL);
} else {
PlayM4_Play(port, (HWND)playWidget->winId());
} //同时播放声音
PlayM4_PlaySound(port); //倒放
//PlayM4_ReversePlay(port); //快进播放,多次调用速度更快
//PlayM4_Fast(port);
//PlayM4_Fast(port); ok = true;
qDebug() << TIMEMS << "打开视频文件成功" << url;
} else {
qDebug() << TIMEMS << "打开视频文件失败" << url << PlayM4_GetLastError(port);
} return ok;
} bool HaiKangThread::init()
{
//判断该摄像机是否能联通
if (checkConn && isRtsp) {
if (!checkUrl(url, checkTime)) {
return false;
}
} if (playWidget == NULL) {
return false;
} //视频流和本地文件分别处理
bool ok = false;
if (isRtsp) {
ok = playRtsp();
} else {
ok = playLocal();
} if (!ok) {
return false;
} //设置保存文件
this->initSave();
return true;
} void HaiKangThread::free()
{
if (isRtsp) {
//停止播放+登出设备
NET_DVR_StopRealPlay(hand);
NET_DVR_Logout(hand);
hand = -1;
} else {
//停止播放+关闭文件+释放端口
PlayM4_Stop(port);
PlayM4_StopSound();
PlayM4_CloseFile(port);
PlayM4_FreePort(port);
port = -1;
}
}

Qt音视频开发17-海康sdk解码的更多相关文章

  1. 海康SDK编程指南(C#二次开发版本)

    海康SDK编程指南 目前使用的海康SDK包括IPC_SDK(硬件设备),Plat_SDK(平台),其中两套SDK都需单独调用海康播放库PlayCtrl.dll来解码视频流,返回视频信息和角度信息.本文 ...

  2. 使用golang对海康sdk进行业务开发

    目录 准备工作 开发环境信息 改写HCNetSDK.h头文件 开发过程 基本数据类型转换 业务开发 参考 项目最近需要改造升级:操作海康摄像头(包括登录,拍照,录像)等基本功能.经过一段时间研究后,发 ...

  3. 海康SDK编程指南

    转至心澄欲遣 目前使用的海康SDK包括IPC_SDK(硬件设备),Plat_SDK(平台),其中两套SDK都需单独调用海康播放库PlayCtrl.dll来解码视频流,返回视频信息和角度信息.本文仅对视 ...

  4. WebRTC 音视频开发

    WebRTC 音视频开发 webrtc   Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译 ...

  5. 转:Android IOS WebRTC 音视频开发总结 (系列文章集合)

    随笔分类 - webrtc   Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译和整理的,译 ...

  6. Android IOS WebRTC 音视频开发总结(四六)-- 从另一个角度看国内首届WebRTC大会

    文章主要从开发者角度谈国内首届WebRTC大会,支持原创,文章来自博客园RTC.Blacker,支持原创,转载必须说明出处,更多详见www.rtc.help. -------------------- ...

  7. 海康SDK JAVA版本调用步骤及问题介绍

    一.前言 本文为海康SDK JAVA版本Demo的介绍,采用Eclipse运行,以及一些问题记录. 海康SDK版本:SDK_Win32 Eclipse版本:Mars2.0 JDK版本:1.8.0_15 ...

  8. Python音视频开发:消除抖音短视频Logo的图形化工具实现

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<Python音视频开发:消除抖音短视频Logo和去电视台标的实现详解>节介绍了怎么通过Python+Moviepy+OpenCV实现 ...

  9. Moviepy音视频开发:视频转gif动画或jpg图片exe图形化工具开发案例

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 老猿之所以学习和研究Moviepy的使用,是因为需要一个将视频转成动画的工具,当时在网上到处搜索查找免费使用工具,结果找了很多自称免费的工具,但转完 ...

  10. moviepy音视频开发:使用credits1给视频加片头片尾字幕

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip.UpdatedVideoClip.ImageClip. ...

随机推荐

  1. 轻量级网络-MobileNetv1 论文解读

    1.相关工作 标准卷积 分组卷积 从 Inception module 到 depthwise separable convolutions 2.MobileNets 结构 2.1,深度可分离卷积 D ...

  2. 深度解读RDS for MySQL 审计日志功能和原理

    本文分享自华为云社区<[华为云MySQL技术专栏]RDS for MySQL 审计日志功能介绍>,作者:GaussDB数据库. 1. 背景 在生产环境中,当数据库出现故障或问题时,运维人员 ...

  3. 5.6 Linux Vim撤销和恢复撤销快捷键

    使用 Vim 编辑文件内容时,经常会有如下 2 种需求: 对文件内容做了修改之后,却发现整个修改过程是错误或者没有必要的,想将文件恢复到修改之前的样子. 将文件内容恢复之后,经过仔细考虑,又感觉还是刚 ...

  4. RL 基础 | 如何使用 OpenAI Gym 接口,搭建自定义 RL 环境(详细版)

    参考: 官方链接:Gym documentation | Make your own custom environment 腾讯云 | OpenAI Gym 中级教程--环境定制与创建 知乎 | 如何 ...

  5. IPC-7095E-2024 EN Design and Assembly Process Guidance for Ball Grid Arrays (BGAs). IPC-7095E BGA 设计与组装工艺的实施

    IPC-7095E-2024 EN Design and Assembly Process Guidance for Ball Grid Arrays (BGAs).pdf链接: https://pa ...

  6. 2023NOIP A层联测28 T4 小猫吃火龙果

    2023NOIP A层联测28 T4 小猫吃火龙果 分块题,跟赛时的一个倍增部分分做法很像. 思路 如果没有动态操作,可以设 \(dp[i][T][k]\) 为:在 \(i\) 时为 \(T(T\in ...

  7. apisix问题记录

    负载均衡 可以给 rest api(9080)做负载均衡 不可以给dashboard做负载均衡,否则会出现闪退,dashboard之间的token并不是通用的 路由导出 openapi 路由导出ope ...

  8. 服务器安全之DenyHosts

    情景:今天登录服务器,突然发现登录之后展示的信息有点多,仔细端倪发现: There were 3975 failed login attempts since the last successful ...

  9. PythonDay6Advance

    PythonDay6Advance 模块.类与对象 模块 内置模块 time, random, os, json 第三方模块 requests, pandas, numpy,.... 自定义模块 xx ...

  10. 网站刚上线,就被 DDoS 攻击炸了!

    今天是一个值得纪念的日子,你打开一罐可乐,看着自己刚刚上线的小网站,洋洋得意. 这是你第一次做的网站,上线之后,网站访问量突飞猛进:没过多久,你就拿到了千万的风投,迎娶了女神,走上了人生巅峰... 害 ...