当前位置: 首页 > article >正文

保姆级教程:在ArmSoM-W3开发板上用QT+MPP+FFmpeg搞定四路RTSP硬解码(附完整代码)

RK3588开发板实战QTMPPFFmpeg四路RTSP硬解码全流程解析第一次拿到ArmSoM-W3开发板时面对RK3588这颗性能怪兽很多开发者都会好奇如何充分发挥它的多媒体处理能力。特别是在安防监控、智能视觉等场景中实现多路高清视频流的实时解码显示是刚需。本文将手把手带你完成从零搭建开发环境到最终实现四路1080P RTSP流硬解码显示的完整流程。1. 开发环境准备与工具链配置工欲善其事必先利其器。在开始编码前我们需要确保开发环境和工具链配置正确。ArmSoM-W3开发板基于Rockchip RK3588芯片这款SoC内置的NPU和VPU为多媒体处理提供了硬件加速支持。基础环境要求ArmSoM-W3开发板预装Ubuntu 20.04或更高版本主机开发环境推荐Ubuntu 20.04稳定的网络连接用于下载依赖和源码首先通过SSH连接到开发板更新系统并安装基础工具sudo apt update sudo apt upgrade -y sudo apt install -y build-essential cmake git接下来是三大核心组件的安装1.1 FFmpeg编译安装FFmpeg将负责RTSP流的拉取和解封装。我们需要从源码编译支持硬件加速的版本git clone https://git.ffmpeg.org/ffmpeg.git cd ffmpeg ./configure --enable-shared --enable-nonfree --enable-gpl --enable-version3 \ --enable-libdrm --enable-rkmpp make -j$(nproc) sudo make install注意编译过程可能需要1-2小时取决于主机性能。确保有足够的磁盘空间至少5GB空闲1.2 MPP库配置Rockchip Media Process Platform(MPP)是硬解码的核心库通常开发板厂商会提供预编译版本sudo apt install rockchip-mpp-dev rockchip-mpp-demos验证安装是否成功mpp_info1.3 QT开发环境搭建QT将作为我们的GUI框架推荐安装5.15或更高版本sudo apt install -y qt5-default qtcreator libqt5opengl5-dev2. 项目架构设计与核心流程理解数据流向是项目成功的关键。整个处理流程可以分为四个主要阶段流获取阶段FFmpeg拉取RTSP流并解封装为AVPacket硬解码阶段MPP将AVPacket转换为MppPacket并进行硬解码图像处理阶段RGA对YUV数据进行格式转换和裁剪显示阶段QT渲染最终的RGB图像性能考量因素每路视频的分辨率和帧率内存带宽占用CPU/GPU/NPU负载均衡线程模型设计建议采用生产者-消费者模型为每路视频创建独立的工作线程视频流1: [拉流线程] - [解码线程] - [显示线程] 视频流2: [拉流线程] - [解码线程] - [显示线程] ...3. 核心代码实现详解3.1 FFmpeg拉流模块创建StreamReader类处理RTSP连接和数据获取class StreamReader { public: StreamReader(const std::string url) : m_url(url) {} bool init(); AVPacket* readPacket(); private: AVFormatContext* m_formatCtx nullptr; std::string m_url; int m_videoStreamIndex -1; }; bool StreamReader::init() { avformat_network_init(); if(avformat_open_input(m_formatCtx, m_url.c_str(), NULL, NULL) ! 0) { qWarning() Couldnt open input stream; return false; } if(avformat_find_stream_info(m_formatCtx, NULL) 0) { qWarning() Couldnt find stream information; return false; } for(int i0; im_formatCtx-nb_streams; i) { if(m_formatCtx-streams[i]-codecpar-codec_type AVMEDIA_TYPE_VIDEO) { m_videoStreamIndex i; break; } } return m_videoStreamIndex ! -1; } AVPacket* StreamReader::readPacket() { AVPacket* packet av_packet_alloc(); if(av_read_frame(m_formatCtx, packet) 0) { if(packet-stream_index m_videoStreamIndex) { return packet; } av_packet_unref(packet); } return nullptr; }3.2 MPP硬解码模块MppDecoder类封装硬解码逻辑class MppDecoder { public: MppDecoder(); ~MppDecoder(); bool init(); MppFrame decode(AVPacket* packet); private: MppCtx m_ctx; MppApi* m_mpi; MppBufferGroup m_bufGroup; }; MppFrame MppDecoder::decode(AVPacket* packet) { MppPacket mppPacket nullptr; MppFrame frame nullptr; mpp_packet_init(mppPacket, packet-data, packet-size); mpp_packet_set_pts(mppPacket, packet-pts); m_mpi-decode_put_packet(m_ctx, mppPacket); m_mpi-decode_get_frame(m_ctx, frame); mpp_packet_deinit(mppPacket); return frame; }3.3 RGA图像转换Rockchip RGARaster Graphic Acceleration是高效的2D图像处理单元#include rga/RgaApi.h void convertYUVtoRGB(MppFrame frame, QImage output) { rga_info_t src, dst; memset(src, 0, sizeof(src)); memset(dst, 0, sizeof(dst)); src.fd -1; src.virAddr (void*)mpp_frame_get_buffer(frame); src.mmuFlag 1; dst.fd -1; dst.virAddr output.bits(); dst.mmuFlag 1; // 配置格式转换参数 rga_set_rect(src.rect, 0, 0, mpp_frame_get_width(frame), mpp_frame_get_height(frame), mpp_frame_get_width(frame), mpp_frame_get_height(frame), RK_FORMAT_YCbCr_420_SP); rga_set_rect(dst.rect, 0, 0, output.width(), output.height(), output.bytesPerLine(), output.height(), RK_FORMAT_RGB_888); // 执行转换 c_RkRgaBlit(src, dst, nullptr); }4. QT界面集成与多路显示4.1 视频显示控件创建自定义QT控件用于视频渲染class VideoWidget : public QOpenGLWidget { Q_OBJECT public: VideoWidget(QWidget* parent nullptr); void updateFrame(const QImage frame); protected: void paintEvent(QPaintEvent* event) override; private: QImage m_currentFrame; QMutex m_frameMutex; }; void VideoWidget::updateFrame(const QImage frame) { QMutexLocker locker(m_frameMutex); m_currentFrame frame.copy(); update(); } void VideoWidget::paintEvent(QPaintEvent* event) { QPainter painter(this); painter.setRenderHint(QPainter::SmoothPixmapTransform); QMutexLocker locker(m_frameMutex); if(!m_currentFrame.isNull()) { painter.drawImage(rect(), m_currentFrame, m_currentFrame.rect()); } }4.2 四路显示布局使用QT的布局管理器创建4分屏界面MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) { QWidget* centralWidget new QWidget(this); QGridLayout* layout new QGridLayout(centralWidget); for(int i0; i4; i) { m_videoWidgets[i] new VideoWidget(this); layout-addWidget(m_videoWidgets[i], i/2, i%2); } setCentralWidget(centralWidget); // 初始化四个视频处理线程 for(int i0; i4; i) { m_streamProcessors[i] new StreamProcessor( RTSP_URLS[i], m_videoWidgets[i]); m_streamProcessors[i]-start(); } }5. 性能优化与常见问题排查5.1 内存管理最佳实践FFmpeg内存泄漏确保每个AVPacket都正确释放MPP缓冲池合理配置缓冲池大小QT图像传输避免频繁的内存分配/释放5.2 典型错误与解决方案问题1解码出现花屏或绿屏检查RGA格式转换参数是否正确验证输入YUV数据的stride值确保时间戳(PTS)正确传递问题2高负载下视频卡顿使用top命令监控CPU负载检查各线程的CPU亲和性设置考虑降低解码分辨率或帧率问题3RTSP连接不稳定调整FFmpeg的rtsp_transport参数增加网络缓冲区大小实现断线重连机制5.3 性能监控工具# 查看CPU使用率 mpstat -P ALL 1 # 监控内存使用 free -h # 查看VPU使用状态 cat /sys/kernel/debug/mpp_service/vpu6. 项目扩展与进阶方向基础功能实现后可以考虑以下增强功能智能分析集成利用RK3588 NPU运行目标检测模型录制功能添加本地存储模块动态布局支持1/4/9/16分屏切换OSD叠加在视频上显示时间戳和元数据对于需要更高性能的场景可以探索使用Vulkan替代OpenGL进行渲染实现零拷贝数据传输调整MPP解码器参数以获得更低延迟

