1.高分辨率通过camera_venc_thread线程获取高分辨率(1920 * 1080)的编码码流数据并且把编码码流插入到高分辨率编码码流队列里面。上图就是camera_venc_thread线程获取高分辨率编码码流的大体流程我们要从VI节点容器和VENC节点容器里面获取到对应的VI节点和VENC节点然后调用RK_MPI_SYS_Bind这个API绑定VI节点和VENC节点。然后创建camera_venc_thread线程获取高分辨率VENC码流然后入到HIGH_VIDEO_QUEUE队列。这部分代码的实现在rkmedia_assignment_manage.cpp和rkmedia_data_process.cpp这两个源文件里面。2.camera_venc_thread线程的思维导图上图是获取1920 * 1080视频编码数据的思维导图整个流程最关键是get_vi_container获取VI节点get_venc_container获取VENC节点然后调用RK_SYS_MPI_Bind绑定VI和VENC节点并启动camera_venc_thread线程获取编码数据赋值到video_data_packet_t结构体然后入队列。3.camera_venc_thread代码截图并讲解上面三个图就是关于camera_venc_thread整个流程我们首先要通过get_vi_container从VI容器里面获取到VI节点然后再调用get_venc_container从venc容器里面获取venc节点。利用RK_MPI_SYS_Bind把VI节点和VENC节点绑定起来绑定起来后创建camera_venc_thread线程从这个线程里面获取1920 * 1080的编码码流数据。调用的API是RK_MPI_SYS_GetMediaBufferMOD_ID是RK_ID_VENC, CHN_ID是创建的VENC的CHNID来直接获取高分辨率的VENC码流数据并且把数据拷贝到video_data_packet_t结构体包括每一帧的视频流数据RK_MPI_GetPtr(mb)还有每一帧的视频长度RK_MPI_GetSize(mb)。然后把整个video_data_packet包入队high_video_queue-putVideoPacketQueue里面。video_data_packet_t结构体里面有两个成员变量一个是buffer(视频缓冲区)、video_frame_size是每一帧视频的长度frame_flag关键帧标识符。下面是RKMEDIA_BUFFER赋值到VIDEO_DATA_PACKET_T的核心代码memcpy(video_data_packet-buffer, RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb));video_data_packet-video_frame_size RK_MPI_MB_GetSize(mb);4.低分辨率本章节主要介绍如何通过get_rga_thread线程和low_camera_venc_thread共同获取低分辨率(1280 * 720)的编码码流并且入队列。从上图我们可以看出。我们经过几个步骤首先要调用get_vi_container获取VI节点然后把VI节点和RGA节点绑定起来通过get_rga_thread线程获取1280 * 720的原始数据并把1280 * 720的原始数据发送到1280 * 720的VENC低分辨率编码器。5.低分辨率码流获取的思维导图上图是获取低分辨率1280 * 720编码码流的思维导图从上面的思维导图可以看出来整个流程最关键是get_vi_container获取VI节点然后调用RK_SYS_MPI_Bind绑定VI和RGA节点。然后创建get_rga_thread线程获取每一帧rga的1280 * 720的视频原始数据调用的API是RK_MPI_SYS_GetMediaBuffer获取每一帧1280 * 720原始数据后再调用RK_MPI_SYS_SendMediaBuffer发送每一帧原始数据到1280 * 720的VENC编码器。创建low_camera_venc_thread线程获取每一帧1280 * 720的编码码流数据调用的API是RK_MPI_SYS_GetMediaBuffer。获取完每一帧1280 * 720编码视频数据后存放到low_video_queue里面调用的函数是putVideoPacketQueue。6.代码架构截图并讲解上面的截图就是如何通过get_rga_thread和low_camera_thread线程的结合获取低分辨率(1280 * 720)的编码码流。首先要通过RGA的节点和VENC的节点进行RK_SYS_MPI_Bind绑定然后开启get_rga_thread获取每一帧的RGA处理过后的1280 * 720原始数据并且调用RK_MPI_SYS_SendMediaBuffer这个API把每一帧1280 * 720的原始数据发送到低分辨率的编码器里面核心代码如下。while (1){mb RK_MPI_SYS_GetMediaBuffer(RK_ID_RGA, 0 , -1); //获取每一帧RGA处理过后的数据if(!mb){break;}RK_MPI_SYS_SendMediaBuffer(RK_ID_VENC, 1, mb); //把每一帧RGA数据传输到低分辨率VENC里面RK_MPI_MB_ReleaseBuffer(mb); //释放资源}然后再创建low_camera_thread现成获取每一帧1280 * 720的编码视频数据然后把每一帧低分辨率的编码数据赋值到video_data_packet_t结构体,包括每一帧的视频流数据RK_MPI_GetPtr(mb)还有每一帧的视频长度RK_MPI_GetSize(mb)。然后把整个video_data_packet包入队low_video_queue-putVideoPacketQueue里面。video_data_packet_t结构体里面有两个成员变量一个是buffer(视频缓冲区)、video_frame_size是每一帧视频的长度frame_flag关键帧标识符。下面是RKMEDIABUFFER赋值到VIDEO_DATA_PACKET_T的核心代码memcpy(video_data_packet-buffer, RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb));video_data_packet-video_frame_size RK_MPI_MB_GetSize(mb);