一、前言

采用了回调方式的视频通道,截图只需要对解析好的QImage对象直接保存即可,而对于句柄的形式,需要调用不同的处理策略,比如vlc需要用它自己提供的api接口函数libvlc_video_take_snapshot传入保存路径即可,mpv的内核执行screenshot-to-file命令传入路径参数即可,而ffmpeg就需要设置抓拍标志位,在实时采集解析那边,如果当前是截图标志位真,则需要改成QImage转换的机制发出图片,而不是yuv的数据opengl绘制,海康的sdk调用NET_DVR_CapturePicture函数即可。

一般来说截图都是保存的原始的图片,对应的分辨率也是原始的分辨率,并没有压缩及等比例缩放过的,所以ffmpeg的监控内核必须是最原始的采集到的图片为准,而不是最终绘制后的图片,因为绘制后的很可能已经缩放过的。

有时候还有一种场景需求是不需要原始的图片,只需要当前通道大小的尺寸,这个时候就需要对当前通道进行截屏,采用截屏的形式截图,这种方式可以将设置的OSD等信息都截图进去,相当于扣扣截图。Qt本身提供了grabWindow方法来对指定句柄的窗体控件截屏,Qt4里面放在QPixmap类中的静态方法QPixmap::grabWindow,而Qt5中放在QApplication::primaryScreen()的方法中。

二、功能特点

  1. 支持多画面切换,全屏切换等,包括1+4+6+8+9+13+16+25+36+64画面切换。
  2. 支持alt+enter全屏,esc退出全屏。
  3. 自定义信息框+错误框+询问框+右下角提示框(包含多种格式)。
  4. 17套皮肤样式随意更换,所有样式全部统一,包括菜单等。
  5. 云台仪表盘鼠标移上去高亮,八个方位精准识别。
  6. 底部画面工具栏(画面分割切换+截图声音等设置)移上去高亮。
  7. 可在配置文件更改左上角logo+中文软件名称+英文软件名称。
  8. 封装了百度地图,视图切换,运动轨迹,设备点位,鼠标按下获取经纬度等。
  9. 支持图片地图,设备按钮可以在图片地图上自由拖动自动保存位置信息。
  10. 在百度地图和图片地图上,双击视频可以预览摄像头实时视频。
  11. 堆栈窗体,每个窗体都是个单独的qwidget,方便编写自己的代码。
  12. 顶部鼠标右键菜单,可动态控制时间CPU+左上角面板+左下角面板+右上角面板+右下角面板的显示和隐藏,支持恢复默认布局。
  13. 工具栏可以放置多个小图标和关闭图标。
  14. 左侧右侧可拖动拉伸,并自动记忆宽高位置,重启后恢复。
  15. 双击摄像机节点自动播放视频,双击节点自动依次添加视频,会自动跳到下一个,双击父节点自动添加该节点下的所有视频。
  16. 摄像机节点拖曳到对应窗体播放视频,同时支持拖曳本地文件直接播放。
  17. 视频画面窗体支持拖曳交换,瞬间响应。
  18. 双击节点+拖曳节点+拖曳窗体交换位置,均自动更新url.txt。
  19. 支持从url.txt中加载通道视频播放,自动记忆最后通道对应的视频,软件启动后自动打开播放。
  20. 右下角音量条控件,失去焦点自动隐藏,音量条带静音图标。
  21. 集成百度在线地图和离线地图,可以添加设备对应位置,自动生成地图,支持缩放和添加覆盖物等。
  22. 视频拖动到通道窗体外自动删除视频。
  23. 鼠标右键可删除当前+所有视频,截图当前+所有视频。
  24. 录像机管理、摄像机管理,可添加删除修改导入导出打印信息,立即应用新的设备信息生成树状列表,不需重启。
  25. 在pro文件中可以自由开启是否加载地图。
  26. 视频播放可选2种内核自由切换,vlc+ffmpeg,均可在pro中设置。
  27. 可设置1+4+9+16画面轮询,可设置轮询间隔以及轮询码流类型等,直接在主界面底部工具栏右侧单击启动轮询按钮即可,再次单击停止轮询。
  28. 默认超过10秒钟未操作自动隐藏鼠标指针。
  29. 支持onvif搜素设备,支持任意onvif摄像机,包括但不限于海康大华宇视天地伟业华为等。
  30. 支持onvif云台控制,可上下左右移动云台摄像机,包括复位和焦距调整等。
  31. 同时支持sqlite、mysql、postsql等数据库。
  32. 可保存视频,可选定时存储或者单文件存储,可选存储间隔时间。
  33. 可设置视频流通信方式tcp+udp,可设置视频解码是速度优先、质量优先、均衡等。
  34. 可设置硬解码类型,支持qsv、dxva2、d3d11va等。
  35. 默认采用opengl绘制视频,超低的CPU资源占用,支持yuyv和nv12两种格式绘制,很牛逼。
  36. 高度可定制化,用户可以很方便的在此基础上衍生自己的功能,支持linux和mac系统。

三、效果图

四、相关站点

  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

五、核心代码