相关文章:

保姆级教程:在ArmSoM-W3开发板上用QT+MPP+FFmpeg搞定四路RTSP硬解码(附完整代码)

RK3588开发板实战:QTMPPFFmpeg四路RTSP硬解码全流程解析 第一次拿到ArmSoM-W3开发板时,面对RK3588这颗性能怪兽,很多开发者都会好奇如何充分发挥它的多媒体处理能力。特别是在安防监控、智能视觉等场景中,实现多路高清视频流的实时…...

别再为高频板阻抗头疼了!手把手教你用RO4350B混压搞定四层板设计(附详细参数表)

高频PCB设计实战:RO4350B混压四层板阻抗控制全解析 在射频和高速数字电路设计中,阻抗控制是决定信号完整性的关键因素。当频率超过500MHz时,传统FR-4材料的高损耗和介电常数不稳定性开始成为性能瓶颈。RO4350B作为Rogers公司的明星产品&#…...

gte-base-zh开源可部署优势:支持国产昇腾/寒武纪芯片适配路线

gte-base-zh开源可部署优势:支持国产昇腾/寒武纪芯片适配路线 1. 快速了解gte-base-zh模型 gte-base-zh是由阿里巴巴达摩院训练的中文文本嵌入模型,基于BERT框架构建。这个模型专门为中文文本处理设计,能够将文本转换为高质量的向量表示&am…...

