多线程获取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模块
设置使能