纯软件实现电脑屏幕录制/存储到硬盘录像机/onvif模拟器/onvif虚拟监控/绿色版双击开箱即用

一、前言说明

在银行、超市、考试中心、工控系统、网课教学、居家办公等场景中,传统监控摄像头难以清晰录制电脑屏幕内容,导致关键操作无法有效追溯。为解决这一难题,我们推出了一套纯软件实现的电子屏幕监控方案,彻底取代依赖硬件视频编码器的传统方式,实现高效、清晰、低成本的电脑屏幕录像监控。

本方案基于虚拟摄像头技术,将安装了该软件的电脑模拟为标准ONVIF网络摄像机。通过ONVIF或RTSP协议,监控录像机、NVR、VMS系统或各类监控软件可直接发现并接入该“虚拟摄像头”,实时录制电脑屏幕画面、本地摄像头视频、麦克风音频,甚至指定视频文件的播放内容。纯软件实现电脑屏幕监控:绿色版ONVIF虚拟摄像头,助力安全审计与操作留痕。通过本方案,企业可构建一套完整的电脑行为监控与录像追溯体系,提升信息安全等级,满足合规审计要求,真正实现“看得见、录得清、查得到”的数字化监管目标。

核心优势:

  • 绿色免安装,双击即用:无需复杂配置,不修改系统关键组件,安全可靠。
  • 无缝集成现有监控系统:自动被主流录像机和监控平台识别为ONVIF设备,轻松纳入统一管理。
  • 全操作留痕:所有屏幕活动、应用程序使用、文件操作均可被录像保存,支持随时回放与审计。
  • 多场景适用:适用于现金终端、汽车检测、工控操作、在线考试、计算机安全审计等需操作追溯的场景。
  • 强化数据安全:有效防范恶意篡改、越权操作或意外事故导致的数据丢失,实现“操作有迹可循”。

二、效果图

在这里插入图片描述
在这里插入图片描述

三、相关地址

  1. 国内站点:https://gitee.com/feiyangqingyun
  2. 国际站点:https://github.com/feiyangqingyun
  3. 个人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. 文件地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_simulate。

四、功能特点

  1. 标准onvif协议,支持设备搜索、获取参数、快照抓图等。
  2. 支持264/265/aac等标准视音频协议传输。
  3. 支持多路批量onvif设备模拟,每一路都独立的端口。
  4. 支持本地摄像头采集转成onvif,可选择不同的设备、分辨率、帧率等参数。
  5. 支持本地桌面采集转成onvif,可选择不同的屏幕、分辨率、帧率等参数。
  6. 支持各种视频文件和视频流转成onvif,可重新设置编码转换以及分辨率转换。
  7. 支持4K、8K等高清分辨率,不限制分辨率,非264/265会自动转码推流。
  8. 每一路都可以设置统一或者独立的用户验证信息,为空则表示不验证。
  9. 可以把任意内容接入到NVR以及视频监控系统,方便保存录像文件,以便回放可查。
  10. 也可作为压力测试工具,比如模拟几千路onvif设备,让集成平台软件做接入压力测试。
  11. 推出去的流不仅有rtsp格式,还支持rtmp、http、flv、ws-flv、webrtc等方式访问,可以直接网页查看。
  12. 在管理工具上可以看到每一路的推流状况以及分辨率信息,非常直观。
  13. 支持自动重连拉流,重连推流,保证7乘以24小时稳定运行。
  14. 可设置开机自启动运行和后台运行,不显示在任务栏,作为后台服务运行。
  15. 可批量添加文件、添加目录,自动将目录下的所有文件添加到模拟器。
  16. 多功能添加地址面板,可以选择本地设备和监控设备,本地设备会自动识别摄像头设备和桌面设备,监控设备可以选择不同厂家,自动填充对应rtsp格式,填入用户信息即可,可以批量递增添加监控设备。
  17. 可无缝上传到市面上所有的onvif协议设备,包括海康、大华、宇视、华为、天地伟业等,也支持ONVIF Device Manager国际onvif工具。
  18. 支持gb28181设备模拟,具备设备注册、设备注销、设备心跳、设备信息、设备配置、设备状态应答等。
  19. 支持模拟报警和位置上报等,方便平台侧显示对应设备的实时位置。
  20. 支持一键添加批量模拟28181设备,实时显示已注册和已注销状态。
  21. 支持将本地桌面、本地摄像头、任意视频文件、视频流文件、手机摄像头等转换成28181设备,添加到NVR或者国标软件平台。
  22. sip协议同时支持udp和tcp两种通信方式,视频点播同时支持udp/tcp主动/tcp被动三种方式,涵盖所有可能的场景需求。
  23. 无论是onvif设备模拟组件还是28181设备模拟组件,全部原创底层协议解析,纯Qt实现,跨任意平台。
  24. 代码结构框架非常清晰,注释详细,代码精简不繁琐,非常易于学习和移植,可以很容易拓展其他接口需求。
  25. 支持Qt4/Qt5/Qt6以及后续所有版本、所有编译器、所有开发环境。
  26. 支持windows、linux、mac、国产OS、嵌入式linux、RK3588、树莓派、香橙派等系统。

