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提供了一个强大且易于使用的解决方案。

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

相关推荐
人生苦短,菜的抠脚21 小时前
Linux 内核IIO sensor驱动
linux·驱动开发
jz_ddk21 小时前
[LVGL] 从0开始,学LVGL:进阶应用与项目实战(上)
linux·信息可视化·嵌入式·gui·lvgl·界面设计
望获linux1 天前
【实时Linux实战系列】Linux 内核的实时组调度(Real-Time Group Scheduling)
java·linux·服务器·前端·数据库·人工智能·深度学习
MC丶科1 天前
【SpringBoot常见报错与解决方案】端口被占用?Spring Boot 修改端口号的 3 种方法,第 3 种 90% 的人不知道!
java·linux·spring boot
江公望1 天前
ubuntu kylin(优麒麟)和标准ubuntu的区别浅谈
linux·服务器·ubuntu·kylin
Lynnxiaowen1 天前
今天我们开始学习python语句和模块
linux·运维·开发语言·python·学习
生态笔记1 天前
PPT宏代码
linux·服务器·powerpoint
mucheni1 天前
迅为RK3588开发板Ubuntu 系统开发ubuntu终端密码登录
linux·运维·ubuntu
skywoodsky1 天前
Ubuntu 24.04环境下的挂起转休眠
linux
小云数据库服务专线1 天前
GaussDB 应用侧报Read timed out解决方法
linux·服务器·gaussdb