一、RKMedia框架介绍
上图中的MPP组件就是瑞芯微根据自家芯片中的硬件编解码器开发的一个应用程序,也就是一个视频编解码以及视频处理库,在SDK目录下,可以找到MPP目录。
上图RKMedia对MPP进行封装,功能集是MPP的子集。
MPP支持:H.263/H.264/H.265/VP8/VP9/MPEG等
RKMedia仅支持:H.264/H.265/JPEG/MJPEG 4种
RGA组件:在SDK目录下,可以找到 RGA组件目录,独立2D硬件加速器,用于加速点和线的绘制,对图像进行拷贝、旋转、翻转、缩放、裁剪、合成,格式转换等一些二维图像操作;上图中的RGA模块是RKMedia对RGA组件封装,功能是RGA组件的部分。
RGA组件库搜索方式如下,完整功能需直接调用librga.so动态库:
图中的ISP、ISPP是RV1126的ISP20中的模块,ISP20主要是用于对摄像头的sensor采集到的RAW图像进行优化。
图中DRM是LINUX下的主流显示框架。
二、视频处理流程
原始数据获取:摄像头传感器将光线信号转化为电信号,记录接收到的各种光的光照强度。
拜耳格式定义:原始数据称为拜耳格式的原始图像(Bayer raw),是传感器捕捉到的最原始的数字信号数据。
数据处理必要性:由于屏幕不能直接显示拜耳格式图像,需要经过ISP处理才能正常显示。
ISP20对拜耳格式原始图像进行算法处理,输出NV12/YUV等色彩空间域图像。
RKAIq将优化图像的算法参数传递给ISP20硬件,ISP20硬件根据传递的算法参数来优化图像质量,RKAI也会获取iq文件,iq文件包含优化图像所需的算法参数,iq文件参数质量直接影响ISP20硬件优化图像效果,(IQ文件参数调试需要专业工程师完成)。
ISP20优化好RAW数据后,就可以从video节点输出初步优化好的图像或者说输出数据流(在视频领域称为"码流")。
码流从video节点输出有4条路径。RKMedia的VI模块可以从四路输出获取码流。
后面RKMedia对图像进行二次处理,RKMdeia常见处理图像旋转(通过RGA模块实现180度旋转)分辨率调整(如1080p→720p缩放)格式转换(如YUV→RGB格式转换),与ISP区别:ISP20进行基础优化处理,RKMedia根据需求进行应用级处理。
VI模块通过ISPP的四路视频输出节点获取数据流---------->>直接显示:获取数据后可直接传输给VO模块进行屏幕显示。
VI模块获取数据流(码流)通过RGA模块,在经过RKNPU进行AI模型的推理(RKNPU中RockX组件可以跑很多AI算法)。
VI模块获取数据流(码流)通过RGA模块,可以再通过MPP中的VENC模块进行压缩编码。
VI模块获取数据流(码流)不通过RGA模块,直接经过MPP中的VENC模块进行压缩编码。
OSD功能:在视频上叠加文字/图形(如时间戳显示)
如果要对视频进行处理,完全可以使用MPP、ISP、RGA等组件来完成,为什么AI历程用的是瑞芯微提供的RKMedia来做的?
因为学习音视频的采集和处理避免直接学习MPP、ISP、RGA、DRM等复杂底层组件;通过调用RKMedia的封装好的接口可以快速实现视频采集、处理和显示。使用RKMedia降低了开发难度。
学习RKMedia方法:查看文档+SDK中rkmedia中的examples开发历程。
SDK下文档位置:
可执行文件路径:
- SDK下的buildroot/output/alientek_rv1126/oem/usr/bin/
- 开发板路径:/oem/usr/bin/
三、编译和测试SDK中自带RKMedia例程
编译流程:
若是修改SDK下的源代码例程:
测试特定例程时,可在开发板终端命令后添加"--help"参数查看使用说明,例如:rkmedia_vi_vo_test --help。
- 工作原理:
- 摄像头传感器输出原始RAW数据,RAW数据图像质量欠佳,无法满足视觉效果,需要经过ISP处理
- RKAIQ是ISP的一部分,RKAIQ模块使用IQ文件(xml文件)中的参数进行图像质量调整
- 经过ISP处理后输出满足视觉效果的图像
- 最后通过RGA模块进行旋转/缩放等操作后显示
- 重要说明:
- 在RV1126上使用IMX335和IX415摄像头,需要通过RKMedia来调用,不能使用ffmpeg,因为摄像头输出的是最原始的RAW数据
- IQ文件由专业调试工具生成,需要IQ tuning工程师进行调试
摄像头应用会占用摄像头也会占用ISP,mediaserver是一个多媒体服务,主要用于ipc应用开发,就是一个摄像头应用在抓取图片之前要关闭这个应用,其实RV1126硬件的出厂系统是已经默认关闭了这个摄像头应用的。
四、RKMedia视频处理模块精讲
RKMedia的RGA模块基于RGA组件封装,但功能更少,opencv也可以对图像进行处理,一般使用RKMedia或者RGA组件实现,因为RKMedia或者RGA组件是RV1126平台适配的组件,内部是基于MPP实现,RV1126支持硬件编解码加速,软解(CPU处理) vs 硬解加速(MPP封装),基本图像处理(色彩空间转换、旋转缩放等)一般不用opencv。
4.1 RKMedia初始化
摄像头的接口/摄像头ID,0表示MPI CSI0,1表示MIPI CSI1。由底层驱动决定,单摄像头默认为0,双摄像头需区分0和1。
4.3 RGA组件
4.3.1 认识RGA组件
RGA模块是RKMedia对RGA组件封装,我们先了解RGA组件后在了解RGA模块
查询RGA组件动态库位置和版本号:
- 最小图像尺寸:2×2像素
- 最大源图像尺寸:8192×8192像素
- 最大目标图像尺寸:4096×4096像素
- 实际应用建议:
- 在rk media的rga模块中,NV12格式的width stride配置为能被2整除即可工作
- 但为保障稳定性,建议严格遵循4对齐的要求
- 对齐原理:硬件为快速访问内存首地址或跨行访问数据,为了保证硬件利用率,要求内存地址或跨度为对齐系数的倍数
4.3.2 RGA组件的demo编译
如果已经编译过整个SDK或buildroot文件系统,demo会自动编译到output的build目录下: