一、H265编码原理
1 NALU头
这里跟H264不同的是,NALU Header占用2个字节。
-
F(forbidden_zero_bit): 必须为0,表示有效;为1的话表示无效(传输工程中发送错误)。
- Type(nalu_unit_type): 占6bit,NAL Type确定NAL的类型,其中VCL NAL和non-VCL NAL各有32类。
-
0 - 31是VCL NAL单元;
-
32 - 63是非VCL NAL单元,VCL是指携带编码数据的数据流,而non-VCL则是控制数据流。
-
-
LayerID(nuh_layer_id): 表示NAL所在的Access unit所属的层,该字段是为了HEVC的继续扩展设置。也就是目前都是0,以后的扩展可能会用到。
- TID(nuh_temporal_id_plus1): 占用3bit,指示当前 NAL 单元所属的层次或帧的时间层级。(一般都是1,具体作用目前我还没明白)
1.1 NALU type
/**
* Table 7-3: NAL unit type codes
*/
enum HEVCNALUnitType {
HEVC_NAL_TRAIL_N = 0, /* B帧(表示尾部帧,非参考帧,所以是B帧) */
HEVC_NAL_TRAIL_R = 1, /* P帧(表示尾部帧,参考帧,所以是P帧) */
HEVC_NAL_TSA_N = 2,
HEVC_NAL_TSA_R = 3,
HEVC_NAL_STSA_N = 4,
HEVC_NAL_STSA_R = 5,
HEVC_NAL_RADL_N = 6,
HEVC_NAL_RADL_R = 7,
HEVC_NAL_RASL_N = 8,
HEVC_NAL_RASL_R = 9,
HEVC_NAL_VCL_N10 = 10,
HEVC_NAL_VCL_R11 = 11,
HEVC_NAL_VCL_N12 = 12,
HEVC_NAL_VCL_R13 = 13,
HEVC_NAL_VCL_N14 = 14,
HEVC_NAL_VCL_R15 = 15,
HEVC_NAL_BLA_W_LP = 16,
HEVC_NAL_BLA_W_RADL = 17,
HEVC_NAL_BLA_N_LP = 18,
HEVC_NAL_IDR_W_RADL = 19, /* I帧 */
HEVC_NAL_IDR_N_LP = 20,
HEVC_NAL_CRA_NUT = 21,
HEVC_NAL_IRAP_VCL22 = 22,
HEVC_NAL_IRAP_VCL23 = 23,
HEVC_NAL_RSV_VCL24 = 24,
HEVC_NAL_RSV_VCL25 = 25,
HEVC_NAL_RSV_VCL26 = 26,
HEVC_NAL_RSV_VCL27 = 27,
HEVC_NAL_RSV_VCL28 = 28,
HEVC_NAL_RSV_VCL29 = 29,
HEVC_NAL_RSV_VCL30 = 30,
HEVC_NAL_RSV_VCL31 = 31,
HEVC_NAL_VPS = 32, /* VPS 类型的NAL */
HEVC_NAL_SPS = 33, /* SPS 类型的NAL */
HEVC_NAL_PPS = 34, /* PPS 类型的NAL */
HEVC_NAL_AUD = 35, /* AUD 分隔符类型的 NAL */
HEVC_NAL_EOS_NUT = 36,
HEVC_NAL_EOB_NUT = 37,
HEVC_NAL_FD_NUT = 38,
/**
* 位置:出现在实际编码视频数据(VCL NAL 单元)之前
* 作用:通常用于在解码视频流前提供一些非视频编码相关的附加信息,这些信息可能包括场景切换、视频流的说明、缓冲区控制等。
* 常见用途:例如传递HDR (高动态范围) 元数据,帧速率信息等。
*/
HEVC_NAL_SEI_PREFIX = 39,
/**
* 位置:出现在编码视频数据(VCL NAL 单元)之后。
* 作用:通常用于提供与解码后的视频数据相关的额外信息,但这些信息只有在解码VCL NAL单元之后才有用。
* 常见用途:例如与特定帧相关的增强信息,在解码后提供进一步的控制和描述。
*/
HEVC_NAL_SEI_SUFFIX = 40,
};
1.2 NALU常用Header
-
0x40 0x01 VPS类型的NAL
-
0x42 0x01 SPS类型的NAL
-
0x44 0x01 PPS类型的NAL
-
0x26 0x01 IDR关键帧类型的NAL
-
0x02 0x01 P帧类型的NAL