发布时间:2026/8/29 17:52:37
音视频开发项目-3RKMedia 三大模块初始化 3. RKMedia 三大模块初始化VI / VENC / RGA这一篇讲rkmedia_module_function.cpp里的init_rkmedia_module_function()。这个函数是整个硬件侧的配置中心分辨率、帧率、码率、图像格式所有关键参数集中在这一个文件——集中配置是我刻意做的设计调参不用满项目找。一、先看全貌这个函数按顺序干五件事1. RK_MPI_SYS_Init() 系统级初始化 2. rkmedia_vi_init() 配置 VI视频输入 3. rkmedia_venc_init() 配置 VENC 01080P 高清编码 4. RGA 通道创建 配置 RGA硬件缩放器 5. rkmedia_venc_init() 配置 VENC 1720P 低清编码对应的数据通路就是开篇那张图VI 出 1080P一路直接进 VENC 0 编码另一路进 RGA 缩成 720P 再进 VENC 1。为什么把参数配置和 API 调用拆成两层rkmedia_module_function.cpp只填业务参数rkmedia_module.cpp只封装 RK_MPI 调用。以后换参数改前者换 SDK 版本改后者互不纠缠。二、VI视频输入RV1126_VI_CONFIG rkmedia_vi_config;memset(rkmedia_vi_config,0,sizeof(rkmedia_vi_config));rkmedia_vi_config.id0;rkmedia_vi_config.attr.pcVideoNodeCMOS_DEVICE_NAME;// rkispp_scale0rkmedia_vi_config.attr.u32BufCnt3;// 缓冲区个数rkmedia_vi_config.attr.u32Width1920;rkmedia_vi_config.attr.u32Height1080;rkmedia_vi_config.attr.enPixFmtIMAGE_TYPE_NV12;rkmedia_vi_config.attr.enBufTypeVI_CHN_BUF_TYPE_MMAP;rkmedia_vi_config.attr.enWorkModeVI_WORK_MODE_NORMAL;intretrkmedia_vi_init(rkmedia_vi_config);参数逐个说设计考量pcVideoNode rkispp_scale0V4L2 视频设备节点。RV1126 的 ISP 在/dev/下暴露多个节点scale0、scale1、scale2…不同节点出不同分辨率的图。scale0 是全尺寸的所以拿它当源——低清路反正有 RGA 在后面缩源头必须给最好的。节点名做成宏放在rkmedia_config_public.h#define CMOS_DEVICE_NAME rkispp_scale0换板子只改一处。u32BufCnt 3VI 驱动准备 3 个缓冲区轮转——一个在采集、一个在处理、一个排队采集和处理永不互相等待。3 是经验下限再少容易在偶发抖动时丢帧。IMAGE_TYPE_NV12YUV420SP 格式。RK 平台的 RGA 和硬件编码器都原生吃 NV12所以从采集到缩放到编码全程 NV12中间零格式转换、零 CPU 开销——这是全链路设计里最省心的一环。先 memset 再填结构体清零后只覆盖关心的字段其余字段天然是安全默认值不靠栈上的运气。底层封装在rkmedia_module.cpp就两步retRK_MPI_VI_SetChnAttr(CAMERA_ID,id,vi_attr);// 设属性ret|RK_MPI_VI_EnableChn(CAMERA_ID,id);// 使能通道RKMedia 的 API 命名规律就是这个RK_MPI_模块_动作。Set 完属性必须 Enable 通道才真正工作VENC 用的则是 Create创建即工作。成功之后还有一步RV1126_VI_CONTAINTER vi_container;vi_container.id0;vi_container.vi_idrkmedia_vi_config.id;set_vi_container(0,vi_container);// 存进容器VI 通道号被登记到一个全局容器里后面绑定时从容器里取。为什么多这一层把通道号的管理和业务流程分开业务代码不写死通道号只说我要 0 号业务实际通道号由容器解析。现在单任务场景下通道号恰好是 0 和 1但等将来多 assignment 并存、通道号动态分配时业务代码一行都不用改。容器实现在rkmedia_container.cpp带互斥锁的全局数组线程安全。三、VENC 01080P 高清编码通道RV1126_VENC_CONFIG rkmedia_venc_config{0};rkmedia_venc_config.id0;rkmedia_venc_config.attr.stVencAttr.enTypeRK_CODEC_TYPE_H264;rkmedia_venc_config.attr.stVencAttr.imageTypeIMAGE_TYPE_NV12;rkmedia_venc_config.attr.stVencAttr.u32PicWidth1920;rkmedia_venc_config.attr.stVencAttr.u32PicHeight1080;rkmedia_venc_config.attr.stVencAttr.u32VirWidth1920;rkmedia_venc_config.attr.stVencAttr.u32VirHeight1080;rkmedia_venc_config.attr.stVencAttr.u32Profile66;几个值得说的设计决策u32VirWidth / u32VirHeight虚宽高虚拟宽高是一行实际占的字节数物理宽高是画面有效区域。带对齐要求的硬件上两者可能不等某些平台要求 16/32 对齐画面 1080 高要填 1088。RV1126 上两者一致但我还是显式把两个字段都填上——不留给编译器猜的余地以后排查对齐问题也一目了然。u32Profile 66H264 的 profile 编号66 Baseline。直播场景我选 Baseline 是经过权衡的压缩率让位于解码兼容性和低延迟——Baseline 没有帧间双向预测低端手机、老款电视盒子都能流畅解解码缓冲也小。接着是码率控制rkmedia_venc_config.attr.stRcAttr.enRcModeVENC_RC_MODE_H264CBR;rkmedia_venc_config.attr.stRcAttr.stH264Cbr.u32Gop25;rkmedia_venc_config.attr.stRcAttr.stH264Cbr.u32BitRate1920*1080*3;rkmedia_venc_config.attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen1;rkmedia_venc_config.attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum25;rkmedia_venc_config.attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen1;rkmedia_venc_config.attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum25;整理成表参数值设计考量enRcModeH264CBR恒定码率。直播的标配带宽可预测瞬时波动小服务端好做分发u32Gop25关键帧间隔 25 帧 每 1 秒一个 IDR25fps 下。GOP fps 是我定的一般原则u32BitRate1920×1080×3 ≈ 6.2 Mbps码率公式宽×高×31080P 直播 4~8Mbps 区间的稳妥取值Src/DstFrameRate25/1源帧率和目标帧率一致不做抽帧/倍帧保持节奏纯净为什么 GOP 25一秒一个关键帧观众点开直播解码器必须从一个 IDR 帧起步——最坏情况下要等一个 GOP 的时长才能出画面。GOP 1 秒意味着最多等 1 秒这是直播首屏延迟和带宽开销的甜点再小关键帧太密码率白白上涨再大观众进直播间就是黑屏干等。帧率字段的填法提醒一下自己Den 位置填 1、Num 位置填 25和直觉相反照 SDK 注释来。底层就一个调用retRK_MPI_VENC_CreateChn(rv1126_venc_config-id,venc_chn_attr);四、RGA硬件缩放器低清路的关键RGA 这段是输入 1080P、输出 720P 的配置RGA_ATTR_S rga_info;/* 输入跟 VI 出图一致 */rga_info.stImgIn.u32Width1920;rga_info.stImgIn.u32Height1080;rga_info.stImgIn.imgTypeIMAGE_TYPE_NV12;/* 输出720P */rga_info.stImgOut.u32Width1280;rga_info.stImgOut.u32Height720;rga_info.stImgOut.imgTypeIMAGE_TYPE_NV12;/* 公共参数 */rga_info.u16BufPoolCnt3;rga_info.u16Rotaion0;rga_info.enFlipRGA_FLIP_H;// 水平镜像rga_info.bEnBufPoolRK_TRUE;retRK_MPI_RGA_CreateChn(0,rga_info);两个设计决策缩放交给 RGA 而不是 CPU。RGA 是独立硬件单元缩放、旋转、镜像、格式转换都不占 CPU。1080P→720P 每秒 25 帧 300 万像素的活软件做 CPU 直接吃穿硬件做零成本——能用专用硬件的地方绝不用通用算力这是嵌入式设计的第一原则。enFlip RGA_FLIP_H水平镜像。摄像头安装朝向决定了出图是镜像的硬件开关顺手打开成本为零。顺带一提u16Rotaion的拼写是 Rockchip 头文件就这么写的少个 t用 API 时照抄别好心纠正。五、VENC 1720P 低清编码通道和 VENC 0 结构一样参数按低清定位调整参数VENC 0高清VENC 1低清考量分辨率1920×10801280×720两档清晰度码率≈ 6.2Mbps≈ 2.8Mbps低清路码率预算本来就小GOP2530低清路码率预算紧GOP 略拉大省关键帧开销低清观众对首屏延迟相对不敏感多等 0.2 秒换带宽通道号 id01—两路参数的差异不是随手填的码率、GOP 都跟着这一路流的目标观众走。高清路给追求体验的观众GOP 紧凑、码率给足低清路给弱网观众一切从省。六、这一篇的设计要点参数配置与 API 封装分层集中配置便于调参NV12 全链路贯通采集、缩放、编码一个格式走到底零转换编码参数的经验值1080P 直播 ≈ 宽×高×3 的码率、GOP fps1 秒一个关键帧、Baseline profile容器层解耦通道号管理为多任务预留能用硬件的绝不用 CPURGA 缩放、VENC 编码下一篇模块都建好了怎么把它们接起来RK_MPI_SYS_Bind和五个工作线程的诞生。本篇对应源码rkmedia_module_function.cpp、rkmedia_module.cpp、rkmedia_config_public.h

