一、前言

海康sdk中包含了MP4解码播放库,对应的API函数都是PlayM4开头的,顾名思义播放MP4,海康的视频默认可以保存成MP4文件,可以用通用的播放器来播放,这就是为啥前面好多篇文章讲到的各种内核录像存储都改成MP4来存储,vlc、mpv、ffmpeg等,最终录像存储都转换成MP4文件,看来大公司大厂做的也是保存成MP4文件,肯定是有他的道理,至于有多少道理,跟着他学者他这样处理就行,可以先不用问不用管,直接上手撸代码就对了,有些东西需要深究原理,而有些东西就没有必要太过于细致询问下去了,折腾下去陷入死胡同,好比知道1+1=2就行,至于为啥=2,交给专门的研究人员去研究就行。

海康sdk的MP4解码库,即支持自身的MP4文件,也支持常规的MP4文件,而且最新版本还支持AVI文件格式,随便试了本地的MP4文件,也都是支持的,如果需要拿到音视频数据,只需要调用PlayM4_SetDecCallBackMend设置下解码回调函数即可,比视频流的回调流程简单很多,少了设置回调处理函数一大堆处理,只需要解码转换成QImage即可。本地文件还需要增加一个文件结束回调,这样能知道什么时候文件播放完成了,发出对应的信号进行处理,可以调用PlayM4_SetFileEndCallback设置文件播放完毕回调函数,在FileEndCallback回调函数中,通过异步执行QMetaObject::invokeMethod停止函数来通知界面。

关于本地文件请注意以下几点:

  1. 文件方式播放下,不能调用PlayM4_CloseStream。
  2. 流播放下,不能调用PlayM4_CloseFile接口。
  3. 流开关接口和文件开关接口不能交叉使用。

二、功能特点

  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::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;
} 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音视频开发20-海康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 (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...

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

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

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

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

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

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

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

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

随机推荐

  1. 10 Self-Attention(自注意力机制)

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  2. JOI Open 2018

    T1 Bubble Sort 2 题意:给定一个长度为 \(n\) 的序列 \(a\),进行 \(q\) 次修改,第 \(i\) 次将第 \(x_i\) 个元素的值修改为 \(y_i\). 对于每次操 ...

  3. 再见,Centos!

    近日,CentOS官方宣布CentOS系列稳定版Linux系统将停止维护,取而代之的是测试版的CentOS Stream,这也意味着CentOS将会退出历史舞台,因此引发了CentOS用户的强烈不满. ...

  4. 字符串和json相互转换

    字符串转成json格式 JSON.parse(string) json格式转成字符串 JSON.stringify(obj) 在vue中还可以使用qs插件使用this.$qs.stringify(ob ...

  5. 如何使用git上传代码github仓库

    本文对于Windows系统上git的安装及基本使用方法进行简单介绍,并介绍如何使用git将仓库中的项目上传至个人的Github中去. 1.打开git 打开你想上传文件的位置,然后选择git bash ...

  6. 支持国产3A游戏大作 ——《黑神话:悟空》

  7. 低功耗4G模组:RSA算法示例

    ​ 今天我们学习合宙低功耗4G模组Air780EP_LuatOS_rsa示例,文末[阅读原文]获取最新资料. 一.简介 RSA算法的安全性基于:将两个大质数相乘很容易,但是想要将其乘积分解成原始的质数 ...

  8. lua获取请求参数以及在nginx.conf中使用

    -- 获取请求路径 local request_uri = ngx.var.request_uri -- 从 header中取值 local token = ngx.req.get_headers() ...

  9. viper读取配置文件

    //方法一 func readConfig1(path, filename, filetype string) interface{} { viper.AddConfigPath(path) vipe ...

  10. (Redis基础教程之十) 如何在Redis中运行事务

    介绍 Redis是一个开源的内存中键值数据存储.Redis允许您计划一系列命令,然后一个接一个地运行它们,这一过程称为_transaction_.每个事务都被视为不间断且隔离的操作,以确保数据完整性. ...