当前位置: 首页 > 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模块

开启多线程处理

http://www.xdnf.cn/news/383401.html

相关文章:

  • 21、DeepSeekMath论文笔记(GRPO)
  • 十七、统一建模语言 UML
  • Win11安装APK方法详解
  • Trex -用 Python生成特定的流量模式
  • C++:this指针
  • CMake 入门实践
  • 牛客练习赛138
  • 8.5 表格进阶
  • (四)毛子整洁架构(Presentation层/Authentiacation)
  • 批量修改json文件中的标签
  • 【MCAL】TC397+EB-tresos之I2c配置实战(同步、异步)
  • 2025年客运从业资格证备考单选练习题
  • Wallcraft 3.53.0 | 提供高质量动态4D壁纸,解锁高级版,无广告干扰
  • 《Python星球日记》 第50天:深度学习概述与环境搭建
  • 数据治理框架在企业中的落地:从理念到实践
  • OSPF案例
  • 完整进行一次共线性分析
  • Java代理
  • Android开发-图像显示
  • 如何通过合法数据变现实现收入增长
  • LVGL对象的盒子模型和样式
  • Arduino 开源按键库大合集(单击/双击/长按实现)
  • VB与Excel无缝连接实现指南
  • 编译后的js文件如何跟进调试
  • OpenAI的商业化之路:从非营利到盈利的转型
  • IC ATE集成电路测试学习——开尔文连接
  • 最速下降法和梯度下降法的异同
  • python基础(十一)-逻辑运算符
  • nextjs 部署失败:cause: Error: unable to verify the first certificate
  • C语言加餐--一些关键字