一、前言

在视频监控行业领域,海康当之无愧是老大,稳坐第一的宝座很多年了,近期需要将视频监控系统改成采用海康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. Oracle问题:alter update modify 的区别是什么?

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247486480&idx=1 ...

  2. vue数据异步加载!坑

    "Error in render: "TypeError: Cannot read property '0' of undefined""渲染错误问题 搭建项目 ...

  3. C# 利用epplus导出excel,自动求和

    /// <summary> /// 生成xlsx /// </summary> /// <param name="dvLine">数据视图< ...

  4. MFC应用当中,修改tab顺序

    打开资源文件,按"Ctrl+D"组合键,可以查看控件的Tab顺序,使用鼠标顺序点击即可改变Tab顺序,此方法在Visual Studio 2022版本有效,其余版本没有测试过.

  5. 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-5-创建首个自动化脚本(详细教程)

    1.简介 前面几篇宏哥介绍了两种(java和maven)环境搭建和浏览器的启动方法,这篇文章宏哥将要介绍第一个自动化测试脚本.前边环境都搭建成功了,浏览器也驱动成功了,那么我们不着急学习其他内容,首先 ...

  6. python的orjson

    简介 首先我们先来了解下orjson的优缺点: 可以将datetime.date和time实例序列化为RFC 3339格式,例如:"2022-06-12T00:00:00+00:00&quo ...

  7. nodejs版本管理工具之nvm

    有时候 项目中依赖不同版本的node,这就需要我们使用一个版本管理工具 有序的管理这些node,这里介绍使用nvm GitHub地址:https://github.com/nvm-sh/nvm 前提: ...

  8. nginx之常见错误

    在此只介绍源码安装nginx的时候,发生的一些常见的错误 1. nginx访问出现File not found 1) php-fpm找不到SCRIPT_FILENAME中执行的PHP文件 更改配置文件 ...

  9. MySQL用错了,99%的人已中招

    在我们日常工作中,可能会经常使用MySQL数据库,因为它是开源免费的,而且性能还不错. 在国内的很多公司中,经常被使用. 但我们在MySQL使用过程中,也非常容易踩坑,不信继续往下看. 今天这篇文章重 ...

  10. F650A光猫的一些命令(一)

    查看有 / # uname -a Linux F650A 4.1.25 #12 SMP Tue Aug 15 21:57:30 CST 2017 armv7l GNU/Linux / # cat /p ...