QImage FFmpegWidget::getImage() const
{
#ifdef opengl
thread->snap();
#endif
return this->image;
} QPixmap FFmpegWidget::getPixmap() const
{
//采用截屏的形式截图,这种方式可以将 设置的OSD等信息都截图进去
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
QPixmap pixmap = QPixmap::grabWindow(winId(), 0, 0, width(), height());
#else
QScreen *screen = QApplication::primaryScreen();
QPixmap pixmap = screen->grabWindow(winId(), 0, 0, width(), height());
#endif
return pixmap;
} void VlcThread::snap(const QString &fileName)
{
if (vlcPlayer != NULL) {
libvlc_video_take_snapshot(vlcPlayer, 0, fileName.toUtf8().constData(), videoWidth, videoHeight);;
}
} void MpvThread::snap(const QString &fileName)
{
if (mpvPlayer != NULL) {
command(QVariantList() << "screenshot-to-file" << fileName << "video");
}
} void HaiKangThread::snap(const QString &fileName)
{
if (isRtsp) {
QByteArray data = fileName.toUtf8();
NET_DVR_CapturePicture(hand, data.data());
} else {
//PlayM4_GetJPEG(port, data, size, &result);
//PlayM4_ConvertToJpegFile(pBuf, nSize, nWidth, nHeight, nType, file); //通过设置显示回调,在显示回调中抓图保存,抓图完成立马关闭回调
PlayM4_SetDisplayCallBack(port, DisplayCallback);
msleep(100);
PlayM4_SetDisplayCallBack(port, NULL);
}
}

Qt音视频开发49-通用截图截屏的更多相关文章

  1. 【秒懂音视频开发】02_Windows开发环境搭建

    音视频开发库的选择 每个主流平台基本都有自己的音视频开发库(API),用以处理音视频数据,比如: iOS:AVFoundation.AudioUnit等 Android:MediaPlayer.Med ...

  2. WebRTC 音视频开发

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

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

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

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

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

  5. Python音视频开发:消除抖音短视频Logo和去电视台标

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 对于带Logo(如抖音Logo.电视台标)的视频,有三种方案进行Logo消除: 直接将对应区域用对应图像替换: 直接将对应区域模糊化: 通过变换将要 ...

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

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

  7. Android音视频开发(1):H264 基本原理

    前言 H264 视频压缩算法现在无疑是所有视频压缩技术中使用最广泛,最流行的.随着 x264/openh264 以及 ffmpeg 等开源库的推出,大多数使用者无需再对H264的细节做过多的研究,这大 ...

  8. Android 音视频开发学习思路

    Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...

  9. Android开发 音视频开发需要了解的专业术语知识

    前言 在摸索一段时间的音视频开发后,越来越发现这个坑的深度真是特别的深. 除了了解Android自带的音视频处理API以外,还得了解一些视频与音频方面的知识.这篇博客就是主要讲解这方面的专业术语.内容 ...

  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. 最后的组合:K8s 1.24 基于 Hekiti 实现 GlusterFS 动态存储管理实践

    前言 知识点 定级:入门级 GlusterFS 和 Heketi 简介 GlusterFS 安装部署 Heketi 安装部署 Kubernetes 命令行对接 GlusterFS 实战服务器配置(架构 ...

  3. P1762 偶数&杨辉三角

    P1762 偶数&杨辉三角(天立OI) 解题思路 一.结论法 杨辉三角形结论 第\(n\)行有\(n\)个数. 每行奇数个数必为\(2^k\)(\(k\)不是行数) 当行数恰为\(2^k\)时 ...

  4. python模拟发送、消费kafka消息

    参考文章: https://zhuanlan.zhihu.com/p/279784873 生产者代码: import traceback from kafka import KafkaProducer ...

  5. 24个希腊字母与 Tex 表示

    大写 小写 英文 中文 Α α Alpha 阿尔法 Β β Beta 贝塔 Γ γ Gamma 伽马 Δ δ Delta 德尔塔 Ε ε Epsilon 艾普西隆 Ζ ζ Zeta 泽塔 Η η Et ...

  6. 狂神说-Docker-学习笔记-01 Run的流程和Docker原理

    狂神说-Docker-学习笔记-01 Run的流程和Docker原理 视频链接:https://www.bilibili.com/video/BV1og4y1q7M4?p=1 1.docker run ...

  7. 工作中的技术总结 _Thymeleaf限制字符串的展示长度 _20210910

    工作中的技术总结 _Thymeleaf限制字符串的展示长度 _20210910 比较简单就这一行代码 #strings.abbreviate 应该是调用了 thymeleaf 的内置函数 这一个方法的 ...

  8. leetcode 740 删除并获得点数

    740 删除并获得点数 题意 给你一个整数数组 nums ,你可以对它进行一些操作. 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数.之后,你必须删除 所有 等于 n ...

  9. win10子系统docker搭建gitlab Server

    心血来潮想搞一套cicd玩玩,结果开始就掉坑里了. 遇到问题 不会写文,所以语言组织比较差,将就看着吧!就当记录一下这个坑以后没准还能用的上. 参照https://blog.csdn.net/Mono ...

  10. 由C#委托回调想到的二三事

    写在前面: 之前的过开发程中,我愈发觉得面对复杂的界面要求,最好还是用UserControl将不同模块的界面设计单独封装,以应对客户频繁地需求更改.这样做能够在面对对不同的UI要求时,动态的加载预先设 ...