7.3.9 视频编码
概述
视频编码模块实现H.264/H.265/JPEG/MJPEG协议硬件编码。该模块支持多通道实时编码,各通道相互独立,常见的使用场景,包括单路录像、多路录像、单路VIO视频流、多路VIO视频流、录像+VIO视频流等。
功能描述
基础规格
X3支持的编码规格如下:

H264/H265协议编码性能如下:
- H.264编解码支持最大分辨率为 8192 x 8192,最小为256 x 128,解码最小为32 x 32
- H.265编解码支持最大分辨率为 8192 x 8192,最小为256 x 128,解码最小为8 x 8
- H.264/H.265的stride是32字节对齐,width和height都是8字节对齐,如果不是对齐的建议使用VIDEO_CROP_INFO_S去对应裁剪
- H.264/H.265均具备多码流实时编码能力
- 最高能力支持 4K@60fps
- 带QP map的ROI编码(让用户选择画面中感兴趣的区域,启用ROI功能后,重要的或者移动的区域将会进行高质量无损编码,而对那些不移动,不被选择的区域降低其码率和图像质量,进行标准清晰度视频压缩,甚至是不传输这部分区域视频)
- 支持旋转和镜像
- Multi-instance处理,最多32个
JPEG协议编码能力如下:
- 编解码分辨率最大32768 x 32768,最小 16 x 16
- MJPEG、JPEG的stride是32字节对齐,width是16字节对齐,height是8字节对齐
- 对于YUV 4:2:0 格式(例如:NV12),最高能力达到 4K@30fps
- JPEG Baseline and Extended sequential ISO/IEC 10918-1
- 支持一个或三个颜色分量,每个分量可以8位或12位采样
- 支持YUV 4:0:0,4:2:0,4:2:2,4:4:0 和 4:4:4 颜色格式
- 支持编解码ROI
- 支持slice encoding
- 支持旋转和镜像
- Multi-instance,最高支持64个
编解码通道
编解码通道即一个特定类型的编解码实例,不同编解码通道的用户参数配置和资源可以相互独立,这样就可以实现多路不同规格的视频编解码,覆盖多种业务场景。
码率控制
码率控制主要指的是对编码码率的控制。码率控制针对连续的视频编码码流而言,对于一个变化的场景,如果要达到图像质量稳定,则编码码率会抖动;如果要达到编码码率稳定,则图像质量会波动。X3针对H264、H265和MJPEG协议支持以下码率控制方式:
- H264/H265支持编码通道的CBR、VBR、AVBR、FixQp和QpMap五种码率控制方式
- MJPGE编码通道的FixQp码率控制方式。
CBR能够保证整体的编码码率稳定;
VBR则是保证编码图像的质量稳定;
AVBR会兼顾码率和图像质量,产生码率和图像质量相对稳定的码流;
FixQp是固定每一个I帧、P帧和B帧的QP值;
QPMAP是为一帧图像中的每一个块指定QP值,其中H264块大小为16x16,H265块大小为32x32。
对于CBR和AVBR来说,编码器内部会为每一帧图片找到合适的QP值,从而保证恒定码率。
编码器内部支持三种级别的码率控制,分别为帧级别、CTU/MB级别和subCTU/subMB级别。其中帧级 别的控制主要会根据目标码率为每一帧图片产生一个QP值,从而保证码率恒定;CTU/MB级别的控制则根据每一个64x64的CTU或16x16的MB的目标码率为每个block产生一个QP值,能够得到更好的码率控制,但是频繁的QP值调整会造成图像质量不稳定的问题;subCTU/subMB级别的控制则为每一个32x32的subCTU或8x8的subMB产生一个QP值,其中复杂的块会得到较高的QP值,静态的块则会得到较低的QP值,因为相比于复杂的区域人眼对于静态的区域更敏感,复杂和静态区域的检测主要依赖于内部硬件模块,这个级别控制主要是为了提高主观图像质量同时保证码率恒定,该模式控制下SSIM得分较高,但是PSNR得分会降低。
CBR、VBR、AVBR可以使能QPMAP,则每个块区域的实际值由以下公式得到:

