前言
上节我们讲到了VDEC解码模块,那当然少不了VENC编码模块了,一般有编解码的需求都是为了压缩视频的大小,方便减少传输所占用的带宽。
概述
VENC 模块,即视频编码模块。本模块支持多路实时编码,且每路编码独立,编码协议和编码 profile 可以不同。
编码数据流程图
典型的编码流程包括了输入图像的接收、图像的选择、镜像、裁剪缩放、图像内容的遮挡和覆盖、图像的编码、以及码流的输出等过程。
内部数据流程处理如下图:
内部数据流程看起来还是蛮好理解,但是看到编码模块相关的API还是稍微有点晕😵的,这些API我到现在大部分都没有使用到,目前我的水平只能支持能够实现简单编码属性修改。
初始化
RK_MPI_VENC_CreateChn
该函数用于创建编码通道。
通过该函数创建并设置编码通道属性,设置结构体里面三个属性
VENC_ATTR_S stVencAttr;//编码器属性
VENC_RC_ATTR_S stRcAttr;//码率控制器属性
VENC_GOP_ATTR_S stGopAttr;//Gop Mode 类型的结构体
VENC_ATTR_S
该结构体用于定义编码器属性。
要注意的是里面所有的成员是静态的,开始接收编码流后就不能修改了
VENC_RC_ATTR_S
该结构体用于定义编码通道码率控制器属性
上面的属性需要根据不同编码协议模式来配置,里面的属性可以配置的属性有gop,帧率信息,码率等等,不同编码协议所配置的信息也会有所不同。
RK_MPI_VENC_StartRecvFrame
该函数启动编码通道开始接收输入图像。
调用该函数后,就算是开始正式接收数据流进行编码了,可以通过与VI或者VPSS等前级模块bind的方式来不断编码数据流。
RK_MPI_VENC_GetStream
该函数用于获取编码后的码流。
对于获取方式有两种不同的方式。
RK_MPI_VENC_ReleaseStream
该函数用于释放码流缓存,与上面RK_MPI_VENC_GetStream
配对使用
RK_MPI_VENC_RequestIDR
该函数用于请求I帧
以上就是venc编码模块比较常用的一些接口,基本流程就是设置通道属性然后,使能通道开始接收数据来编码,然后在从内部队列获取编码流,一般常规用法都是VI绑定VPSS再绑定VENC来进行编码的。