Ubuntu服务器一键部署Qwen3-ASR-0.6B:高可用语音识别服务搭建

Ubuntu服务器一键部署Qwen3-ASR-0.6B:高可用语音识别服务搭建 语音识别技术正在从实验室走向生产环境,成为许多应用不可或缺的一部分。想象一下,你需要为客服系统、会议记录工具或者智能设备添加“听懂人话”的能力,自己从零开始…...

虚拟机热迁移实战指南:从核心原理到生产环境部署与调优

1. 虚拟机热迁移的核心原理 第一次接触热迁移时,我被这个技术的神奇之处震撼到了——就像给飞行中的飞机更换引擎,乘客完全感受不到任何颠簸。虚拟机热迁移(Live Migration)的本质,就是在不中断服务的情况下&#xff…...

Steam成就管理器:如何安全高效地掌控你的游戏成就数据

Steam成就管理器:如何安全高效地掌控你的游戏成就数据 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager Steam Achievement Manager(…...

AI原生研发为何92%团队卡在MVP阶段?SITS2026专家解密4类隐性架构债及清偿路径

第一章:SITS2026专家解读:AI原生研发的核心挑战 2026奇点智能技术大会(https://ml-summit.org) AI原生研发并非简单地将大模型接入现有流水线,而是重构软件生命周期的认知范式——从“人写逻辑、AI辅助”转向“人定义意图、AI生成可验证系统…...

VBA-JSON终极指南:在Excel中轻松处理JSON数据的完整教程

VBA-JSON终极指南:在Excel中轻松处理JSON数据的完整教程 【免费下载链接】VBA-JSON JSON conversion and parsing for VBA 项目地址: https://gitcode.com/gh_mirrors/vb/VBA-JSON 你是否经常需要在Excel中处理来自API的JSON数据?或者需要将Excel…...

ARM-驱动-03 Linux 字符设备驱动开发

一、驱动程序基础概念 1. 驱动程序的本质 驱动程序本质上就是操作硬件的程序,和裸机开发中写的 BSP 代码干的是同一件事——直接控制寄存器、管理外设。 区别在于: 裸机开发:驱动和应用代码混在一起写,没有明确的分层,…...

WaveTools鸣潮工具箱:3大核心功能让你告别卡顿,科学抽卡不迷路

WaveTools鸣潮工具箱:3大核心功能让你告别卡顿,科学抽卡不迷路 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 如果你正在玩《鸣潮》PC版,一定经历过游戏卡顿、帧率限制…...

从PCI到PCIe:一次Read请求的‘分家’之旅,以及超时机制为何成了‘必要之恶’

从PCI到PCIe:一次Read请求的‘分家’之旅,以及超时机制为何成了‘必要之恶’ 在计算机体系结构的演进长河中,总线协议的设计始终面临着效率与可靠性的永恒博弈。想象一下,当CPU需要从外设读取数据时,如果必须像排队买奶…...

Windows Defender终极移除指南:高效释放系统资源的13项完整方案

Windows Defender终极移除指南:高效释放系统资源的13项完整方案 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mi…...

VMware macOS虚拟机终极指南:3步解锁苹果系统支持

VMware macOS虚拟机终极指南:3步解锁苹果系统支持 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 你是否想在Windows或Linux电脑上体验macOS系统,却发现VMware中根本没有苹果系统…...

类器官:十五五规划下的“人体替身“革命

3月10日,《中华人民共和国国民经济和社会发展第十五个五年规划纲要(草案)》正式对外公布并提请全国人大审议。值得关注的是,类器官与器官芯片技术首次被提升至国家战略高度——在"专栏8 前沿科技攻关"的"生命科学与…...

终极指南:5步让老款Mac安装最新macOS系统

终极指南:5步让老款Mac安装最新macOS系统 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 想让2008年甚至更早的MacBook也能运行最新的macOS Sequo…...

同花顺_代码解析_技术指标_EJK实战应用

1. EJK技术指标入门指南 第一次在同花顺上看到EJK指标时,我也是一头雾水。这个看起来像三个字母随机组合的指标,实际上是由三个关键参数组成的复合型技术分析工具。经过半年多的实盘验证,我发现它特别适合A股市场的短线操作。 EJK的全称是&qu…...

GLM-4.1V-9B-Base入门指南:中文提问技巧与高置信度回答生成方法

GLM-4.1V-9B-Base入门指南:中文提问技巧与高置信度回答生成方法 1. 认识GLM-4.1V-9B-Base GLM-4.1V-9B-Base是智谱AI开源的一款视觉多模态理解模型,专门针对中文环境优化。这个模型最大的特点是能够理解图片内容,并根据你的提问给出准确的回…...

VMware 虚拟机中部署 Intv_AI_MK11:隔离测试环境搭建指南

VMware 虚拟机中部署 Intv_AI_MK11:隔离测试环境搭建指南 1. 为什么需要隔离测试环境 在AI模型开发和测试过程中,隔离环境的重要性怎么强调都不为过。想象一下,你正在调试一个全新的AI模型,突然发现它占用了你电脑的所有资源&am…...

LabVIEW网络通讯:TCP连接三菱PLC FX3U ENET-ADP的MC协议网络通讯与程序开发

LabVIEW网络网口TCP通讯三菱PLC FX3U ENET-ADP,MC协议网络通讯FX3U网络通讯。 官方MC协议,报文读取,安全稳定。 程序代开发,代写程序。 通讯配置,辅助测试。 FX3U无程序网络通讯实现。 常用功能一网打尽。 1.命令帧读写…...

c++怎么利用C++17的filesystem--copy实现高效文件夹克隆【详解】

filesystem::copy 默认不递归复制子目录,需显式指定 fs::copy_options::recursive;若目标已存在,还需组合 overwrite_existing 才能覆盖。filesystem::copy 会递归复制子目录吗?默认不会。filesystem::copy 对目录只做“浅拷贝”—…...

实现点击目标图片时随机重定位的完整教程

本文详解如何让 html 元素(如靶心图片)在每次点击时都重新生成随机坐标并平滑移动到新位置,解决“仅首次生效”问题,关键在于将随机计算逻辑置于事件函数内部,并确保 css 定位正确。 本文详解如何让 html 元素&am…...

SenseVoice-small WebUI参数详解:auto语言检测、ITN开关与情感识别调优

SenseVoice-small WebUI参数详解:auto语言检测、ITN开关与情感识别调优 1. 引言:不只是转文字,更是理解语音 如果你用过语音转文字工具,可能会发现一个尴尬的情况:明明说的是“一百二十”,识别出来却还是…...

数据血缘断链,模型推理失准,合规审计失败——AI原生系统数据治理失效的4个致命信号,你中了几个?

第一章:AI原生软件研发中的数据治理策略 2026奇点智能技术大会(https://ml-summit.org) AI原生软件的研发范式从根本上重构了传统软件工程的数据边界——数据不再仅是输入或输出,而是模型行为、系统可解释性与合规性的核心载体。在该范式下,…...

Vue3 + TypeScript 实战:从 React 视角理解类型系统的10个关键差异

一、前言 在 2026 年的软件开发中,Vue3 已经成为每一位工程师必须掌握的技能。无论是构建高性能后端服务、开发响应式前端界面,还是维护生产级服务器集群,这项技术都在其中扮演着关键角色。 很多开发者在入门阶段会遇到一个普遍问题&#x…...

2026奇点智能技术大会核心技术解密(AI原生研发全链路SOP首次公开)

第一章:2026奇点智能技术大会:AI原生研发全流程拆解 2026奇点智能技术大会(https://ml-summit.org) 在2026奇点智能技术大会上,AI原生研发不再停留于模型微调与API调用,而是贯穿从需求建模、数据契约定义、可验证推理生成&#x…...

3分钟告别文档下载烦恼:kill-doc帮你一键获取百度文库、豆丁网等40+平台资料

3分钟告别文档下载烦恼:kill-doc帮你一键获取百度文库、豆丁网等40平台资料 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档&#x…...

衣柜里的暖,是藏不住的牵挂

老李独居在老房子里,儿女都在外地打拼,一年到头难得回几次家,平日里冷冷清清的屋子,只有逢年过节才会热闹几分。 北方的冬天总是格外漫长,寒风一吹,窗户缝里都透着刺骨的凉,老李年纪大了&#x…...

Qwen3-Reranker-0.6B部署优化:如何提升服务响应速度与稳定性?

Qwen3-Reranker-0.6B部署优化:如何提升服务响应速度与稳定性? 1. 理解Qwen3-Reranker-0.6B的核心特性 1.1 模型架构与性能优势 Qwen3-Reranker-0.6B作为阿里云推出的轻量级重排序模型,基于Qwen3系列架构设计,具有以下显著特点&…...

ncmdump:3个魔法时刻,让网易云音乐NCM格式转换变得如此简单

ncmdump:3个魔法时刻,让网易云音乐NCM格式转换变得如此简单 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 开篇故事:被格式困住的音乐时光 想象一下这个场景:你花了整整一个下午&…...

WSABuilds终极指南:在Windows 10/11上完美运行Android应用的完整解决方案

WSABuilds终极指南:在Windows 10/11上完美运行Android应用的完整解决方案 【免费下载链接】WSABuilds Run Windows Subsystem For Android on your Windows 10 and Windows 11 PC using prebuilt binaries with Google Play Store (MindTheGapps) and/or Magisk or …...