1 H265 概述
H264 与 H265 的区别
-
传输码率:H264 由于算法优化,可以低于 2Mbps 的速度实现标清数字图像传送;H.265 High Profile 可实现低于 1.5Mbps 的传输带宽下,实现 1080p 全高清视频传输。
-
编码架构:H.265/HEVC 的编码架构大致上和 H.264/AVC 的架构相似,主要也包含帧内预测 (intra prediction)、帧间预测 (inter prediction)、转换 (transform)、量化 (quantization)、去区块滤波器 (deblocking filter)、熵编码 (entropy coding) 等模块,但在 HEVC 编码架构中,整体被分为了三个基本单位,分别是编码单位 (coding unit, CU)、预测单位 (predict unit, PU) 和转换单位 (transform unit, TU)。
-
编码单位:H.264 中每个宏块 (macroblock/MB) 大小是 8x8 或者 16x16 像素,而 H.265 的编码单位可以选择从最小的 8x8 到最大的 64x64。
-
帧内预测方式:H.265 的帧内预测模式支持 33 种方向 (H.264 只支持 8 种),并且提供了更好的运动补偿处理和矢量预测方法。
-
编码视频大小:在相同的图象质量下,相比于 H.264,通过 H.265 编码的视频大小将减少大约 39 - 44%。由于质量控制的测定方法不同,这个数据也会有相应的变化。
-
信噪比 PSNR:通过主观视觉测试得出的数据显示,在码率减少 51 - 74% 的情况下,H.265 编码视频的质量还能与 H.264 编码视频近似甚至更好,其本质上说是比预期的信噪比 (PSNR) 要好。
-
运算需求:由于 h265 比较 h264 压缩率更高,编码视频更小,所以对机器的运算需求也要更大。
-
预测块大小:HEVC 将之前标准中定义的宏块 (macroblocks) 用一种最大到 64x64 像素的并且可以进一步细分成可变大 小的块。HEVC 把编码树单元 (coding tree units (CTUs)) 变成亮度和色度的编码块 (coding tree blocks (CTBs))。一个 CTB 可以大小为 64x64、32x32 或者 16x16。这样帧内 (intra-picture) 和帧间 (inter-picture) 的预测块 (prediction units,PU) 大小从 64x64 到 4x4 大小,只是对于双向预测,只能到 8x4 到 4x8 大小。预测残差编码的变换块大小可以是 32x32、16x16、8x8、4x4。
-
内部色深的增加:内部色深增加 (Internal bit depth increase (IBDI)) 可以让编码器运行在色宽更高的内部状态。IBDI 最多可以作用于 14-bit 位宽。
-
并行处理工具 (Parallel processing tools):可以把图像分成独立编解码的矩形块和条带,即条带 slice 和 tile 瓷片的概念。条带大部分可以单独解码,只是最终需要同步成一个视频流。条带可以编码成条带间没有预测,互相独立。当然条带间可能还是需要环路滤波的。
-
熵编码 (Entropy coding):HEVC 采用基于上下文自适应的熵编码算法 (context - adaptive binary arithmetic coding (CABAC)),和 H.264 类似。只不过 HEVC 只支持 CABAC 编码。
-
帧内预测 (intra prediction):HEVC 的帧内预测有 33 个方向模式,而 h.264 中只有 8 个,HEVC 还指定了 planar 和 DC 帧内预测模式。
-
帧间预测模式:本质上 H.265 是在 H.264 基础上增加插值的抽头系数个数,改变抽头系数值以及增加运动矢量预测值的候选个数,以达到减少预测残差的目的。H.265 与 H.264 一样插值精度都是亮度到 1/4,色度到 1/8 精度,但插值滤波器抽头长度和系数不同。H.265 的增加了运动矢量预测值候选的个数,而 H.264 预测值只有一个。
-
运动补偿 (Motion compensation):HEVC 采用半像素或者 1/4 像素的精度运动补偿,以及 7 抽头或者 8 抽头的滤波器。H.264 使用半像素精度和 6 抽头的滤波器。对于 4:2:0 视频的色度分量有 1/8 像素精度和 4 抽头的滤波器。HEVC 中的加权预测可以是单向也可以是双向的预测。
-
运动矢量预测 Motion vector prediction :HEVC 定义了 16-bit 的水平和垂直运动矢量,支持范围到
[-32768, 32767]
,即最多 - 8192 到 8191.75 个亮度像素点,H.264 只支持到 - 512 到 511.75 个像素点。HEVC 的 MV 模式有高级运动矢量预测 (Advanced Motion Vector Prediction (AMVP)) 和合并模式。合并模式运行从邻近块继承 mv 向量值,从而有 skip 和 direct 模式。 -
环路滤波器:HEVC 有两个环路滤波器,解块滤波器 (DBF, deblocking filter) 与样本自适应偏移量 (SAO, sample adaptive offset) 滤波器 (DBF)。Deblocking 滤波器和 H.264/MPEG-4 AVC 中的类似,HEVC 中 的 DBF 只能用于 8x8 的块 (提高并行处理性能),而 H.264 适用于 4x4 的块。HEVC 中 DBF 的强度从 0 到 2,对垂直边界做水平滤波,对水平边界做垂直滤波。SAO 滤波器在 DBF 滤波器之后,为了更好的重建原始图像。每个 CTB 的 SAO 滤波器可以使能或者禁止边界偏移模式或者子段偏移模式。
-
去块滤波:本质上 H.265 的去块滤波与 H.264 的去块滤波及流程是一致的,做了如下最显著的改变:滤波边界,H.264 最小到 4x4 边界滤波;而 H.265 适应最新的 CU、PU 和 TU 划分结构的滤波边缘,最小滤波边界为 8x8 ;滤波顺序,H264 先宏块内采用垂直边界,再当前宏块内水平边界;而 H.265 先整帧的垂直边界,再整帧的水平边界。
-
内部比特深度增加:为了保证中间预测、变换以及量化过程中的内部比特精度,以达到更好的压缩性能。
-
并行化设计:当前芯片架构已经从单核性能逐渐往多核并行方向发展,因此为了适应并行化程度非常高的芯片实现,HEVC/H.265 引入了很多并行运算的优化思路。
2 H265 分层结构
- 视频编码层(VCL):负责原始视频数据压缩。
- 网络抽象层(NAL):将压缩数据封装为 NALU 单元,适配网络传输。

