远程监控项目描述以及总体框架

devtools/2025/3/14 23:42:58/

         远程监控项目基于之前的本地渲染项目做了一个扩展。本地渲染项目没有涉及到解码部分,是直接从rv126拿到摄像头的vi数据,做转换就刷新到了上面去。

        uvc摄像头用ffmpeg做推流,所以这个远程是先拿到我们这个uvc摄像头的数据进行解码才能刷新到网页上面去。

        远程监控项目,这个项目的主要功能是使用FFMPEG拉取UVC传输的H264码流使用UDP码流,然后利用RV1126的解码模块对其UVC码流进行解码,最后把解码的YUV的数据渲染到CGI的HTML界面并且支持FFMPEG获取远程监控摄像头的参数,包括:Width(分辨率宽度)、Height(分辨率高度)、流媒体地址(Url)。

        这个项目还支持远程抓拍和图片查看功能,就是把远程的视频利用OPENCV把UVC的视频数据进行抓取,并且保存到/www/Image的目录里面。拍照完成之后,则可以在HTML的Photo_Manage查看。除了远程抓拍功能外还有录制功能,目前已经可以录制H264。

https://i-blog.csdnimg.cn/direct/994fdf3d58ab48dd8f81f6047524dba4.png" width="1007" />

        这个项目还提供了URL地址的编辑,目前只支持一个管理URL地址。这个URL地址目前是拉流的URL地址。它的工作原理是在HTML页面上的输入框里面输入URL地址,输入之后则把URL保存到json文件里面

https://i-blog.csdnimg.cn/direct/85eacaf053e34381883c923a88f10629.png" width="958" />        这个项目还提供了MP4名称的编辑。它的工作原理是在HTML页面上的输入框里面输入MP4名称,输入之后则把MP4名字保存到json文件里面

本次项目用到的重要技术知识点:

FFMPEG拉流UVC摄像头的码流

RV1126的VDEC解码每一帧码流

共享内存存储每一帧VDEC数据

使用OPENCV对每一帧VDEC解码数据添加时间戳

HTTP刷新每一帧VDEC解码数据

利用OPENCV和消息队列抓拍远程监控的照片

使用共享内存传输摄像头参数到页面

利用FFMPEG录制MP4视频

监控项目RV1126后端程序的功思维图

https://i-blog.csdnimg.cn/direct/7f63c5c35d444cc2a7c202048ca94e15.png" width="2586" />

        上图就是RV1126后端程序的思维导图,后端程序主要由上面9个重要工作,包括:RV1126的VDEC解码模块初始化、FFMPEG拉流模块的初始化、YUV视频共享内存的初始化、视频参数共享内存的初始化、视频数据信号量的初始化、视频参数信号量的初始化、消息队列的初始化、FFMPEG录制模块的初始化、线程的创建(包括:read_ffmpeg_thread线程、rv1126_vdec_thread线程、read_msg_thread线程)。 

RV1126的VDEC解码模块初始化:

        VDEC是RV1126的解码模块,它主要是解码UVC摄像头传输过来的H264码流变成YUV原始数据。VDEC的初始化需要使用RKEMDIA提供的API进行创建,这个API是RK_MPI_VDEC_CreateChn进行创建。

FFMPEG拉流模块的初始化:

        拉流模块指的是FFMPEG输入模块,这里关键是调用avformat_input_format来初始化输入模块。

YUV视频共享内存的初始化:

        解码出来的YUV数据需要存放到共享内存才能够刷新到CGI程序,这里直接使用shmget来初始化共享内存

视频参数共享内存的初始化:

        除了YUV数据之外,摄像头的参数也需要存放到共享内存才能够正常在网页端进行显示,这里同样要使用shmget来初始化共享内存。

视频数据信号量的初始化:

        在使用共享内存为了确保数据的原子性和安全性就需要用到信号处理,这里使用的semget进行初始化信号量,主要是用于视频数据的安全性。

消息队列的初始化:

        RV1126后台程序需要通过消息队列来接收前端CGI程序发过来的指令,消息队列的初始化直接调用msgget对消息队列进行处理。

 FFMPEG录制模块的初始化:

        由于需要把拉流的视频录制成MP4,所以需要使用到FFMPEG的输出模块(录制模块就是输出模块)进行录制,使用的API是avformat_alloc_output_context2

        录制下来不是为了单单录下来,而是未来记录我推流的内容对不对,接收的对不对,永久查看。

线程的创建:

        初始化必要的模块后,就需要创建三个线程进行处理了,分别是:

read_ffmpeg_thread线程(解析UVC传输的H264码流并送到VDEC编码器)、

rv1126_vdec_thread线程(获取VDEC解码器数据并存放到摄像头共享内存里面,同时把摄像头参数存放到参数共享内存)。

read_msg_thread线程(读取消息队列的指令进行操作,包括:抓拍、开始录像、停止录像)


http://www.ppmy.cn/devtools/167143.html

相关文章

python之replace,strip,split命令

1. replace() 方法 功能:替换字符串中的指定子串 语法:str.replace(old, new[, count]) 特点: 全部替换(默认)或指定替换次数区分大小写返回新字符串,原字符串不变 示例: text "Hello…

Java 替换图片背景图为透明

通过java代码将一个表情包的背景替换为空白或者透明 以下代码都是通过 ai生成的,已测试好用。 import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; /**/*** Author xiaoli* Date 2025/2/24 1…

算法精讲 | 树(二):BFS层序遍历の魔法——像水波纹一样扫描整棵树

🎯 算法精讲 | 树(二):BFS层序遍历の魔法——像水波纹一样扫描整棵树 📅 2025/03/11 || 推荐阅读时间 12分钟 🌟 开篇故事 小明用DFS解二叉树的右视图总超时,直到他发现BFS层序遍历就像超市结账…

mysql的MGR

3.MGR(MySQL Group Replication) MySQL组复制是Mysql5.7推出的高可用方案,具备以下特性: 一致性高:数据复制基于paxos分布式公式算法,保证多个节点的一致性 容错性高:只要不是超过一半的节点宕机,就可以继续…

机器学习之正则化

在机器学习领域,模型的性能至关重要,而过拟合问题常常阻碍模型在实际应用中的表现。正则化技术应运而生,成为解决这一难题的有力武器。它主要分为参数正则化和经验正则化两大类别,核心目的在于遵循奥卡姆剃刀定律,使模…

大一新生备战蓝桥杯c/c++B组——2024年省赛真题解题+心得分享

一&#xff0c;握手问题 这个题用点像小学奥数&#xff0c;直接手算就行 答案&#xff1a;1204 二&#xff0c;小球反弹 这个题思路简单&#xff0c;但是运行会显示超时。在思考思考&#xff0c;后续补代码。 三&#xff0c;好数 思路一&#xff1a; #include <iostream&…

ChromeOS 133 版本更新

ChromeOS 133 版本更新 1. 增强托管用户的 Office 文件处理功能 从 ChromeOS 133 开始&#xff0c;托管用户 现在可以 无缝打开和编辑 Microsoft Office 文件&#xff08;Word、PowerPoint、Excel&#xff09;&#xff0c;无论他们使用的是 Microsoft 365&#xff08;Office …

踩坑故障实录 自学软硬件工程师第750天

见字如面&#xff0c; 这里是AIGC创意人_竹相左边 我很喜欢 《流浪地球 2》中 &#xff0c;马兆&#xff1a;没有硬件支撑&#xff0c;你破解个屁。 --- 故障描述 昨天在服务器ess当中部署自己的网页计时器。代码都交给通义灵码。给的代码我并不能全部看懂。 今天我想继续…