相关新闻

2026/8/29 17:52:37

JVM面试高频考点全解析:从内存模型到线上调优实战

面试问到JVM,最怕的不是你不会,而是你明明背了一堆八股文,却答不到面试官的心趴上。这些年我面过不少候选人,也带过不少新人,发现一个规律:凡是能把JVM讲出“为什么”的人,基本都能扛住后面的压…

2026/8/29 17:52:37

STM32U5 RDP降级机制解析:OEM Key实现安全可恢复读保护

1. 为什么高级别读保护也需要一扇“可恢复之门”1.1 从一次返工事故说起去年做某款工业采集设备,板子已经小批量量产,固件里按客户要求开了最高等级读保护。结果现场反馈一批设备需要校准参数回读,生产端又想把调试口重新打开做批量校准。当时…

2026/8/29 17:47:37

STM32调试连不上?No STM32 target found报错排查与救砖指南

搞STM32开发的人,十有八九都见过“No STM32 target found”这句报错。它就像嵌入式世界的红灯,一亮起来,Keil、IAR、STM32CubeProgrammer全都不认你的芯片,程序烧不进去,调试器也连不上。第一次遇到的人很容易慌&#…

2026/8/29 18:07:37

鞋服行业 AI 视觉质检:从概念试点到工厂落地的机遇、挑战与趋势