3 H265 码流结构
1. Start Code
- 标识 NALU 开始,格式为
0x00000001
(4 字节)或0x000001
(3 字节)。
2. NALU Header(2 字节)
字段 | 位数 | 描述 |
---|---|---|
forbidden_zero_bit | 1 | 禁止位,默认 0,错误时置 1。 |
nal_unit_type | 6 | NALU 类型(如 VPS=32,SPS=33,PPS=34,I 帧 = 16-21 等)。 |
nuh_layer_id | 6 | 层 ID,预留扩展位,默认 0。 |
nuh_temporal_id_plus1 | 3 | 时域 ID,值为实际 ID+1。 |
nal_unit_type 表
nal_unit_type | Name of nal_unit_type | Content of NAL unit and RBSP syntax structure | NAL unit type class | |
---|---|---|---|---|
0 | TRAIL_N | Coded slice segment of a non - TSA, non - STSA trailing picture slice_segment_layer_rbsp() | VCL | |
1 | TRAIL_R | Coded slice segment of a non - TSA, non - STSA trailing picture slice_segment_layer_rbsp() | VCL | |
2 | TSA_N | Coded slice segment of a TSA picture slice_segment_layer_rbsp() | VCL | |
3 | TSA_R | Coded slice segment of a TSA picture slice_segment_layer_rbsp() | VCL | |
4 | STSA_N | Coded slice segment of an STSA picture slice_segment_layer_rbsp() | VCL | |
5 | STSA_R | Coded slice segment of an STSA picture slice_segment_layer_rbsp() | VCL | |
6 | RADL_N | Coded slice segment of a RADL picture slice_segment_layer_rbsp() | VCL | |
7 | RADL_R | Coded slice segment of a RADL picture slice_segment_layer_rbsp() | VCL | |
8 | RASL_N | Coded slice segment of a RASL picture slice_segment_layer_rbsp() | VCL | |
9 | RASL_R | Coded slice segment of a RASL picture slice_segment_layer_rbsp() | VCL | |
10 | RSV_VCL_N10 | Reserved non - IRAP SLNR VCL NAL unit types | VCL | |
12 | RSV_VCL_N12 | Reserved non - IRAP SLNR VCL NAL unit types | VCL | |
14 | RSV_VCL_N14 | Reserved non - IRAP SLNR VCL NAL unit types | VCL | |
11 | RSV_VCL_R11 | Reserved non - IRAP sub - layer reference VCL NAL unit types | VCL | |
13 | RSV_VCL_R13 | Reserved non - IRAP sub - layer reference VCL NAL unit types | VCL | |
15 | RSV_VCL_R15 | Reserved non - IRAP sub - layer reference VCL NAL unit types | VCL | |
16 | BLA_W_LP | Coded slice segment of a BLA picture slice_segment_layer_rbsp() | VCL | |
17 | BLA_W_RADL | Coded slice segment of a BLA picture slice_segment_layer_rbsp() | VCL | |
18 | BLA_N_LP | Coded slice segment of a BLA picture slice_segment_layer_rbsp() | VCL | |
19 | IDR_W_RADL | Coded slice segment of an IDR picture slice_segment_layer_rbsp() | VCL | |
20 | IDR_N_LP | Coded slice segment of an IDR picture slice_segment_layer_rbsp() | VCL | |
21 | CRA_NUT | Coded slice segment of a CRA picture slice_segment_layer_rbsp() | VCL | |
22 | RSV_IRAP_VCL22 | Reserved IRAP VCL NAL unit types | VCL | |
23 | RSV_IRAP_VCL23 | Reserved IRAP VCL NAL unit types | VCL | |
24 - 31 | RSV_VCL24 - RSV_VCL31 | Reserved non - IRAP VCL NAL unit types | VCL | |
32 | VPS_NUT | Video parameter set video_parameter_set_rbsp() | non - VCL | |
33 | SPS_NUT | Sequence parameter set seq_parameter_set_rbsp() | non - VCL | |
34 | PPS_NUT | Picture parameter set pic_parameter_set_rbsp() | non - VCL | |
35 | AUD_NUT | Access unit delimiter access_unit_delimiter_rbsp() | non - VCL | |
36 | EOS_NUT | End of sequence end_of_seq_rbsp() | non - VCL | |
37 | EOB_NUT | End of bitstream end_of_bitstream_rbsp() | non - VCL | |
38 | FD_NUT | Filler data filler_data_rbsp() | non - VCL | |
39 | PREFIX_SEI_NUT | Supplemental enhancement information sei_rbsp() | non - VCL | |
40 | SUFFIX_SEI_NUT | Supplemental enhancement information sei_rbsp() | non - VCL | |
41 - 47 | RSV_NVCL41 - RSV_NVCL47 | Reserved | non - VCL | |
48 - 63 | UNSPEC48 - UNSPEC63 | Unspecified | VCL |
控制数据流
- VPS(视频参数集)NALU的头值为0x40(⼗六进制),取出2-7位(0x40 & 0x7E)>>1 =32(⼗进制)
- SPS(序列参数集)NALU的头值为0x42(⼗六进制),取出2-7位(0x42 & 0x7E)>>1 =33(⼗进制)
- PPS(图像参数集)NALU的头值为0x44(⼗六进制),取出2-7位(0x44 & 0x7E)>>1 =34(⼗进制)
- SEI(补充增强信息)NALU的头值为0x4e(⼗六进制),取出2-7位(0x4e & 0x7E)>>1 =39(⼗进制)
- I帧 NALU的头值为0x26(⼗六进制),取出2-7位(0x26 & 0x7E)>>1 =19(⼗进制)
- I帧 NALU的头值为0x28(⼗六进制),取出2-7位(0x28 & 0x7E)>>1 =20(⼗进制)
- P帧 NALU的头值为0x02(⼗六进制),取出2-7位(0x02& 0x7E)>>1 =1(⼗进制)
- B帧 NALU的头值为0x00(⼗六进制),取出2-7位(0x00& 0x7E)>>1 =0(⼗进制)
VPS、SPS、PPS:三者的结构和关系如下图所示:

