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

多线程获取VI模块的YUV数据

一.RV1126 VI模块采集摄像头YUV数据的流程

step1:VI模块初始化

step2:启动VI模块工作

step3:开启多线程采集VI数据并保存

1.1初始化VI模块:

VI模块的初始化实际上就是对VI_CHN_ATTR_S的参数进行设置、然后调用RK_MPI_VI_SetChnAttr设置VI模块并使能RK_MPI_VI_EnableChn

RK_MPI_VI_SetChnAttr

设置VI通道属性

RK_MPI_VI_SetChnAttr(VI_PIPE ViPipe, VI_CHN ViChn, const VI_CHN_ATTR_S *pstChnAttr);

参数名称                                描述                                                                                输入/输出
ViPipe                                 VI 管道号。                                                                            输入
ViChn                                 VI 通道号。取值范围:[0, VI_MAX_CHN_NUM)。                输入
pstChnAttr                          VI 通道属性结构体指针。                                                       输入

 返回值描述
0 成功。非0 失败,其值参见错误码。
【需求】
头文件:rkmedia_api.h
库文件:libeasymedia.so

【注意】
若被设置的通道已通过RK_MPI_SYS_Bind与其他通道绑定,则需在使用该函数设置前通过
RK_MPI_SYS_UnBind进行解绑。
若被设置的通道已使用RK_MPI_VI_EnableChn使能,则需在使用该函数设置前通过
RK_MPI_VI_DisableChn 关闭该通道。

1.2启动VI模块:

设置完上面的VI模块后,就要开启VI模块的工作,使用的API是RK_MPI_VI_StartStream

RK_MPI_VI_StartStream

启动视频流。

RK_S32 RK_MPI_VI_StartStream(VI_PIPE ViPipe, VI_CHN ViChn);

参数名称            描述                                                                                            输入/输出
ViPipe               VI 管道号。                                                                                     输入
ViChn               VI 通道号。取值范围:[0, VI_MAX_CHN_NUM)。                         输入

返回值描述
0 成功。
非0 失败,其值参见错误码。

【需求】
头文件:rkmedia_api.h
库文件:libeasymedia.so

1.3使用多线程的方式去采集:

开启一个线程去采集每一帧VI模块的数据,使用的API是RK_MPI_SYS_GetMediaBuffer这个API的具体作用是获取指定通道中的数据,具体的定义如下:

enModID:模块号ID,模块号指的是目前使用的是哪个模块如:VI模块(RK_ID_VI)、VENC模块(RK_ID_VENC)

s32ChnID:通道号ID,这里的通道号跟初始化通道的ID号一致。

S32MilliSec:默认是-1,阻塞状态。

注意:RK_MPI_SYS_GetMediaBuffer获取的数据是一个整体的数据,换言之这个数据包含了缓冲区指针和缓冲区大小。如下图:

拿到整体数据后,我们就要对整体数据进行分割操作。所谓的分割操作,就是要获取整体数据里面的缓冲区指针缓冲区大小。那具体的我们来看看下面的API是怎么获取到它的具体数据。

缓冲区指针的获取:

RK_MPI_MB_GetPtr就是获取每一帧的具体指针,也就是我们每一帧数据。

缓冲区长度的获取

RK_MPI_MB_GetSize就是获取每一帧数据的长度。

获取完具体的缓冲区数据和缓冲区大小之后,就开始写入文件。写入文件的操作就是fwrite就可以写入。

二.代码的实战

初始VI模块

设置使能

启动VI模块

开启多线程处理

相关文章:

  • ISP(Image Signal Processor)处理流程及不同域划分
  • 【计算机视觉】OpenCV实战项目:Deep Machine Learning Tutors:基于OpenCV的实时面部识别系统深度解析
  • Flink 运维监控与指标采集实战
  • 【前端】每日一道面试题3:如何实现一个基于CSS Grid的12列自适应布局?
  • Spring循环依赖问题
  • 单脉冲前视成像多目标分辨算法——论文阅读
  • 管道-验证和转换
  • 【Linux】冯诺依曼体系结构和操作系统的理解
  • 23、DeepSeekMath论文笔记(GRPO)
  • 【桌面】【输入法】常见问题汇总
  • 高精度之加减乘除之多解总结(加与减篇)
  • 【软件工程】基于频谱的缺陷定位
  • C++学习-入门到精通-【6】指针
  • SSM框架整合MyBatis-Plus的步骤和简单用法示例
  • 助力你的Neovim!轻松管理开发工具的魔法包管理器来了!
  • C# 参数
  • 判断点是否在立方体内
  • 贪心算法专题(Part1)
  • DeepSeek 实现趣味心理测试应用开发教程
  • 【CF】Day56——Codeforces Round 940 (Div. 2) and CodeCraft-23 BCD
  • 快评|印巴为何停火?已达成“一场胜利,各自表述”的效果
  • 综艺还有怎样的新可能?挖掘小众文化领域
  • 外交部发言人就印巴局势升级答记者问
  • 2025年4月份CPI环比由降转涨,核心CPI涨幅稳定
  • 赵作海因病离世,妻子李素兰希望过平静生活
  • 71岁导演詹姆斯・弗雷病逝,曾执导《纸牌屋》、麦当娜MV