- 项目介绍:
本章节讲的是RV1126视频编码的流程,在整个项目之中视频编码功能是核心之一。视频编码流程主要分三步:VI的初始化、VENC的初始化、绑定VI和VENC节点、开启VENC线程进行视频编码的采集
- 项目框图:
2.1. VI设备的初始化
容器的使用增加代码的解耦性。
其中else部分的set_vi_container将*vi_container放进all_containers.vi_containers[index]中,然后2.3中的get_vi_container将*vi_container提取出来
VI设备的初始化,需要用到以下参数:pcVideoNode(设备节点)、u32Width(宽度)、u32Height(高度)、enPixFmt(图片格式)、u32BufCnt(buf的数量)、enWorkMode(工作模式)。设置完成之后,则调用RK_MPI_VI_SetChnAttr设置VI的属性,并使能VI设备(RK_MPI_VI_EnableChn)
RV1126视频设备节点:
2.2. VENC模块的初始化
容器的使用增加代码的解耦性。
其中else部分的set_venc_container将*venc_container放进all_containers.venc_containers[index]中,然后2.3中的get_venc_container将*vi_container提取出来
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是通道号。
2.4. 开启VENC线程采集每一帧视频编码数据并存储到视频队列
在这个video_venc_thread线程里面,利用RK_MPI_SYS_GetMediaBuffer的API采集VENC的数据,并把数据赋值到video_data_packet_t结构体里面(这个结构体里面主要存储编码后视频的缓冲区数据和长度)。并且把这个结构体的数据入到video_packet_queue队列里面(具体操作:putVideoPacketQueue)