一、RV1126编码的流程图
二、每个代码模块详细讲解:
2.1. VI模块的创建如图下:
VI模块的初始化:关键在于VI_CHN_ATTR_S结构体,这个结构体是VI设置的结构体。这个结构体的成员变量包括:pcVideoNode(video节点路径)、u32BufCnt(VI捕获视频缓冲区计数)、u32Width(分辨率宽度)、u32Height(分辨率高度)、 enPixFmt(VI格式)、enBufType(映射类型默认是:MMAP)、enWorkMode(VI通道模式)等成员变量。设置完成之后,则使用RK_MPI_VI_SetChnAttr进行设置VI操作,设置完成之后使用RK_MPI_VI_EnableChn使能VI层。
2.2. VENC模块的初始化:
VENC的初始化:关键在于VENC_CHN_ATTR_S结构体,这个结构体是VENC设置的结构体。这个结构体包含以下成员变量:enType(编码类型)、enRcMode()、u32Gop(关键帧间隔)、u32Bitrate(编码码率)、u32SrcFrameRateDen(原始帧率分母)、u32SrcFrameRateNum(目标帧率分子)、 fr32DstFrameRateNum(目标帧率分母)、 fr32DstFrameRateDen(目标帧率分子)、 imageType(流格式)、u32PicWidth(分辨率长度)、u32PicHeight(分辨率高度)、u32VirWidth(分辨率虚长度)、u32VirHeight(分辨率虚高度)、u32Profile(编码等级)。
设置完上述成员变量后,则使用RK_MPI_VENC_CreateChn创建编码层。
2.3. 绑定VI和VENC模块:
设置完VI模块和VENC模块后,需要进行绑定VI和VENC才能够正常采集到编码数据。采集的时候用到的结构体·MPP_CHN_S,其中MPP_CHN_S的enModId是模块的ID、 s32ChnId是通道id。 这里分别创建两个MPP_CHN_S结构体,一个是VI的MPP_CHN_S,它的enModId选择的是RK_ID_VI,s32Id应该和VI创建的ID进行适配;另外一个则是VENC的MPP_CHN_S,它的enModId选择的是RK_ID_VENC,s32ChnId和VENC创建的Id对应。创建完两个MPP_CHN_S结构体后,利用RK_MPI_SYS_BIND把VI和VENC进行绑定。
2.4. 创建线程采集VENC数据
从collect_venc_thread线程主要作用是获取VENC编码的码流数据,并实时保存到H264文件。在这个线程里面,有几个重要的API需要讲解:RK_MPI_SYS_GetMediaBuffer的作用是获取对应通道的数据,这个API第一个参数是模块ID,第二个参数是通道ID,第三个参数阻塞时间这里默认是-1不阻塞。获取VENC通道的数据后,这其中RK_MPI_MB_GetPtr是获取VENC缓冲区数据,RK_MPI_MB_GetSize是获取VENC的缓冲区长度,并把缓冲区数据fwrite写到H264文件。