Linux os下借助Qt+libvlc是实现多路拉取摄像头rtsp数据流并实时显示

news2024/9/21 20:36:55

前言

应客户方的一个实际项目需求,需要在Linux操作系统下拉取多路摄像头的RTSP数据流并实时显示。

该项目的硬件平台基于飞腾2000四核处理器与景嘉微显卡,搭载了Kylin V10操作系统。 当前景嘉微GPU最多支持同时连接16路摄像头,拉取1920x1080分辨率的RTSP视频流进行硬解并实时显示。

方案

需求分析后, 设计了两种技术方案:

方案1:Qt + FFmpeg

FFmpeg是一个强大的多媒体处理库,支持多种音视频格式的编解码、转码、复用等操作。在本方案中,FFmpeg主要用于拉取RTSP视频流并进行解码。使用FFmpeg的一个繁琐点在于需要手动编译FFmpeg库,以支持硬件加速。硬件加速的实现需要在编译时指定参数`--enable-vaapi`,以便充分利用景嘉微9230显卡的硬件解码能力。

然而,FFmpeg方案的复杂性较高,尤其是在处理视频格式转换和渲染显示时,需要进行额外的开发工作。此外,FFmpeg本身并未提供直接的UI集成方案,导致在Qt中进行视频显示时,需要开发额外的代码来处理视频帧的格式转换、缓冲和渲染。这一系列的操作使得FFmpeg方案在开发和维护成本上较为复杂。

方案2:Qt + libvlc

与FFmpeg相比,libvlc提供了更为简单和直接的解决方案。libvlc是VLC媒体播放器的底层库,封装了多媒体处理的复杂性,提供了丰富的API接口,使开发者能够更便捷地实现多媒体应用。在本方案中,libvlc负责拉取RTSP视频流、解码并显示。libvlc库内置了对多种硬件加速技术的支持,Kylin的源server有编译好二进制包, 直接apt 安装即可,无需手动编译,降低了开发复杂度。

在硬件加速方面,libvlc同样支持VA-API,只需在初始化libvlc时通过参数`--avcodec-hw=vaapi`指定即可。同时,libvlc的API设计使得视频的播放、暂停、停止等操作变得非常简单。这一方案的优势在于开发效率高、代码简洁且容易维护。

实施

在确定了使用Qt和libvlc作为技术方案后,开发工作重点关注以下几个方面:

页面布局

应用程序的界面使用Qt进行设计与布局。由于最多支持16路摄像头视频流,界面布局需要能够容纳多个视频窗口,并支持动态调整布局以适应不同数量的摄像头连接。每个摄像头的视频流在界面上都有一个独立的显示窗口,用户可以通过界面上的按钮整体控制视频的拉流、停止。

界面布局分为左右两部分, 左部分是摄像头相关参数配置区, 右边部分是多路视频显示区:

截图以4路为例,16路可以在当前源代码基础上进行简单修改:

libvlc拉流与显示

libvlc的使用过程相对简单。首先,通过调用libvlc_new函数初始化libvlc实例,并传入初始化参数,如`--network-caching=50`(设置网络缓存为50ms)和`--avcodec-hw=vaapi`(启用硬件加速)。然后,使用libvlc_media_new_location函数创建RTSP媒体对象,并将其绑定到libvlc媒体播放器。

为了实现多路视频流的并发处理,采用了Qt的多线程机制,每路视频流对应一个独立的线程,避免了主线程阻塞的问题。

多线程的处理方式如下:为每个摄像头创建一个VideoWorker对象,并将其分配到一个新的QThread中,确保每路视频流的拉取与解码操作在独立的线程中进行。这样不仅提高了程序的响应速度,还能确保即使在某一路视频流出现问题时,其他视频流的播放不受影响。

多线程并发处理

为了处理多路视频流的并发,使用了Qt的QThread类。每个VideoWorker对象负责从指定的RTSP地址拉取视频流,并通过libvlc进行解码和显示。将VideoWorker对象移动到独立的线程中运行,可以防止长时间的拉流与解码操作阻塞主线程,从而保证用户界面的流畅性。

线程之间的通信通过Qt的信号与槽机制实现,例如在视频流解码完成时,VideoWorker对象会发出信号通知主线程更新显示窗口。通过这种方式,可以实现多路视频流的并行拉取与实时显示。

测试结果

