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

RK3588之ArmSoM-W3 + MPP实现多路硬解码拉流

简介

  • 学习完MPP的解码Demo之后,想必大家都想通过一个项目来进行RK3588-MPP的解码实战。
  • 本篇文章就基于ArmSoM-W3开发板,开发一个多路硬解码项目,实现四路MPP硬解码拉流显示
  • 实现的效果如下:

RK3588四路MPP硬解码拉流

环境介绍

  • 硬件环境:
    ArmSoM-W3 RK3588开发板

  • 软件版本:
    OS:ArmSoM-W3 Debian11

思路:

ArmSoM-W3 + QT+FFmpeg +RTSP+ MPP实现多路硬解码拉流

  • mpp对外接口是输入MppPacket结构体指针:MppPacket *

    那么,MppPacket 数据从哪里来?

  • 通过FFmpeg进行拉流,拉RTSP流解封装为AVPacket数据类型,然后传给mpp进行硬解码

     1.首先由ffmpeg完成拉流工作获取到AVPacket。2.MPP接收到AVPacket数据然后转换成MppPacket再进行硬解码。3.MPP解码之后交给rga负责图片格式转换裁切等工作。4.交给qt渲染显示。
    

1. FFmpeg打开MP4格式文件或者进行拉流获取到AVPacket

核心代码:

AVPacket *av_packet = nullptr;
av_packet = (AVPacket *)av_malloc(sizeof(AVPacket));char filepath[] = "rtsp://admin:armsom@80.0.0.211:854/armsomvideo";// rtsp 地址avformat_open_input(&pFormatCtx, filepath, nullptr, &options)    //打开多媒体流,并且获取一些信息//读取一帧数据存到av_packet,av_packet是FFmpeg和MMP的数据互通接口
av_read_frame(pFormatCtx, av_packet) 

2. MPP获取到从FFmpeg传过来的AVPacket 数据然后进行硬解码

核心代码:

//将FFmpeg拉流获取到的av_packet数据通过函数参数传给MPP进行硬解码
int MppDecode::decode_simple(MppDecode::MpiDecLoopData *data, AVPacket *av_packet)
{MPP_RET ret = MPP_OK;MppPacket packet = nullptr;MppFrame  frame  = nullptr;//将AVPacket 数据转换为MppPacket数据 (实际上是MppPacket  ->data =  AVPacket  ->data)ret = mpp_packet_init(&packet, av_packet->data, av_packet->size); mpp_packet_set_pts(packet, av_packet->pts);mpp_packet_set_dts(packet, av_packet->dts);// 输入MppPacket,输出MppFramempi->decode_put_packet(ctx, packet)mpi->decode_get_frame(ctx, &frame)
}

3. MPP解码之后交给rga负责图片格式转换裁切等工作

  • 从MPP解码后获得的数据是YUV_420sp类型。我们用RGA将其转换成RGB888的数据数据格式方便QT显示

4. qt渲染显示

  • qt渲染方面可以通过lable或者OpenGL来显示

5. 更多项目设计详情请前往ArmSoM官方论坛进行讨论

ArmSoM 产品介绍: http://wiki.armsom.org/index.php/ArmSoM-w3

ArmSoM 技术论坛: http://forum.armsom.org/

http://www.lryc.cn/news/214745.html

相关文章:

  • 【Rust日报】2023-10-29 隆重推出 Rerun 0.10!
  • AI智能识别如何助力PDF,轻松实现文档处理?
  • 【SA8295P 源码分析】114 - 将Android GVM userdata文件系统从 EXT4 修改为 F2FS
  • LeetCode 387 字符串中的第一个唯一字符 简单
  • 线程池--简单版本和复杂版本
  • docker进阶
  • Unity HoloLens 2 应用程序发布
  • 3D RPG Course | Core 学习日记三:Navigation智能导航地图烘焙
  • Linux 启用本地ISO作为软件源
  • SpringCloud-Alibaba-Nacos2.0.4
  • docker运行镜像相关配置文件
  • 引擎系统设计思路 - 用户态与系统态隔离
  • 致远OA wpsAssistServlet任意文件读取漏洞复现 [附POC]
  • ​轻量应用服务器有什么优势?如何评价亚马逊云科技轻量应用服务器?
  • python的日志模块学习记录
  • 【java】redisTemplate mock时报空指针
  • Hadoop PseudoDistributed Mode 伪分布式
  • 个人职业规划
  • Linux | 如何保持 SSH 会话处于活动状态
  • 树结构及其算法-二叉树节点的插入
  • JVM 分代垃圾回收过程
  • 【C++】 常对象与常函数
  • Elasticsearch 集群分片出现 unassigned 其中一种原因详细还原
  • Java调用HTTPS接口,绕过SSL认证
  • 前端小技巧: TS实现数组转树,树转数组
  • 谷歌动态搜索广告被滥用引发恶意软件泛滥
  • C语言实现 1.在一个二维数组中形成 n 阶矩阵,2.去掉靠边元素,生成新的 n-2 阶矩阵;3.求矩阵主对角线下元素之和:4.以方阵形式输出数组。
  • 我在Vscode学OpenCV 处理图像
  • 【python】路径管理+路径拼接问题
  • C现代方法(第16章)笔记——结构、联合和枚举