五、相关代码

#include "onvifdeviceserver.h"
#include "onvifdevicesearch.h"
#include "onvifdevicepush.h"
#include "onvifdevicelisten.h"
#include "onvifdevicehelper.h"OnvifDeviceServer::OnvifDeviceServer(QObject *parent) : QObject(parent)
{serverHost = "127.0.0.1";serverIp = "127.0.0.1";userName = "admin";userPwd = "123456";//实例化onvif搜索类并关联信号槽isStart = false;onvifSearch = new OnvifDeviceSearch(this);connect(onvifSearch, SIGNAL(sendData(QByteArray)), this, SIGNAL(sendData(QByteArray)));connect(onvifSearch, SIGNAL(receiveData(QByteArray)), this, SIGNAL(receiveData(QByteArray)));connect(onvifSearch, SIGNAL(receiveInfo(QString)), this, SIGNAL(receiveInfo(QString)));connect(onvifSearch, SIGNAL(receiveError(QString)), this, SIGNAL(receiveError(QString)));
}OnvifDeviceServer::~OnvifDeviceServer()
{this->stop();
}void OnvifDeviceServer::setPara(const QString &serverHost, const QString &serverIp, const QString &userName, const QString &userPwd)
{this->serverHost = serverHost;this->serverIp = serverIp;this->userName = userName;this->userPwd = userPwd;
}bool OnvifDeviceServer::start()
{foreach (OnvifDevicePush *push, listPush) {if (!push->isOk()) {push->start();}}foreach (OnvifDeviceListen *listen, listListen) {if (!listen->isOk()) {listen->start();}}isStart = true;return onvifSearch->start(serverIp);
}void OnvifDeviceServer::stop()
{foreach (OnvifDevicePush *push, listPush) {push->stop();}foreach (OnvifDeviceListen *listen, listListen) {listen->stop();}isStart = false;onvifSearch->stop();
}bool OnvifDeviceServer::append(const QString &flag, int port, const QString &mediaUrl, const QString &rtspUrl)
{//构建onvif地址/已经存在说明冲突了QString hard = OnvifDeviceHelper::getUuid();QString addr = QString("http://%1:%2/onvif").arg(serverHost).arg(port);if (listFlag.contains(flag)) {QMessageBox::critical(0, "错误", "推流码重复, 请重新填写!");return false;} else if (listAddr.contains(addr)) {QMessageBox::critical(0, "错误", "端口号重复, 请重新填写!");return false;}//启动推流服务OnvifDevicePush *push = new OnvifDevicePush;connect(push, SIGNAL(pushStart(QString, int, int, bool)), this, SLOT(slot_pushStart(QString, int, int, bool)));connect(push, SIGNAL(pushChanged(QString, int)), this, SIGNAL(pushChanged(QString, int)));connect(push, SIGNAL(pushImage(QString, QImage)), this, SIGNAL(pushImage(QString, QImage)));push->setPara(flag, mediaUrl, rtspUrl);//启动监听服务OnvifDeviceListen *listen = new OnvifDeviceListen;connect(listen, SIGNAL(sendData(QByteArray)), this, SIGNAL(sendData(QByteArray)));connect(listen, SIGNAL(receiveData(QByteArray)), this, SIGNAL(receiveData(QByteArray)));connect(listen, SIGNAL(receiveInfo(QString)), this, SIGNAL(receiveInfo(QString)));connect(listen, SIGNAL(receiveError(QString)), this, SIGNAL(receiveError(QString)));connect(listen, SIGNAL(snapshot(QString, QTcpSocket *)), this, SLOT(slot_snapshot(QString, QTcpSocket *)));listen->setPara(flag, hard, serverIp, port, addr, rtspUrl);listen->setUserInfo(userName, userPwd);//处于启动中则启动if (isStart) {push->start();listen->start();}listFlag << flag;listHard << hard;listAddr << addr;listPush << push;listListen << listen;onvifSearch->setPara(listHard, listAddr);return true;
}void OnvifDeviceServer::remove(const QString &flag)
{int index = listFlag.indexOf(flag);if (index >= 0) {listPush.at(index)->stop();listPush.at(index)->deleteLater();listListen.at(index)->stop();listListen.at(index)->deleteLater();listFlag.removeAt(index);listAddr.removeAt(index);listPush.removeAt(index);listListen.removeAt(index);onvifSearch->setPara(listHard, listAddr);}
}void OnvifDeviceServer::clear()
{foreach (OnvifDevicePush *push, listPush) {push->stop();push->deleteLater();}foreach (OnvifDeviceListen *listen, listListen) {listen->stop();listen->deleteLater();}listFlag.clear();listAddr.clear();listPush.clear();listListen.clear();onvifSearch->setPara(listHard, listAddr);
}void OnvifDeviceServer::appendData(const QString &flag, const QByteArray &data)
{int index = listFlag.indexOf(flag);if (index >= 0) {listPush.at(index)->appendData(data);}
}void OnvifDeviceServer::slot_snapshot(const QString &flag, QTcpSocket *socket)
{int index = listFlag.indexOf(flag);if (index >= 0) {listPush.at(index)->snap(socket);}
}void OnvifDeviceServer::slot_pushStart(const QString &flag, int width, int height, bool start)
{emit pushStart(flag, width, height, start);int index = listFlag.indexOf(flag);if (index >= 0) {listListen.at(index)->setVideoInfo(25, width, height);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98445.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法--链表】86.分割链表--通俗讲解

一、题目是啥?一句话说清 给你一个链表和一个值 x,把链表分成两部分:所有小于 x 的节点都放在大于或等于 x 的节点之前,并且保持节点原来的相对顺序。 示例: 输入:head = [1,4,3,2,5,2], x = 3 输出:[1,2,2,4,3,5](所有小于3的节点1、2、2都在大于等于3的节点4、3、5…

707, 设计链表, LinkedList, 单链表, Dummy Head, C++

目录 题意速览解题思路与设计要点C 代码实现&#xff08;单链表 虚拟头结点&#xff09;时间复杂度与空间复杂度常见坑位与边界用例对比&#xff1a;双链表如何优化单元测试样例&#xff08;可直接粘贴运行&#xff09;总结 题意速览 设计一个支持如下操作的链表&#xff1a…

NAS自建笔记服务leanote2

leanote2(GitHub - wiselike/leanote2: leanote2, 适用于NAS自建的笔记服务) 是一个开源的在线笔记应用程序&#xff0c;继承自原 leanote 项目。向原 leanote 的开发者表示深深的感谢与尊重&#xff0c;正是他们的辛勤付出奠定了这个优秀的笔记平台的基础。 但由于 leanote 项…

模型剪枝----ResNet18剪枝实战

剪枝 模型剪枝&#xff08;Model Pruning&#xff09; 是一种 模型压缩&#xff08;Model Compression&#xff09; 技术&#xff0c;主要思想是&#xff1a; 深度神经网络里有很多 冗余参数&#xff08;对预测结果贡献很小&#xff09;。 通过去掉这些冗余连接/通道/卷积核&am…

K8S-Pod(上)

Pod概念 Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。 Pod是一组&#xff08;一个或多个&#xff09;容器&#xff1b;这些容器共享存储、网络、以及怎样运行这些容器的规约。Pod 中的内容总是并置&#xff08;colocated&#xff09;的并且一同调度&am…

Flink TaskManager日志时间与实际时间有偏差

Flink 启动一个任务后&#xff0c;发现TaskManager上日志时间与实际时间相差约 15 小时。 核心原因可能是&#xff1a; 1、 服务器&#xff08;或容器&#xff09;的系统时间配置错误2、 Flink 日志组件&#xff08;如 Logback/Log4j&#xff09;的时间配置未使用系统默认时区…

Webug3.0通关笔记18 中级进阶第06关 实战练习:DisCuz论坛SQL注入漏洞

目录 一、环境搭建 1、服务启动 2、源码解压 3、构造访问靶场URL 4、靶场安装 5、访问论坛首页 二、代码分析 1、源码分析 2、SQL注入分析 三、渗透实战 &#xff08;1&#xff09;判断是否有SQL注入风险 &#xff08;2&#xff09;查询账号密码 Discuz! 作为国内知…

SWEET:大语言模型的选择性水印

摘要背景与问题大语言模型出色的生成能力引发了伦理与法律层面的担忧&#xff0c;于是通过嵌入水印来检测机器生成文本的方法逐渐发展起来。但现有工作在代码生成任务中无法良好发挥作用&#xff0c;原因在于代码生成任务本身的特性&#xff08;代码有其特定的语法、逻辑结构&a…

FastDFS V6双IP特性及配置

FastDFS V6.0开始支持双IP&#xff0c;tracker server和storage server均支持双IP。V6.0新增特性说明如下&#xff1a;支持双IP&#xff0c;一个内网IP&#xff0c;一个外网IP&#xff0c;可以支持NAT方式的内网和外网两个IP&#xff0c;解决跨机房或混合云部署问题。FastDFS双…

笔记本、平板如何成为电脑拓展屏?向日葵16成为副屏功能一键实现

向日葵16重磅上线&#xff0c;本次更新新增了诸多实用功能&#xff0c;提升远控效率&#xff0c;实现应用融合突破设备边界&#xff0c;同时全面提升远控性能&#xff0c;操作更顺滑、画质更清晰&#xff01;无论远程办公、设计、IT运维、开发还是游戏娱乐&#xff0c;向日葵16…

基于Spring Boot + MyBatis的用户管理系统配置

我来为您详细分析这两个配置文件的功能和含义。 一、文件整体概述 这是一个基于Spring Boot MyBatis的用户管理系统配置&#xff1a; UserMapper.xml&#xff1a;MyBatis的SQL映射文件&#xff0c;定义了用户表的增删改查操作application.yml&#xff1a;Spring Boot的核心配置…

80(HTTP默认端口)和8080端口(备用HTTP端口)区别

文章目录**1. 用途**- **80端口**- **8080端口****2. 默认配置**- **80端口**- **8080端口****3. 联系**- **逻辑端口**&#xff1a;两者都是TCP/IP协议中的逻辑端口&#xff0c;用于标识不同的网络服务。- **可配置性**&#xff1a;端口号可以根据需要修改&#xff08;例如将T…

【开题答辩全过程】以 汽车知名品牌信息管理系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

从全栈工程师视角解析Java与前端技术在电商场景中的应用

从全栈工程师视角解析Java与前端技术在电商场景中的应用 面试背景介绍 面试官&#xff1a;你好&#xff0c;很高兴见到你。我叫李明&#xff0c;是这家电商平台的资深架构师。今天我们会聊聊你的技术能力和项目经验。你可以先简单介绍一下自己吗&#xff1f; 应聘者&#xff1a…

【python】python进阶——多线程

引言在现代软件开发中&#xff0c;程序的执行效率至关重要。无论是处理大量数据、响应用户交互&#xff0c;还是与外部系统通信&#xff0c;常常需要让程序同时执行多个任务。Python作为一门功能强大且易于学习的编程语言&#xff0c;提供了多种并发编程方式&#xff0c;其中多…

【JavaEE】(23) 综合练习--博客系统

一、功能描述 用户登录后&#xff0c;可查看所有人的博客。点击 “查看全文” 可查看该博客完整内容。如果该博客作者是登录用户&#xff0c;可以编辑或删除博客。发表博客的页面同编辑页面。 本练习的博客网站&#xff0c;并没有添加注册功能&#xff0c;以及上传作者头像功能…

MySQL全库检索关键词 - idea 工具 Full-Text Search分享

我们经常要在库中查找一个数据&#xff0c;又不知道在哪个表、哪个字段&#xff1b;或者想找到哪里有在用这个数据。我们可以用&#xff1a;idea 的 Database工具 - Full-Text Search打开idea&#xff0c;在工具栏找到 Database 然后新建自己的连接&#xff0c;然后右键&#x…

银行卡号识别案例

代码实现&#xff1a;import cv2 import numpy as np import argparse import myutils-i moban.png -t card1.pngap argparse.ArgumentParser() ap.add_argument("-i","--image", requiredTrue,help"path to input image") ap.add_argument(&quo…

云管平台上线只是开始:从“建好”到“用好”的运营、推广与深化指南

项目上线的喜悦转瞬即逝,随之而来的是一个更为现实和复杂的阶段:运营。云管平台(CMP)的成功,不再仅仅取决于其技术架构的先进性,更在于它能否融入组织的肌理,为不同角色持续创造价值。本文将从管理者、平台团队、开发者、运维和财务五个核心角色的视角,深入探讨平台上线…

distributed.client.Client 用户可调用函数分析

distributed.client.Client 用户可调用函数分析 1. 核心计算函数 任务提交和执行submit(func, *args, keyNone, workersNone, resourcesNone, retriesNone, priority0, fifo_timeout60s, allow_other_workersFalse, actorFalse, actorsFalse, pureNone, **kwargs) 提交单个函数…