二:RV1126的VDEC视频解码模块的工作流程
这个VDEC应该可以说是整个项目最核心的东西了,要接受远端摄像头传来的一个数据进行解码,然后进行渲染。
VDEC的作用和原理:
VDEC指的是视频解码模块,它主要是处理视频压缩数据如H264/H265数据,经过解码处理后,获取到的是视频原始数据,如NV12视频数据、YUV420数据、YUV422数据等等(注意的是:经过视频解码处理的原始数据一定是YUV数据不是RGB数据,RGB数据是要经过YUV转换后的彩色图像数据)。 rga模块转换。
常用的VDEC模块,包括FFMPEG解码(软件解码)、还有各种芯片自带的VDEC解码器(硬件解码),如海思VDEC、瑞芯微VDEC、君正VDEC等等,像我们的项目则是直接使用瑞芯微自带的VDEC视频解码模块对其进行解码处理。
VDEC模块的API介绍:
VDEC是RV1126的解码模块,在RV1126中它提供了API进行解码处理,并获取VDEC数据。下面我们来看看涉及到VDEC模块的API有哪些。
VDEC初始化API
在RV1126里面,VDEC的初始化用的API是RK_MPI_VDEC_CreateChn。
第一个参数:解码的通道号,最大的总数是16,(未来到这个通道里面拿解码数据)。
第二个参数:VDEC_CHN_ATTR_S结构体指针,我们来具体看看它的定义
enCodecType:是编码器的选择
enCodecType:需要传入解码器的编码数据,支持H264和H265。H264的枚举类型是RK_CODEC_TYPE_H264,H265的枚举类型是RK_CODEC_TYPE_H265。
VIDEO_MODE_E:解码器的工作模式,分别是帧模式(VIDEO_MODE_FRAME)和流模式(VIDEO_MODE_STREAM),我们重点说下帧模式和流模式。
先重点聊聊帧格式和流格式,虽然在我的解码部分已经聊过了,但是在这里还是想在聊聊
帧模式:
当我的编码器,选择了帧模式,直接发送一个264的码流,它是接收不了的,必须要把它 切成一帧一帧数据......,解码器才能处理。切割的api就是av_read_frame()
流模式
当我的编码器,选择了流模式,整个码流数据可以直接送到解码器里面,它会自己做分割,也就是做了av_read_frame的事情。
总结:
一般都是会选择帧模式,因为帧模式你,不用解码器自己分割,可以加快解码器的速度。
最后一个结构体VIDEO_DECODEC_MODE_E:
解码器的工作模式,分为两种分别是VIDEO_DECODEC_SOFTWARE软解码和VIDEO_DECODEC_HADRWARE硬解码。软解码顾名思义就是使用CPU进行解码,VIDEO_DECODEC_HADRWARE指的就是使用瑞芯微内部的硬件模块进行解码处理(这里需要注意的是,有些RV1126内部可能不提供硬件解码的功能,只能使用软件解码处理,我去问了厂家,目前易百纳很多板子的解码模块只支持软件解码)。