在完成开发之后,进行了多次测试,验证系统的稳定性与性能。测试环境为飞腾2000四核处理器、景嘉微显卡和Kylin V10操作系统。连接了4路摄像头,并拉取1920x1080分辨率的RTSP视频流进行实时显示。

测试结果显示,系统能够稳定地处理多路视频流,并且在每路视频流的拉取和显示过程中,延时控制在800ms左右。这一延时表现符合预期,且未出现明显的卡顿或掉帧现象。同时,硬件加速功能在libvlc中得到了有效的利用,极大地减轻了CPU的负担。

在整个测试过程中,系统表现出了较高的稳定性和可靠性。在16路视频流同时运行的情况下,CPU和GPU的负载均在可接受范围内,且系统资源消耗均匀,未出现资源占用过高或瓶颈问题。这表明,基于Qt和libvlc的技术方案在处理多路RTSP视频流时,具备较高的实用性和扩展性。

结论

通过本次项目的开发与测试,证明了在Linux操作系统下,基于Qt和libvlc的技术方案能够有效地拉取并实时显示多路摄像头的RTSP视频流。与FFmpeg方案相比,libvlc方案具有更高的开发效率和更低的维护成本。对于需要处理多路视频流的监控系统或多媒体应用,libvlc提供了一个强大且易于使用的解决方案。

如有源码需求者, 可留言进一步沟通!

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

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

相关文章

C++中二叉搜索树的底层原理及实现

小编在学习完二叉搜索树(SearchBinaryTree)之后觉得虽然二叉搜索树不是很难,但是它对于后面学习C中的AVL树和红黑树及map和set的封装都有重要的作用,因此小编今天带给大家二叉搜索树的原理及实现,话不多说,开始学习!~~…

<Linux> git

在使用git之前,要先在linux中安装git yum list | grep git yum install -y 文件名 在第一次安装git时,需要进行下面的操作 git config --global user.email "你的邮箱名" git config --global user.name "你想要的名字" 1. git clon…

LeetCode 热题 HOT 100 (038/100)【宇宙最简单版】

【动态规划】No. 0337 打家劫舍III【中等】👉力扣对应题目指路 希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&a…

NGINX 常用内置变量

目录 $remote_addr 变量 $args 变量 $is_args 变量 $document_root 变量 $document_uri 变量 $host 变量 $limit_rate 变量 $remote_port 变量 $remote_port --显示客户端端口 $request_method 变量 --返回请求方式 $request_filename 变量 --返回请求实际路径 $request_uri…

eNSP 华为ACL配置

华为ACL配置 需求&#xff1a;公司保证财务部数据安全&#xff0c;禁止研发部门和互联网访问财务服务器&#xff0c;但总裁办不受影响 R1&#xff1a; <Huawei>sys [Huawei]sys Router1 [Router1]undo info-center enable [Router1]int g1/0/0 [Router1-GigabitEthern…

AI 工程应用 建筑表面检测及修复

文章目录 1 项目概述&#xff08;必写&#xff09;&#xff1a;2 技术方案与实施步骤2.1 模型选择&#xff08;必写&#xff09;&#xff1a;2.2 数据的构建&#xff1a;2.3 功能整合&#xff08;进阶&#xff09;&#xff1a; 3 实施步骤&#xff1a;3.1 环境搭建&#xff08;…

【Nginx】nginx的核心配置

1.nginx的文件启动 [rootNginx ~]# vim /lib/systemd/system/nginx.service [Unit] DescriptionThe NGINX HTTP and reverse proxy server Aftersyslog.target network-online.target remote-fs.target nss-lookup.target Wantsnetwork-online.target [Service] Typeforking P…

Python -- GUI图形界面编程—GUI编程实例 博主也在持续学习中[ 持续更新中!!! 欢迎白嫖 也求粉啊啊啊~ ]

本文介绍了GUI的图形界面编程&#xff08;相关视频是哔站上的应该搜这个题目就能找到&#xff09;&#xff0c;文章还是很基础的&#xff0c;反正我是小白从0开始&#xff0c;主要的结构tinkter库、重要组件简介&#xff08;这个不用死记硬背 用的时候再说&#xff09;、Label&…

诊断知识:DTC Status中pending位的使用

文章目录 前言OCC6的定义pending位的定义pending位的使用总结 前言 上一篇文章介绍了ConfirmedDTCLimit的使用&#xff0c;诊断知识&#xff1a;ConfirmedDTCLimit的使用&#xff0c;后面发现理解还是有问题的&#xff0c;其实原来的图画的没有问题&#xff0c;之前对OCC6理解…

