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

前言

应客户方的一个实际项目需求,需要在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.rhkb.cn/news/399285.html

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

相关文章

在等保测评中,如何平衡资产识别的全面性和准确性,避免过度关注某些资产而忽视其他潜在风险?

在等保测评中平衡资产识别的全面性和准确性,避免过度关注某些资产而忽视其他潜在风险,可以通过以下策略实现: 1. 全面审计:确保进行一次全面的审计,包括所有类型的资产,避免遗漏任何关键组件。 2. 风险导…

上海亚商投顾:三大指数小幅调整,两市成交不足5000亿

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 大指数昨日窄幅震荡,临近尾盘小幅下挫。环保板块开盘大涨,永清环保、清研环境、中兰环…

OpenCV图像滤波(10)Laplacian函数的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 功能描述 计算图像的拉普拉斯值。 该函数通过使用 Sobel 运算符计算出的 x 和 y 的二阶导数之和来计算源图像的拉普拉斯值: dst Δ src ∂…

LeetCode刷题笔记第191题:位1的个数

LeetCode刷题笔记第191题:位1的个数 题目: 想法: 通过位运算判断二级制形式中有多少个1,代码及解释如下: class Solution:def hammingWeight(self, n: int) -> int:return sum(1 for i in range(32) if n & …

Latex或者word里面mathtype类型的数学公式如何变成mathematica里面的形式

详细步骤如下: 第一步:Latex里面的公式复制粘贴到word里面,转变成mathtype类型的数学公式(若已经是word里面mathtype类型的数学公式,这一步可以省略),如下: 第二步:将ma…

数字孪生赋能智慧城市大脑智建设方案(可编辑65页PPT)

引言:随着科技的飞速发展,智慧城市的建设已成为全球城市发展的新趋势。数字孪生技术作为其中的关键技术之一,正逐步赋能智慧城市大脑的建设,推动城市治理从数字化向智能化、智慧化转型升级。本方案旨在简要介绍数字孪生赋能智慧城…

Mapreduce_csv_averageCSV文件计算平均值

csv文件求某个平均数据 查询每个部门的平均工资,最后输出 数据处理过程 employee_noheader.csv(没做关于首行的处理,运行时请自行删除) EmployeeID,EmployeeName,DepartmentID,Salary 1,ZhangSan,101,5000 2,LiSi,102,6000…

VisionPro二次开发学习笔记13-使用CogToolBlock进行图像交互

该程序演示了如何使用CogToolBlock进行图像交互. 从vpp文件中加载一个ToolBlock。 用户可以通过应用程序窗体上的数字增减控件修改ToolBlock输入端子的值。 用户还可以从coins.idb或采集FIFO中选择图像。 “运行一次”按钮执行以下操作: 获取下一个图像或读取下一…

Android Studio 连接手机进行调试

总所周知,Android Studio里的虚拟手机下载后又大又难用。不如直接连手机用。本篇文章主要内容为Android Studio怎么连接手机进行程序调试。 1. 在AndroidSDK中下载google USB Driver: 2. 连接手机: 进入电脑设备管理器界面。并点开便携设备&#xff0c…

Java生成图形验证码

1、加依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency> 2、写接口&#xff0c;这块不需要登录成功才能操作的&#xff0c;所以写controller就行了…

图论:欧拉路

欧拉路是什么 什么&#xff1f;你对这个名字感到很陌生&#xff1f;再看看是图论的内容&#xff0c;感觉是不是很难&#xff1f;其实一点也不难&#xff0c;这就是生活中的一笔画问题&#xff0c;也就是不重复的经过每一条边并可以访问所有的点&#xff0c;先看看这个图&#…

PaddleOCR 图片文字提取

PaddleOCR 图片文字提取 需求一.裁剪车牌号码区域二.对车牌小图进行处理三.填充边界四.识别步骤 需求 工作上的一个需求&#xff0c;需要把图片中的车牌号码提取出来。如图&#xff0c;车牌在图片固定位置。开始使用pytesseract&#xff0c;对中文识别特别不友好&#xff0c;毕…

应对FingerprintJS反爬:Selenium的破解策略与技术详解

目录 引言 FingerprintJS技术概述 技术原理 应用场景 应对策略 高级解决方案 代码实现与案例分析 去除webdriver特征 使用Undetected_chromedriver 案例分析&#xff1a;爬取目标网站数据 结论 引言 在现代互联网环境中&#xff0c;网站反爬技术日益成熟&#xff0…

滑动窗口 | Java | (hot100) 力扣 3

力扣 3.无重复字符的最长子串 暴力法&#xff1a;双层for循环&#xff0c;i-j的字符查重 滑动窗口&#xff1a;因为这题被分在这个类别里&#xff0c;那么已知要用滑动窗口&#xff0c;思路应该是什么。 反正我想不出来…… 看了别人的题解写出来的出错点&#xff1a;特别容易…

Redis14-缓存同步

目录 缓存同步策略 安装Canal 监听Canal 缓存同步策略 缓存数据同步的常见方式有三种&#xff1a; 1.设置有效期&#xff1a;给缓存设置有效期&#xff0c;到期后自动删除&#xff0c;再次查询时更新 优势&#xff1a;简单、方便缺点&#xff1a;时效性差&#xff0c;缓存…

【keepalived】高可用集群

一、高可用集群 1.1集群类型 LB&#xff1a;Load Balance 负载均衡 LVS/HAProxy/nginx&#xff08;http/upstream, stream/upstream&#xff09; HA&#xff1a;High Availability 高可用集群 数据库、Redis SPoF: Single Point of Failure&#xff0c;解决单点故障 HPC&…

Spring boot框架指南

1. Spring Boot 概述 1.1 定义与起源 Spring Boot是一种基于Spring框架的开源框架&#xff0c;旨在简化Spring应用程序的创建和开发过程。它通过提供一系列默认配置和自动配置功能&#xff0c;减少了开发者在配置上的工作量&#xff0c;使得快速搭建生产级别的Spring应用程序…

HTML零基础自学笔记(下)篇一 -8.8

HTML零基础自学笔记&#xff08;下&#xff09;---之表格标签详解 参考&#xff1a;pink老师篇一、表格标签是什么&#xff1f;基础内容&#xff08;主要作用、基本语法、标签释义、属性&#xff09;主要作用基本语法标签释义表格结构标签属性 合并单元格代码练习代码运行效果&…

RAG和微调哪个是LLM优化的最优解

RAG和微调哪个是LLM优化的最优解 序言 随着对大型语言模型(llm)的兴起&#xff0c;许多开发人员和组织都在忙着利用它的能力构建自己的应用程序。然而&#xff0c;当预训练的大语言模型开箱即用的表现不如预期时&#xff0c;关于如何提高LLM应用程序性能的问题就被提了出来。就…

【C++】6.类和对象(4)

文章目录 5.赋值运算符重载5.1 运算符重载5.2 赋值运算符重载5.3 前置和后置重载5.4 日期类的实现 6.取地址运算符重载6.1 const成员函数6.2 取地址运算符重载 5.赋值运算符重载 5.1 运算符重载 当运算符被用于类类型的对象时&#xff0c;C语言允许我们通过运算符重载的形式指…