其中MQP为ROI map中的值,RQP为编码器内部码率控制得到的值,ROIAvaQP为ROI map中QP的平均值。
GOP结构
GOP结构表可定义一组周期性的GOP结构,该GOP结构将用于整个编码过程。单个结构表中的元素如下表所示,其中可以指定该图像的参考帧,如果IDR帧后的其他帧指定的参考帧为IDR帧前的数据帧,编码器内部会自动处理这种情况使其不参考其他帧,用户无需关心这种情况。用户在自定义GOP结构时需要指明结构表的数量,最多可定义8个结构表,结构表的顺序需要按照解码顺序排列。
| Element | Description |
|---|---|
| Type | Slice type(I,P or B) |
| POC | Display order of the frame within a GOP,ranging from 1 to GOP size |
| QPoffset | A quantization parameter of the picture in the custom GOP |
| NUM_REF_PIC_L0 | Flag to use multi reference picture for P picture It is valid only if PIC_TYPE is P |
| temporal_id | Temporal layer of the frame. A frame cannot predict from a frame with a higher temporal id(0~6). |
| 1st_ref_POC | The POC of the 1st reference picture of L0 |
| 2nd_ref_POC | The POC of 1st reference picture of L1 in case that Type is equal to B The POC of 2nd reference picture of L0 in case that Type is equal to P Note that reference_L1can have the same POC as reference in B slice. But for compression efficiency it is recommended that reference_L1 have a different POC from reference_L0 |
GOP预置结构

下表所示为预置的8种GOP结构
| Index | GOP Structure | Low Delay (encoding order and display order are same) | GOP Size | Encoding Order | Minimum Source Frame Buffer | Minimum Decoded Picture Buffer | Intra Period (I Frame Interval) Requirement |
|---|---|---|---|---|---|---|---|
| 1 | I | Yes | 1 | I0-I1-I2… | 1 | 1 | |
| 2 | P | Yes | 1 | P0-P1-P2… | 1 | 2 | |
| 3 | B | Yes | 1 | B0-B1-B2… | 1 | 3 | |
| 4 | BP | No | 2 | B1-P0-B3-P2… | 4 | 3 | Multiple of 2 |
| 5 | BBBP | No | 4 | B2-B1-B3-P0… | 7 | 4 | Multiple of 4 |
| 6 | PPPP | Yes | 4 | P0-P1-P2-P3… | 1 | 2 | |
| 7 | BBBB | Yes | 4 | B0-B1-B2-B3… | 1 | 3 | |
| 8 | BBBBBBBB | No | 8 | B3-B2-B4-B1-B6-B5-B7-B0… | 12 | 5 | Multiple of 8 |
其中
-
GOP Preset1
- 只有I帧,没有相互参考帧
- 低延时

-
GOP Preset2
- 只有I帧和P帧
- P帧参考两个前向参考帧
- 低延时

-
GOP Preset3
- 只有I帧和B帧
- B帧参考两个前向参考帧
- 低延时

-
GOP Preset4
- 有I帧、P帧和B帧
- P帧参考两个前向参考帧
- B 帧参考一个前向参考帧和一个后向参考帧

-
GOP Preset5
- 有I帧、P帧和B帧
- P帧参考两个前向参考帧
- B帧参考一个前向参考帧和一个后向参考帧,后向参考帧可为P帧或B帧

-
GOP Preset 6
- 只有I帧和P帧;
- P帧参考两个前向参考帧;
- 低延时;

-
GOP Preset 7
- 只有I帧和B帧;
- B帧参考两个前向参考帧;
- 低延时;

-
GOP Preset 8
- 只有I帧和B帧;
- B帧参考一个前向参考帧和一个后向参考帧;