nuh_layer_id(6bit)
- LayerId预留位,占⽤NALU Header的第⼀个字节的最后⼀位和第⼆个字节的前五位,默认全为0,⽤于未来扩展。
nuh_temporal_id_plus1(3bit)
- TID时域层标号,占⽤NALU Header的第⼆个字节的最后三位,⼀般默认值为1,其值减1为该NALU时域层标号。
3.NALU Payload
NALU Payload 即视频压缩数据 RBSP,严格意义上来说,Payload 数据应该是 EBSP。
- SODB(String Of Data Bits):原始数据比特流,由 VCL 层产生的原始数据流,由于数据长度不一定是 8 的倍数,为方便计算机进行处理,就用到了 RBSP。
- RBSP(Raw Byte Sequence Payload):原始字节序列载荷,即在 SODB 的后面添加了 trailing bits,即一个 bit 1 和若干个 bit 0,以便字节对齐。
- EBSP (Encapsulated Byte Sequence Payload):扩展字节序列载荷。NALU 单元是通过开始码 "0x00 0x00 0x00 0x01" 或者 "0x00 0x00 0x01" 来表示一个 NALU 单元的开始,同时 H265 规定,当检测到 "0x00 0x00 0x00" 时,也可以表示当前 NALU 的结束。在 h265 码流中规定每有两个连续的 "0x00 0x00",就增加一个 "0x03",从而预防压缩后的数据与开始码产生冲突,防止竞争。
4 重点 NAL TYPE
参考博客:https://blog.csdn.net/Dillon2015/article/details/104142144
VPS 参数集
-
HEVC 在 H.264/AVC 的基础上引入了视频参数集 (Video Parameter Set,VPS)。
-
这样 HEVC 共定义了 3 类参数集:视频参数集 (Video Parameter Set,VPS);序列参数集 (SequenceParameter Set,SPS);图像参数集 (Picture Parameter Set,SPS)。在一个 HEVC 码流中,前三个 NALU 分别是 VPS NALU、SPS NALU、PPS NALU。这三类参数集的 NALU 可以独立解码而不需要参考码流中其他 NALU。
-
每一类参数集都包含扩展机制,允许在将来的 HEVC 版本中扩展这个参数集而不会破坏向后兼容性。
-
VPS 用于传送应用于多层和子层视频编码所需的信息,提供了整个视频序列的全局性信息。一个给定的视频序列的每一层都参考同一个 VPS,无论它们 SPS 是否相同。
VPS 语法元素
HEVC 中定义了 VPS 的各个语法元素及描述子:
video_parameter_set_rbsp( ) | Descriptor |
---|---|
vps_video_parameter_set_id | u(4) |
vps_base_layer_internal_flag | u(1) |
vps_base_layer_available_flag | u(1) |
vps_max_layers_minus1 | u(6) |
vps_max_sub_layers_minus1 | u(3) |
vps_temporal_id_nesting_flag | u(1) |
vps_reserved_0xffff_16bits | u(16) |
profile_tier_level( 1, vps_max_sub_layers_minusl ) | - |
vps_sub_layer_ordering_info_present_flag | u(1) |
for (i=( vps_sub_layer_ordering_info_present_flag? 0 : vps_max_sub_layers_minus1); i<= vps_max_sub_layers_minus1; i++ ) { } | - |
vps_max_dec_pic_buffering_minus1[i] | ue(v) |
vps_max_num_reorder_pics[i ] | ue(v) |
vps_max_latency_increase_plus1[i] | ue(v) |
vps_max_layer_id | u(6) |
vps_num_layer_sets_minus1 | ue(v) |
for (i=1 ; i<=vps_num_layer_sets_minus1; i++) | - |
for (j=0 ; j<= vps_max_layer_id; j++) | - |
layer_id_included_flag[i][j] | u(1) |
vps_timing_info_present_flag | u(1) |
if( vps_timing_info_present_flag) { } | - |
vps_num_units_in_tick | u(32) |
vps_time_scale | u(32) |
vps_poc_proportional_to_timing_flag | u(1) |
if( vps_poc_proportional_to_timing_flag ) | - |
vps_num_ticks_poc_diff_one_minus1 | ue(v) |
vps_num_hrd_parameters | ue(v) |
for (i=0 ; i<vps_num_hrd_parameters; i++){ } | - |
hrd_layer_set_idx[i (]) | ue(v) |
if ((i>0)) | - |
cprms_present_flag[i ] | u(1) |
hrd_parameters( cpms_present_flag[i ], vps_max_sub_layers_minusl) | - |
vps_extension_flag | u(1) |
if( vps_extension_flag ) | - |
while( more_rbsp_data( ) ) | - |
vps_extension_data_flag | u(1) |
rbsp_trailing_bits( ) | - |
上表定义了VPS的语法元素,前7条语法元素采⽤定⻓编码,共4个字节,⽅便解码器读取,这7条语法元素包括VPS识别符,相关可⽤层及可⽤时域⼦层的信息。 |
跟随前4个字节后的语法元素包括:比特流中解码器工作的可用操作点信息。一个操作点的特性由使用的Profile、tier和level刻画。它定义了解码比特流所需的编码工具,以及对比特流尺寸或缓存容量的限制。跟在整个比特流操作点指标后的是比特流时域子层的操作点指标。
-
vps_video_parameter_set_id:当前VPS标识符,供PPS引用。
-
vps_base_layer_internal_flag 和 vps_base_layer_available_flag:
- 如果vps_base_layer_internal_flag = 1且vps_base_layer_available_flag = 1,码流中存在base layer。
- 否则,如果vps_base_layer_internal_flag = 0且vps_base_layer_available_flag = 1,base layer由本规范未规定的外部手段提供。
- 否则,如果vps_base_layer_internal_flag = 1且vps_base_layer_available_flag = 0,不存在base layer,但是VPS中包含base layer的信息就像其存在于码流中一样。
- 否则,如果vps_base_layer_internal_flag = 0且vps_base_layer_available_flag = 0,不存在base layer,但是VPS中包含base layer的信息就像其由本规范未规定的外部手段提供一样。
-
vps_max_layers_minus1:该值加1表示参考这个VPS的CVS(Coded Video Sequence)的最多允许的层数。为了保持码流的一致性,当vps_base_layer_internal_flag = 0时vps_max_layers_minus1应该大于0。在本规范中vps_max_layers_minus1应该小于63。vps_max_layers_minus1 = 63留给将来扩展使用。
-
vps_max_sub_layers_minus1:该值加1表示参考这个VPS的CVS的最多允许的时域子层数。vps_max_sub_layers_minus1 值应该在0~6间,即最多支持7个时域子层。
-
vps_temporal_id_nesting_flag:当vps_max_sub_layers_minus1 = 0时,该参数为1;当vps_max_sub_layers_minus1大于0时,这个参数用于指定是否对帧间预测进行额外限定。该参数用于指定时域子层升档,即从低子层切换到高子层。
-
vps_reserved_0xffff_16bits:两字节保留位,其值等于0xFFFF。
-
vps_sub_layer_ordering_info_present_flag:
-
vps_sub_layer_ordering_info_present_flag = 1表示vps_max_dec_pic_buffering_minus1[ i ],vps_max_num_reorder_pics[ i ] 和vps_max_latency _increase_plus1[ i ]作用于vps_max_sub_layers_minus1 + 1 子层。
-
vps_sub_layer_ordering_info _present_flag = 0表示vps_max_dec_pic_buffering_minus1[ vps_max_sub_layers_minus1 ],vps_max_num_reorder_pics[ vps_max_sub_layers_minus1 ]和vps_max_latency_increase_plus1[ vps_max_sub_layers_minus1 ] 作用于所有子层。
-
当vps_base_layer_internal_flag = 0时,vps_sub_layer_ordering_info _present_flag = 0且解码器应该忽略该字段。
-
-
vps_max_dec_pic_buffering_minus1[ i ]:规定了HighestTid = i时,CVS的图像存储单元中解码图像所需的最大缓存。
-
vps_max_num_reorder_pics[ i ] :规定了HighestTid = i时,在CVS中解码顺序在某一幅图像之后,而显示顺序在该图像前的图像最大数量。
-
vps_max_latency_increase_plus1[ i ] :当HighestTid = i时,该语法元素用于计算VpsMaxLatency Pictures[i]的值。当vps_max_latency_increase_plus1[ i ]不等于0时,VpsMaxLatencyPictures[ i ] =vps_max_num_reorder_pics[i]+vps_max_latency_increase_plus1[ i ]-1。
-
vps_max_layer_id:指定参考该VPS的所有CVS中的NALU的nuh_layer_id的最大值。
-
vps_num_layer_sets_minus1:指定VPS中层集(layer set)的数量,该值在0~1023间。
-
layer_id_included_flag[ i [ j] :
- 该语法元素为1时,表示图层标识列表 LayerSetLayerIdList[ i ]中包含nuh_layer_id = j的情况;
- 该语法元素为0时,表示图层标识列表 LayerSetLayerIdList[ i ]中不包含nuh_layer_id = j的情况;
- NumLayersInIdList[ 0 ] = 1且LayerSetLayerIdList[0][0] = 0,NumLayersInIdList[i]和 LayerSetLayerIdList[ i ]由下面方式生成:
cpp
n = 0
for(m = 0;m <= vps_max_layer_id;m++)
if(layer_id_included_flag[i][m])
LayerSetLayerIdList[i][n++] = m
NumLayersInIdList[i] = n
-
vps_timing_info_present_flag :
- 该语法元素为1时,表示在VPS中语法元素vps_num_units_in_tick、vps_time_scale、vps_poc_proportional_to_timing_flag和vps_num_hrd_parameters存在;
- 该语法元素为0时VPS中不存在这4个语法元素。
-
vps_num_units_in_tick:该语法元素规定当时钟频率为vps_time_scale Hz时所花的时间单位个数。以秒为单位时,一个时钟周期等于vps_num_units_in_tick除以vps_time_scale 。例如,当一个视频的帧率为25Hz时,vps_time_scale 等于27000000Hz,vps_num_units_in_tick就等于1080000,因此一个时钟周期就是0.04秒。
-
vps_time_scale:一秒内时间单位的个数。
-
vps_poc_proportional_to_timing_flag:该语法元素为1时,表示CVS在每幅图像(不包括第一幅图像)的POC与它的显示时间和第一幅图像的显示时间的比值成正比;否则,不成比例。
-
vps_num_ticks_poc_diff_one_minus1:表示POC之间差值为1时,时钟周期的数目。
-
vps_num_hrd_parameters:指定VPS RBSP中语法结构体hrd_parameters()的数目。
-
hrd_layer_set_idx[ i ]:指定第i个语法结构体hrd_parameters()使用的图层集的索引。
-
cprms_present_flag[ i ] :表示第i个hrd_parameters()中是否存在所有子层公用的HRD参数。
-
vps_extension_flag:该语法元素取0时,表示在VPS RBSP中没有语法元素vps_extension_data_flag。
-
vps_extension_data_flag:可以为任意值。在该版本中,解码器忽略该语法元素。
SPS参数集
参考博客:https://blog.csdn.net/Dillon2015/article/details/104148026
一段视频包含一个或多个编码视频序列(CVS),每个CVS都有一个序列参数集(SPS),且这些SPS均引用同一个视频参数集(VPS)。SPS包含CVS中所有编码图像的共享编码参数,一个CVS内的所有图像参数集(PPS)必须引用同一SPS,且SPS在被引用后直至CVS结束前均处于激活状态。
SPS的语法元素主要分为以下七类:
1. 图像格式信息
- 采样格式:如4:2:0、4:2:2、4:4:4等色度采样模式。
- 图像分辨率 :亮度分量的宽度(
pic_width_in_luma_samples
)和高度(pic_height_in_luma_samples
)。 - 量化深度 :亮度(
bit_depth_luma_minus8
)和色度(bit_depth_chroma_minus8
)的比特深度(如8bit、10bit)。 - 裁剪参数 :是否启用裁剪(
conformance_window_flag
)及左/右/上/下偏移量(conf_win_left_offset
等)。
2. 编码参数信息
- 块尺寸设置 :
- 编码块(CU)最小/最大尺寸(通过
log2_min_luma_coding_block_size_minus3
等参数推导)。 - 变换块(TU)最小/最大尺寸及划分深度(
log2_min_luma_transform_block_size_minus2
等)。
- 编码块(CU)最小/最大尺寸(通过
- 特殊模式开关 :
- 4:4:4采样的三通道单独编码(
separate_colour_plane_flag
)。 - 帧内强滤波(
strong_intra_smoothing_enabled_flag
)。 - 非对称划分模式(AMP,
amp_enabled_flag
)与时域MV预测(sps_temporal_mvp_enabled_flag
)。
- 4:4:4采样的三通道单独编码(
- 编码工具 :量化矩阵使用(
scaling_list_enabled_flag
)、样点自适应补偿(SAO,sample_adaptive_offset_enabled_flag
)、PCM模式(pcm_enabled_flag
)及相关参数。
3. 参考图像相关信息
- 短期参考图像 :短期参考图像集合的数量及配置(
num_short_term_ref_pic_sets
)。 - 长期参考图像 :
- 长期参考图像数目(
num_long_term_ref_pics_sps
)及其POC值(lt_ref_pic_poc_lsb_sps
)。 - 长期参考图像是否可作为当前图像参考的标志(
used_by_curr_pic_lt_sps_flag
)。
- 长期参考图像数目(
4. profile、tier和level相关参数
- 档次(Profile):如Main、Main 10、Main Still Picture。
- 层(Tier):主层(Main Tier)或高层(High Tier)。
- 级别(Level):限制分辨率、码率等参数的等级(如Level 5.1支持4K分辨率)。
5. 时域分级信息
- 时域子层 :最大子层数(
sps_max_sub_layers_minus1
,06,对应17层)。 - POC控制 :通过
log2_max_pic_order_cnt_lsb_minus4
计算POC进位参数(MaxPicOrderCntLsb
)。 - 子层顺序 :子层顺序标识开关(
sps_sub_layer_ordering_info_present_flag
)及缓存参数(如sps_max_dec_pic_buffering_minus1
)。
6. 可视化可用信息(VUI)
- 视频宽高比、像素纵横比、帧率信息。
- 安全区域、音频参数、立体图像格式等辅助解码的元数据。
7. 其他信息
- 引用标识 :引用的VPS编号(
sps_video_parameter_set_id
)。 - SPS标识 :自身标识符(
sps_seq_parameter_set_id
,0~15)。 - 扩展信息 :多层编码扩展(
sps_multilayer_extension_flag
)、3D视频扩展(sps_3d_extension_flag
)等未来预留字段。
下表是SPS的语法结构:

下表是SPS扩展部分语法结构:
下表是SPS在SCC扩展部分语法结构:

1. 基础引用与标识参数
语法元素 | 描述 |
---|---|
sps_video_parameter_set_id |
指定当前激活的 VPS 的 ID 号。 |
sps_max_sub_layers_minus1 |
参考当前 SPS 的 CVS 的时域子层最大数目(取值 0~6,对应 1~7 个子层)。 |
sps_temporal_id_nesting_flag |
- 当 sps_max_sub_layers_minus1 > 0 :控制帧间预测是否受时域子层限制。 - 当 sps_max_sub_layers_minus1 = 0 :强制为 1。 |
sps_seq_parameter_set_id |
SPS 自身标识号(0~15)。 |
2. 图像格式参数
语法元素 | 描述 |
---|---|
chroma_format_idc |
色度采样格式(0=mono,1=4:2:0,2=4:2:2,3=4:4:4)。 |
separate_colour_plane_flag |
- 1:对 4:4:4 格式三通道单独编码 - 0:不单独编码(默认) |
pic_width_in_luma_samples |
解码图像亮度宽度(像素)。 |
pic_height_in_luma_samples |
解码图像亮度高度(像素)。 |
conformance_window_flag |
- 1:启用图像裁剪 - 0:不裁剪 |
conf_win_left/right/top/bottom_offset |
裁剪偏移量(仅当 conformance_window_flag=1 时有效)。 |
bit_depth_luma_minus8 |
亮度像素比特深度(实际值 = 8 + 该值)。 |
bit_depth_chroma_minus8 |
色度像素比特深度(实际值 = 8 + 该值)。 |
3. POC 与时域控制参数
语法元素 | 描述 |
---|---|
log2_max_pic_order_cnt_lsb_minus4 |
计算 MaxPicOrderCntLsb = 2^(该值+4) ,用于 POC 进位控制。 |
sps_sub_layer_ordering_info_present_flag |
- 1:参数作用于 sps_max_sub_layers_minus1+1 子层 - 0:参数作用于所有子层 |
sps_max_dec_pic_buffering_minus1[i] |
当 HighestTid=i 时,解码图像缓存(DPB)的最大需求。 |
sps_max_num_reorder_pics[i] |
解码顺序在后、显示顺序在前的最大图像数(范围:[0, sps_max_dec_pic_buffering_minus1[i] ])。 |
sps_max_latency_increase_plus1[i] |
计算延迟图像数:SpsMaxLatencyPictures[i] = 前值 + 该值 - 1 (非零时有效)。 |
4. 编码块与变换块参数
语法元素 | 描述 |
---|---|
log2_min_luma_coding_block_size_minus3 |
亮度编码块(CU)最小尺寸(单位:2^(该值+3 ) 像素,如 0 对应 8x8)。 |
log2_diff_max_min_luma_coding_block_size |
亮度 CU 最大/最小尺寸差值(推导最大尺寸:最小尺寸 × 2^该值 )。 |
log2_min_luma_transform_block_size_minus2 |
亮度变换块(TU)最小尺寸(单位:2^(该值+2 ) 像素,如 0 对应 4x4)。 |
log2_diff_max_min_luma_transform_block_size |
亮度 TU 最大/最小尺寸差值(推导最大尺寸:最小尺寸 × 2^该值 )。 |
max_transform_hierarchy_depth_inter |
帧间预测时 TU 最大划分深度。 |
max_transform_hierarchy_depth_intra |
帧内预测时 TU 最大划分深度。 |
5. 编码工具与模式参数
语法元素 | 描述 |
---|---|
scaling_list_enabled_flag |
- 1:使用量化矩阵 - 0:不使用 |
sps_scaling_list_data_present_flag |
- 1:存在量化矩阵数据 - 0:不存在 |
amp_enabled_flag |
- 1:启用非对称划分模式(AMP) - 0:禁用 |
sample_adaptive_offset_enabled_flag |
- 1:去块滤波后启用 SAO - 0:禁用 |
pcm_enabled_flag |
- 1:启用 PCM 无损编码模式 - 0:禁用 |
6. PCM 模式参数
语法元素 | 描述 |
---|---|
pcm_sample_bit_depth_luma_minus1 |
PCM 模式下亮度样点比特深度(实际值 = 1 + 该值,如 0 对应 1bit)。 |
pcm_sample_bit_depth_chroma_minus1 |
PCM 模式下色度样点比特深度(实际值 = 1 + 该值)。 |
log2_min_pcm_luma_coding_block_size_minus3 |
PCM 编码块最小尺寸(单位同 CU 尺寸参数)。 |
log2_diff_max_min_pcm_luma_coding_block_size |
PCM 编码块最大/最小尺寸差值(推导方式同 CU 参数)。 |
pcm_loop_filter_disabled_flag |
- 1:PCM 模式禁用环路滤波 - 0:启用 |
7. 参考图像参数
语法元素 | 描述 |
---|---|
num_short_term_ref_pic_sets |
短期参考图像集合数目(0~64)。 |
long_term_ref_pics_present_flag |
- 1:使用长期参考图像 - 0:不使用 |
num_long_term_ref_pics_sps |
长期参考图像数目(0~32)。 |
lt_ref_pic_poc_lsb_sps[i] |
第 i 个长期参考图像的 POC 低位值(模 MaxPicOrderCntLsb )。 |
used_by_curr_pic_lt_sps_flag[i] |
- 1:第 i 个长期参考图像可用于当前图像 - 0:不可用 |
8. 扩展与预留参数
语法元素 | 描述 |
---|---|
sps_temporal_mvp_enabled_flag |
- 1:非 IDR 图像允许时域 MV 预测 - 0:禁止 |
strong_intra_smoothing_enabled_flag |
- 1:启用帧内滤波双向线性插值 - 0:禁用 |
vui_parameters_present_flag |
- 1:包含视频可用信息(VUI) - 0:不包含 |
sps_extension_present_flag |
- 1:存在扩展数据 - 0:无扩展 |
sps_range/multilayer/3d/scc_extension_flag |
- 1:启用对应扩展语法结构(当前版本多忽略)。 |
sps_extension_4bits |
预留字段(值恒为 0)。 |
sps_extension_data_flag |
扩展数据标志(解码器忽略)。 |
PPS参数集
参考博客:https://blog.csdn.net/Dillon2015/article/details/104204039/
一幅图像可以划分为一个或多个片(SS, Slice Segment),同一幅图像中的所有SS共用同一个图像参数集(Picture Parameter Set, PPS)。PPS中包含与SPS相同的部分参数,并会覆盖SPS中的对应值,即SS解码时优先使用PPS中的参数。解码初始时所有PPS均处于非激活状态,任意时刻最多仅有一个PPS激活,且该PPS的作用域持续至当前图像解码结束。
PPS的语法元素可分为以下六类:
1. 编码工具可用性标志
- 符号位隐藏(Sign Data Hiding) :是否允许通过修改系数符号隐藏信息(
sign_data_hiding_enabled_flag
)。 - 帧内预测受限(Constrained Intra Prediction) :是否禁止跨帧间预测块的帧内预测(
constrained_intra_pred_flag
)。 - 去方块滤波(Deblocking Filter) :是否启用去方块滤波(
pps_deblocking_filter_disabled_flag
的反向控制)。 - 加权预测(Weighted Prediction) :P/B帧是否启用加权预测(
weighted_pred_flag
/weighted_bipred_flag
)。 - 环路滤波跨越边界 :是否允许滤波操作跨越片(Slice)或瓷砖(Tile)边界(
pps_loop_filter_across_slices_enabled_flag
/loop_filter_across_tiles_enabled_flag
)。 - 变换跳过模式(Transform Skip/Bypass) :是否允许跳过变换和量化(
transform_skip_enabled_flag
/transquant_bypass_enabled_flag
)。
2. 量化过程参数
- 初始QP值 :亮度分量的初始量化参数(
init_qp_minus26
,实际QP = 26 + 该值)。 - 色度QP偏移 :色度分量(Cb/Cr)相对于亮度的QP偏移量(
pps_cb_qp_offset
/pps_cr_qp_offset
,范围:-12~12)。 - CU级QP调整 :是否允许对CU的QP进行动态调整(
cu_qp_delta_enabled_flag
),涉及参数diff_cu_qp_delta_depth
(调整范围深度)。
3. Tile划分相关参数
- Tile模式开关 :是否启用Tile划分(
tiles_enabled_flag
)。 - Tile布局参数 :
- 总列数/行数:
num_tile_columns_minus1
(列数 = 该值 + 1)、num_tile_rows_minus1
(行数 = 该值 + 1)。 - 均匀分布标志:
uniform_spacing_flag
(1=等宽/等高,0=自定义)。 - 自定义尺寸:
column_width_minus1[i]
/row_height_minus1[i]
(非均匀分布时的列宽/行高)。
- 总列数/行数:
4. 去方块滤波控制
- 滤波开关 :全局禁用去方块滤波标志(
pps_deblocking_filter_disabled_flag
,1=禁用,0=启用)。 - 默认补偿参数 :
pps_beta_offset_div2
:亮度块边界补偿值(beta)的偏移量(除以2,范围:-6~6)。pps_tc_offset_div2
:色度块边界补偿值(tC)的偏移量(除以2,范围:-6~6)。
- 片级滤波覆盖 :是否允许片头参数覆盖PPS的滤波设置(
deblocking_filter_override_enabled_flag
)。
5. 片头控制信息
- 依赖片标志 :当前片是否为依赖片(
dependent_slice_segments_enabled_flag
)。 - 额外片头比特 :片头中包含的额外控制比特数(
num_extra_slice_header_bits
,0~2位)。 - 解码输出顺序 :是否包含图像输出标志(
output_flag_present_flag
,影响解码图像的缓存和显示顺序)。 - CABAC初始化 :是否指定上下文变量初始化方法(
cabac_init_present_flag
)。
6. 其他公用信息
- 标识参数 :
pps_pic_parameter_set_id
:PPS自身ID(0~63)。pps_seq_parameter_set_id
:引用的SPS ID(对应sps_seq_parameter_set_id
)。
- 参考图像数 :
- P帧/B帧默认参考索引数(
num_ref_idx_l0_default_active_minus1
/num_ref_idx_l1_default_active_minus1
)。
- P帧/B帧默认参考索引数(
- 并行处理参数 :合并模式候选列表的并行生成等级(
log2_parallel_merge_level_minus2
,影响运动矢量预测效率)。 - 变换矩阵覆盖 :是否存在覆盖SPS的变换矩阵数据(
pps_scaling_list_data_present_flag
)。
PPS与SPS的关系
- 层级覆盖:PPS参数优先级高于SPS,例如QP偏移、Tile划分等图像级参数优先使用PPS设置。
- 作用域:SPS作用于整个CVS(编码视频序列),而PPS仅作用于单幅图像,支持动态调整编码参数(如不同场景使用不同滤波或量化策略)。
通过PPS的灵活配置,H.265可针对单幅图像优化编码效率,平衡画质与码率,适应复杂场景的动态需求。




PPS语法元素详解

1. 标识与引用参数
语法元素 | 描述 |
---|---|
pps_pic_parameter_set_id |
PPS标识符(0~63),唯一标识一个PPS。 |
pps_seq_parameter_set_id |
引用的SPS的ID(0~15),指向关联的序列参数集。 |
2. 片(Slice)控制参数
语法元素 | 描述 |
---|---|
dependent_slice_segments_enabled_flag |
判断当前片段是否为依赖片(存在依赖关系的slice segment)。 |
output_flag_present_flag |
片头部是否包含pic_output_flag ,影响图像输出顺序和缓存管理。 |
num_extra_slice_header_bits |
片头部额外比特数(0~2),预留未来扩展。 |
sign_data_hiding_enabled_flag |
是否允许符号位隐藏技术(用于数据隐藏或纠错)。 |
cabac_init_present_flag |
是否存在CABAC初始化标志,控制熵编码上下文初始化方式。 |
3. 参考图像与预测参数
语法元素 | 描述 |
---|---|
num_ref_idx_l0_default_active_minus1 |
P/B片默认参考索引数(L0方向,0~14)。 |
num_ref_idx_l1_default_active_minus1 |
P/B片默认参考索引数(L1方向,0~14)。 |
weighted_pred_flag |
P片是否启用加权预测(1=启用,0=禁用)。 |
weighted_bipred_flag |
B片是否启用双向加权预测(1=启用,0=禁用)。 |
4. 量化参数(QP)控制
语法元素 | 描述 |
---|---|
init_qp_minus26 |
亮度分量初始QP值(实际QP=26+该值,范围:-26~25)。 |
cu_qp_delta_enabled_flag |
是否允许CU级QP调整(1=允许,0=禁止)。 |
diff_cu_qp_delta_depth |
QP调整范围深度,影响CTB与最小编码块的尺寸差。 |
pps_cb_qp_offset /pps_cr_qp_offset |
色度分量QP相对于亮度的偏移量(-12~12)。 |
pps_slice_chroma_qp_offsets_present_flag |
片头部是否包含色度QP偏移参数。 |
5. 变换与滤波参数
语法元素 | 描述 |
---|---|
transform_skip_enabled_flag |
是否允许变换跳过模式(1=允许,0=禁止)。 |
transquant_bypass_enabled_flag |
是否允许跳过变换和滤波(1=允许,0=禁止)。 |
deblocking_filter_control_present_flag |
是否存在去方块滤波控制信息。 |
pps_deblocking_filter_disabled_flag |
全局禁用去方块滤波(1=禁用,0=启用)。 |
pps_beta_offset_div2 /pps_tc_offset_div2 |
去方块滤波补偿参数(除以2,-6~6)。 |
6. Tile划分参数
语法元素 | 描述 |
---|---|
tiles_enabled_flag |
是否启用Tile划分(1=启用,0=单Tile)。 |
num_tile_columns_minus1 |
Tile列数(列数=该值+1,范围:0~PicWidthInCtbsY-1)。 |
num_tile_rows_minus1 |
Tile行数(行数=该值+1,范围:0~PicHeightInCtbsY-1)。 |
uniform_spacing_flag |
Tile边界是否均匀分布(1=均匀,0=自定义)。 |
column_width_minus1[i] |
第i列Tile宽度(CTB为单位,非均匀分布时有效)。 |
loop_filter_across_tiles_enabled_flag |
是否允许跨Tile边界滤波(1=允许,0=禁止)。 |
7. 并行与扩展参数
语法元素 | 描述 |
---|---|
log2_parallel_merge_level_minus2 |
并行合并等级,影响运动矢量预测效率(取值:0~CtbLog2SizeY-2)。 |
pps_scaling_list_data_present_flag |
是否存在缩放矩阵(1=存在,覆盖SPS中的矩阵)。 |
pps_extension_present_flag |
是否存在扩展语法元素(如多层编码、3D扩展等)。 |
8. 熵编码与同步参数
语法元素 | 描述 |
---|---|
entropy_coding_sync_enabled_flag |
是否启用熵编码同步机制(1=启用,提高抗误码能力)。 |
lists_modification_present_flag |
片头部是否包含参考图像列表修改信息。 |
关键逻辑关系
- 参数覆盖规则:PPS参数优先级高于SPS,例如QP偏移、Tile划分等图像级配置会覆盖序列级设置。
- 作用域限制:PPS仅作用于单幅图像,解码完成后其激活状态终止,下一幅图像可引用不同PPS。
- 码流一致性 :同一CVS内的PPS需保持
tiles_enabled_flag
等全局参数一致,避免解码冲突。
通过PPS的精细化控制,H.265能够针对不同图像特性动态调整编码策略,在画质、码率和复杂度之间实现优化平衡。
档次、层、级别
5. 档次、层、级别
档次(Profile)
档次规定了编码器可使用的编码工具集,决定了码流的基本特性。H.265定义了以下三种档次:
档次名称 | 位深支持 | 采样格式 | 典型应用场景 |
---|---|---|---|
Main | 8bit | 4:2:0 | 网络流媒体、常规视频存储 |
Main 10 | 8bit/10bit | 4:2:0 | 高清广播、专业视频制作(如10bit HDR) |
Main Still Picture | - | - | 单帧图像编码(如相机快照、视频截图) |
特性说明:
- Main 10兼容性:支持Main 10的解码器必须兼容Main档次码流。
- 静止图像:Main Still Picture基于Main档次,仅编码单帧,优化静态场景压缩效率。
层(Tier)
层是H.265新增的概念,用于区分码流的性能需求,分为两类:
层名称 | 应用场景 | 典型支持级别 |
---|---|---|
主层(Main Tier) | 大多数常规应用(如1080p视频) | Level 1 ~ Level 3.1 |
高层(High Tier) | 高负载场景(如4K/8K、高帧率视频) | Level 4 ~ Level 6.2 |
关键区别:
- 高层支持更高的分辨率、码率和采样率,对解码器性能要求更高。
级别(Level)
级别通过限制关键参数(如分辨率、码率、缓存大小)确保解码器兼容性,H.265定义了13个级别(1 ~ 6.2)。以下为部分级别关键参数对比:
级别 | 最大亮度图像尺寸(像素) | 主层最大码率(Mbps) | 高层最大码率(Mbps) | 最小压缩比 |
---|---|---|---|---|
1 | 36,864 | 0.128 | - | 2 |
2 | 122,880 | 1.5 | - | 2 |
3.1 | 983,040 | 10 | - | 2 |
4 | 2,228,224 | 12 | 30 | 4 |
5.1 | 8,912,896 | 40 | 160 | 8 |
6.2 | 35,651,584 | 240 | 4800 | 8 |
核心规则:
- 向下兼容:支持某一级别的解码器可解码低于该级别或同级别、同层的码流。
- 参数限制:级别越高,允许的分辨率、码率和压缩比上限越高(如Level 6.2支持8K分辨率和4800 Mbps码率)。
兼容性与应用建议
- 解码器能力 :
- 支持Main Tier的设备可处理Level 1~3.1的码流(如手机、普通PC)。
- 支持High Tier的设备需额外处理Level 4+的高带宽需求(如专业显卡、8K播放器)。
- 编码策略 :
- 通用场景选择Main Profile + 主层 + Level 3.1(适配多数设备)。
- 高清/超高清场景使用Main 10 Profile + 高层 + Level 5.1/6.2(需确认接收端支持)。
通过档次、层、级别的组合,H.265实现了从低功耗设备到高端硬件的全场景覆盖,平衡了编码效率与设备兼容性。
三个档次的关系如下图:

层(Tier)和级别(Level)
H.265/HEVC定义了2个层和13个级别。2个层分别是Main Tier和High Tier。4和4以上的8个Level⽀持High Tier。下表给出了不同档次和级别的语法元素:
Level | Max Luma Picture Size (samples) | Max Luma Sample Rate (samples/s) | Main Tier Max Bit Rate (1000 bits/s) | High Tier Max Bit Rate (1000 bits/s) | Min Comp. Ratio |
---|---|---|---|---|---|
1 | 36864 | 552960 | 128 | - | 2 |
2 | 122880 | 3686400 | 1500 | - | 2 |
2.1 | 245760 | 7372800 | 3000 | - | 2 |
3 | 552960 | 16588800 | 6000 | - | 2 |
3.1 | 983040 | 33177600 | 10000 | - | 2 |
4 | 2228224 | 66846720 | 12000 | 30000 | 4 |
4.1 | 2228224 | 133693440 | 20000 | 50000 | 4 |
5 | 8912896 | 267386880 | 25000 | 100000 | 6 |
5.1 | 8912896 | 534773760 | 40000 | 160000 | 8 |
5.2 | 8912896 | 1069547520 | 60000 | 240000 | 8 |
6 | 35651584 | 1069547520 | 60000 | 240000 | 8 |
6.1 | 35651584 | 2139095040 | 120000 | 480000 | 8 |
6.2 | 35651584 | 4278190080 | 240000 | 800000 | 8 |
语法元素
下⾯是H.265/HEVC中定义的档次、层和级别的语法元素。


相关语法元素说明
- general_profile_space:取值固定为0,其他值预留作未来扩展用途。
- general_tier_flag:用于规定当前档次中所使用层的具体内容。
- general_profile_idc:取值为0时,表示当前CVS(编码视频序列)编码过程中所使用档次的ID号 ,其他值留待未来扩展。
- general_profile_compatibility_flag[ j ] :当
general_profile_space
等于0时,该语法元素取值为1,意味着当前CVS编码过程中使用的档次ID号为j。 - general_progressive_source_flag和general_interlaced_source_flag:用于指定CVS的扫描方式,可表示逐行扫描、隔行扫描或者未明确指明扫描方式。
- general_non_packed_constraint_flag:用于指明CVS中是否存在frame packing arrangement SEI messages(帧封装排列补充增强信息消息 )。
- general_frme_only_constraint_flag :用于指定
field_seq_flag
是否为0 。 - general_level_idc:用于指明CVS中所使用level(级别)的ID号 。
- sub_layer_profile_present_flag[ i ] :用于表明在TemporalId等于i的子层中,其
profile_tier_level( )
是否存在profile(档次)信息 。 - sub_layer_level_present_flag[ i ] :用于表明在TemporalId等于i的子层中,其
profile_tier_level( )
是否存在level(级别)信息 。
H265数据示例
利⽤UItraEdit⼯具打开⼀个H265⽂件进⾏数据分析,如下图所示:

如上图所示,我们可以清晰的看到在H265码流中,是以"0x00 0x00 x00 0x01"为开始码的,找到开始码后,后⾯的两个字节表示NALU Header,上图所示分别标注了VPS、SPS、PPS、IDR类型。