【业余玩儿AI】Day 1

【业余玩儿AI】Day 1 实际是昨天的事儿了&#xff0c;记录以下 魔法 不管三七二十一&#xff0c;重新启用魔法&#xff0c;没有魔法这些事情肯定是不行滴 种子任务 把收藏了两个星期的短视频都看了一遍&#xff0c;挑了个种子任务&#xff0c;《本地部署Llama3.1》&#x…

【Web IDE】WebContainer容器在浏览器中启动运行nodejs并使用vite启动项目

参考了文章WebContainer/api 基础&#xff08;Web IDE 技术探索 一&#xff09; 在浏览器中运行vite的vue3项目 示例站点 最终效果 主要流程 加载WebContainer》加载代码压缩包>解压代码压缩包》生成文件树》挂载文件树》pnpm安装依赖》启动项目 代码 <script setup…

Unity动画模块 之 3D模型导入基础设置Model页签

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 创建模型&#xff1a;在 Unity 外部创建模型 - Unity 手册 导入模型&#xff1a;将模型导入 Unity - Unity 手册 1.…

算法的学习笔记—二叉树的镜像(牛客JZ27)

&#x1f600;前言 在二叉树相关的问题中&#xff0c;镜像操作是一个非常经典且常见的题目。本文将通过一道具体的题目&#xff0c;详细讲解如何将一棵二叉树转换为它的镜像&#xff0c;并提供实现该操作的Java代码示例。 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 …

【LVGL9学习笔记-2.添加百问网demo至工程模板】

添加百问网demo至工程模板 上一节使用codeBlocks运行了LVGL ,以此作为模板&#xff0c;将百问网的一些demo添加至该工程中 拷贝文件与配置文件至该目录下 打开工程包含文件 –>add files recusively –>add files 编译一次出现如下情况&#xff08;后面学到了再做解决…

[机器学习]全景指南:从基础概念到实战流程的全面解析

文章目录 1.引言1.1机器学习的重要性1.2机器学习的应用范围1.3本文的内容结构 2. 机器学习的基本概念与分类2.1 机器学习的定义2.2 机器学习的分类 4. 强化学习&#xff08;Reinforcement Learning&#xff09; 3. 机器学习的工作流程3.1 数据收集与准备1. 数据源与类型2. 数据…

Windows SDK 消息类型详解

消息结构体 如下是消息的结构体 typedef struct tagMSG {HWND hwnd; // 消息所属窗口的句柄UINT message; // 消息的标识符&#xff0c;表示什么类型的消息&#xff0c;如WM_PAINT、WM_QUIT等。WPARAM wParam; // 与消息相关的附加信息。具体含义取决于消息的类型。L…

模型驱动设计(MODEL-DRIVEN DESIGN)

前言 为了保证软件实现得简洁并且与模型保持一致&#xff0c;不管实际情况如何复杂&#xff0c;必须运用建模和设计的最佳实践。 本书中的软件设计风格主要遵循"职责驱动设计"的原则&#xff0c;这个原则是Wirfs-Brock等人在1990年中提出的&#xff0c;并在2003年进…

Nios ll软核处理器

1.打开软件 &#xff08;1&#xff09;quartus软件内部打开 &#xff08;2&#xff09;创建软件快捷方式 软件安装目录文件夹下&#xff0c;nois2eds -> bin -> eclipse-nios2.exe &#xff0c;创建快捷方式&#xff0c;放到桌面&#xff0c;双击打开软件。 2.Workspa…

CSC2121 半桥驱动芯片

CSC2121 X系列是一款高性价比的半桥架构的栅极驱动专用电路&#xff0c;用于大功率MOS管、IGBT管栅极驱动。CSC2121内部集成了逻辑信号处理电路、死区时间控制电路、欠压保护电路、电平位移电路、脉冲滤波电路及输出驱动电路&#xff0c;CSC2121X专用于无刷电机控制器中驱动电路…

韩国服务器的性能如何提升

韩国服务器的性能可以通过硬件升级、网络优化、缓存优化和软件优化来提升。具体方法如下&#xff0c;rak小编为您整理发布韩国服务器的性能如何提升。 1. 硬件升级 CPU升级&#xff1a;选择高性能的多核处理器&#xff0c;可以显著提升计算速度和响应能力。 内存升级&#xff1…