一、核心机遇维度机遇描述典型场景受益对象行业刚需人力缺口驱动替换,AI 可 724 小时稳定作业、统一判定标准人工质检线疲劳漏检、质检员流失头部品牌、大型鞋服集群应用空间从坯布验布延伸到裁片、成衣、制鞋、辅料多环节面料疵点、印花偏移、缝线缺陷、Logo 定位全…

2026/8/29 18:07:37

移动端App发布自动化:从手工流程到一键流水线

一到发版日,团队里就会不自觉地弥漫一种紧张感:客户端开发盯着打包进度条,测试在旧包和新包之间来回切换,运营在群里一遍遍确认应用商店后台的审核状态——明明只是一次普通的 App 发布,却常常从早忙到晚,还…

2026/8/29 18:07:37

HoRain云--CSS margin(外边距)

CSS margin(外边距)属性定义元素周围的空间。 margin margin 清除周围的(外边框)元素区域。margin 没有背景颜色,是完全透明的。 margin 可以单独改变元素的上,下,左,右边距,也可以一次改变所…

2026/8/29 18:07:37

本地大模型部署实战:从Ollama量化到私有知识库

目前在技术社区里面,“本地大模型(Local LLMs)”已经成了一个绕不开的话题。很多人不再满足于只调用云端 API,而是希望在自己电脑、公司内网或服务器上直接跑一个开源模型,既能保护数据,又能按业务需求自由…

2026/8/29 18:07:37

HoRain云--Node.js模块系统

Node.js 模块系统是其核心功能之一,它允许开发者将代码组织成小的、可重用的单元,这些单元被称为模块。模块是一个封装了特定功能的独立文件,可以在其他文件中引入和使用。Node.js 的模块系统是构建 Node.js 应用程序的重要基础,使…

2026/8/29 18:02:37

cadence快捷键如何添加?cadence快捷键设置?

快捷键如何设置 1、找到安装cadence的SPB_DATA/env路径; 2、在图中位置Env中复制添加funckey快捷键命令; 3、最后关闭allegro pcb,重新打开即可。 快捷键命令 Env中funckey快捷键命令: 命令格式:funckey 快…

2026/8/28 16:16:17

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/28 16:16:21

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/28 16:16:22

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/29 0:01:10

etc目录下的profile.d文件目录设置环境变量和全局脚本shell

一、设置环境变量etc目录下的profile.d文件目录 /etc/profile.d1、编写 vi test.sh文件内容# jdk变量 export ZHK_HOME/root export PATH$PATH:$ZHK_HOME/test # 可以取出来ZHK_HOME变量给ZZZ_HOME赋值 export ZZZ_HOME${ZHK_HOME}/test2、刷新 执行source /etc/profile 命令使…

2026/8/29 0:01:10

【JavaScript】内存管理-垃圾回收机制-内存泄露

内存管理 C 语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()。 而 JavaScript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。释放的过程称为垃圾回收。 整…

2026/8/29 0:01:10

Labgrid-MCP:为嵌入式硬件实验室接入AI Agent操控能力

Labgrid-MCP 的目标是把 MCP(Model Context Protocol)能力延伸到真实嵌入式硬件实验室:AI Agent 通过一个标准化的 MCP Server,就能查看目标板状态、控制上电断电、复位开发板、读取串口日志,甚至执行镜像刷写。对于经…

2026/8/28 16:16:48

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/28 16:16:50

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/28 11:06:45

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…