- 项目介绍:
本章节讲的是RV1126通过VI模块和VENC的绑定获取VENC码流。视频编码流程主要分三步:VI的初始化、VENC的初始化、绑定VI和VENC节点、开启VENC线程进行视频编码的采集。
- VI和VENC的流程图:
2.1. VI设备的初始化
VI设备的初始化,需要用到以下参数:pcVideoNode(设备节点)、u32Width(宽度)、u32Height(高度)、enPixFmt(图片格式)、u32BufCnt(buf的数量)、enWorkMode(工作模式)。设置完成之后,则调用RK_MPI_VI_SetChnAttr设置VI的属性,并使能VI设备(RK_MPI_VI_EnableChn)
RV1126视频设备节点:
2.2. VENC模块的初始化
VENC模块的初始化,下面有几个重要参数:enType(编码类型)、imageType(图片格式)、u32VirWidth(图片虚宽)、u32VirHeight(图片虚高)、u32Profile(编码等级)、bByFrame(预留参数默认0)****、u32PicWidth(图片宽度)、u32PicHeight(图片高度)、enRotation(是否旋转)。设置完成之后,使用RK_MPI_VENC_CreateChn创建VENC编码器。
2.3. 绑定VI和VENC节点
使用RK_MPI_SYS_Bind把VI节点和VENC进行绑定,其中enModId是模块ID号、s32ChnId是通道号。VI_CHN的enModId是RK_ID_VI,通道ID则是从VI_CONTAINER容器获取。
VENC_CHN的enModId是RK_ID_VENC,通道ID则是从VENC_CONTAINER容器获取
2.4. 开启VENC线程采集每一帧视频编码数据并存储到视频队列
在这个camera_venc_thread线程里面,利用RK_MPI_SYS_GetMediaBuffer的API采集VENC的数据,并把数据赋值到video_data_packet_t结构体里面(这个结构体里面主要存储编码后视频的缓冲区数据和长度)。并且把这个结构体的数据入到video_packet_queue队列里面(具体操作:putVideoPacketQueue)。
注意:RK_MPI_SYS_GetMediaBuffer只是拿到一个整体的缓冲区数据,这个缓冲区数据包含缓冲区指针数据和缓冲区长度。如果我们需要真正获取缓冲区指针的数据,就要用RK_MPI_MB_GetPtr去获取。若要拿到缓冲区长度则需要调用RK_MPI_MB_GetSize去获取。