一、前言
视频监控模块采用ffmpeg作为解码内核,可以在系统设置中填入一个视频地址,同时支持本地视频文件、USB摄像机、远程onvif摄像机(海康大华等)、网络视频地址,大屏系统中默认有一个视频监控,如果需要显示多个则new多个视频监控模块即可,在本系统中每个最小单元的小模块都是一个类,需要多少个就可以new多少个出来显示,二级模块作为一个悬停窗体嵌入主界面mainwindow,都可以拖动到任意位置自动嵌入。
视频监控模块有多个参数设置,以便用户设置,最开始做的是内置的写死在代码中,后面随着用户场景的变化,留出参数用户设置更灵活,参数如下:
- 视频拉伸:有些客户需要拉伸填充有些需要等比例缩放;
- 视频回调:有些板子或者电脑没有opengl或者版本过低需要开启视频回调才能正常绘制图像;
- 播放音频:开启后会播放视频和视频流中的声音;
- 视频循环:开启后播放视频完成后会立即重复播放;
- 超时时间:打开视频的超时时间,有些网络地址需要设置久一点;
- 通信方式:视频流采用TCP还是UDP协议播放;
视频监控内核功能特点:
- 多线程实时播放视频流+本地视频+USB摄像头等。
- 支持windows+linux+mac,支持ffmpeg3和ffmpeg4,支持32位和64位。
- 多线程显示图像,不卡主界面。
- 自动重连网络摄像头。
- 可设置边框大小即偏移量和边框颜色。
- 可设置是否绘制OSD标签即标签文本或图片和标签位置。
- 可设置两种OSD位置和风格。
- 可设置是否保存到文件以及文件名。
- 可直接拖曳文件到ffmpegwidget控件播放。
- 支持h265视频流+rtmp等常见视频流。
- 可暂停播放和继续播放。
- 支持存储单个视频文件和定时存储视频文件。
- 自定义顶部悬浮条,发送单击信号通知,可设置是否启用。
- 可设置画面拉伸填充或者等比例填充。
- 可设置解码是速度优先、质量优先、均衡处理。
- 可对视频进行截图(原始图片)和截屏。
- 录像文件存储支持裸流和MP4文件。
- 音视频完美同步,采用外部时钟同步策略。
- 支持seek定位播放位置。
- 支持在线网络音视频文件比如http开头mp4、mp3结尾的。
- 可选句柄模式(GPU绘制)、回调模式(QPainter绘制)。
- GPU绘制模式同时支持拉伸和等比例绘制。
- 支持qsv、dxva2、d3d11va等硬解码。
- 硬解码和GPU组合,超低CPU占用,支持64路视频。
- 支持安卓和嵌入式linux,交叉编译即可。
二、功能特点
- 采用分层设计,整体总共分三级界面,一级界面是整体布局,二级界面是单个功能模块,三级界面是单个控件。
- 子控件包括饼图、圆环图、曲线图、柱状图、柱状分组图、横向柱状图、横向柱状分组图、合格率控件、百分比控件、进度控件、设备状态面板、表格数据、地图控件、视频控件等。
- 二级界面可以自由拖动悬浮,支持最小化隐藏、最大化关闭、响应双击自定义标题栏。
- 数据源支持模拟数据(默认)、数据库采集、串口通信(需定制)、网络通信(需定制)、网络请求等,可自由设定每个子界面的采集间隔即数据刷新频率。
- 采用纯QWidget编写,亲测Qt4.6到Qt6.2任意版本,理论上支持后续其他Qt版本。
- 超强跨平台,亲测windows、linux、mac、国产uos、国产银河麒麟kylin等系统,效果完美,同时还支持嵌入式linux比如树莓派、香橙派、全志、imx6等。
- 同时集成了自定义控件、qchart饼图、echart地图等功能。
- 内置多套配色风格样式(紫色、蓝色、深蓝、黑色),默认紫色,自适应任意分辨率。
- 可设置系统标题、目标分辨率、布局方案,启动立即应用。
- 可设置主背景颜色、面板颜色、十字线游标颜色等各种颜色。
- 可设置多条曲线不同颜色,没有设置颜色的情况下内置多套精美颜色随机应用。
- 可设置标题栏背景颜色、文字颜色。
- 可设置曲线图表背景颜色、文字颜色、网格颜色。
- 可设置正常颜色、警戒颜色、报警颜色、禁用颜色、百分比进度颜色。
- 可分别设置各种字体大小,比如全局字体、软件名称、标题栏、子标题栏、加粗标签等。
- 可设置标题栏高度、表头高度、行高度。
- 曲线支持游标、定位线、悬停高亮数据点、悬停显示值。
- 柱状图支持顶部(可设置顶端、上部、中间、底部)显示数据,全部自适应计算位置。
- 支持平滑曲线,内置多种平滑曲线算法,还支持面积图平滑。
- 面积图填充颜色可选多种规则比如单色透明度填充、透明度渐变填充等。
- 数据库支持sqlite、mysql、postgresql、oracle、国产人大金仓等数据库。
- 主界面直接鼠标右键切换布局、配色方案、关闭开启某个二级窗体。
- 自动记忆所有子窗口的大小和位置,下次启动立即应用。
- 动态加载布局方案菜单,可以动态新建布局、恢复布局、保存布局、另存布局等,用户可以制造任意布局。
- 二级窗体,双击从主窗体分离出来浮动,可以自由调整大小。再次双击标题栏最大化,再次双击还原。
- 子模块也可以全屏显示作为一个大屏,这样就可以一个大屏拓展出多个子大屏,放大查看子模块的数据详情,适用多屏展示。
- 每个模块都可以自定义采集速度,如果是数据库采集会自动排队处理,后期还可以拓展每个子模块都独立的数据库采集。
- 提供系统设置模块进行整体的配置参数设置,效果立即应用。
- 提供精美炫酷的大屏地图模块,包括静态图片、闪烁效果、迁徙效果、世界地图、区域地图等,可指定点的经纬度坐标,识别单击响应,可以做地图跳转等,每个点都可以不同的颜色和提示信息。
- 除了提供大屏系统外,还将每个模块都做了独立的模块示例界面,每个模块都可以独立学习使用,里面用到的控件也单独做了控件示例界面,方便学习每个控件如何使用。
- 非常详细的开发和使用手册,其中包括数据库说明、模块对照图、控件对照图、项目结构、代码说明(精确到每个类)、演示demo、使用方法等。
三、体验地址
- 体验地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_bigscreen.zip。
- 国内站点:https://gitee.com/feiyangqingyun
- 国际站点:https://github.com/feiyangqingyun
- 个人主页:https://blog.csdn.net/feiyangqingyun
- 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
- 在线文档:https://feiyangqingyun.gitee.io/qwidgetdemo/bigscreen/
四、效果图
5-3-9-1.jpg五、核心代码
#include "frmmodulevideo.h"
#include "ui_frmmodulevideo.h"
#include "quihelper.h"
frmModuleVideo::frmModuleVideo(QWidget *parent) : QWidget(parent), ui(new Ui::frmModuleVideo)
{
ui->setupUi(this);
this->initForm();
}
frmModuleVideo::~frmModuleVideo()
{
delete ui;
}
void frmModuleVideo::showEvent(QShowEvent *)
{
#ifdef videoffmpeg
//延时处理不然布局加载后会先显示再隐藏瞬间反复来两次导致隐藏的时候无法暂停
QTimer::singleShot(200, this, SLOT(open()));
if (!isLoad) {
isLoad = true;
} else {
videoWidget->next();
}
#endif
}
void frmModuleVideo::hideEvent(QHideEvent *)
{
#ifdef videoffmpeg
//界面不可见的时候暂停以节省资源
videoWidget->pause();
#endif
}
void frmModuleVideo::initForm()
{
isLoad = false;
url = AppConfig::VideoUrl;
#ifdef videoffmpeg
videoWidget = new FFmpegWidget;
videoWidget->setBorderWidth(0);
videoWidget->setBgText("");
//设置拉伸填充图像
videoWidget->setFillImage(AppConfig::VideoFillImage);
//设置是否回调,有些嵌入式环境只能用回调
videoWidget->setCallback(AppConfig::VideoCallback);
//设置是否播放声音
videoWidget->setPlayAudio(AppConfig::VideoPlayAudio);
//设置是否重复播放
videoWidget->setPlayRepeat(AppConfig::VideoPlayRepeat);
//设置打开超时时间,一些推流要把时间设置大一些
videoWidget->setCheckTime(AppConfig::VideoCheckTime * 1000);
//设置视频流通信协议
videoWidget->setTransport(AppConfig::VideoTransport);
//把视频控件加到布局中
ui->widgetMain->layout()->addWidget(videoWidget);
#endif
}
void frmModuleVideo::setUrl(const QString &url)
{
this->url = url;
}
void frmModuleVideo::open()
{
#ifdef videoffmpeg
if (isVisible() && !videoWidget->getIsPlaying()) {
videoWidget->setUrl(url);
videoWidget->open();
}
#endif
}
网友评论