【音视频】H265 NALU分析

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等)。
  • 特殊模式开关
    • 4:4:4采样的三通道单独编码(separate_colour_plane_flag)。
    • 帧内强滤波(strong_intra_smoothing_enabled_flag)。
    • 非对称划分模式(AMP,amp_enabled_flag)与时域MV预测(sps_temporal_mvp_enabled_flag)。
  • 编码工具 :量化矩阵使用(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)。
  • 并行处理参数 :合并模式候选列表的并行生成等级(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 片头部是否包含参考图像列表修改信息。

关键逻辑关系

  1. 参数覆盖规则:PPS参数优先级高于SPS,例如QP偏移、Tile划分等图像级配置会覆盖序列级设置。
  2. 作用域限制:PPS仅作用于单幅图像,解码完成后其激活状态终止,下一幅图像可引用不同PPS。
  3. 码流一致性 :同一CVS内的PPS需保持tiles_enabled_flag等全局参数一致,避免解码冲突。

通过PPS的精细化控制,H.265能够针对不同图像特性动态调整编码策略,在画质、码率和复杂度之间实现优化平衡。

档次、层、级别

参考博客:https://blog.csdn.net/Dillon2015/article/details/104311186?fromshare=blogdetail&sharetype=blogdetail&sharerId=104311186&sharerefer=PC&sharesource=Antonio915&sharefrom=from_link

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码率)。
兼容性与应用建议
  1. 解码器能力
    • 支持Main Tier的设备可处理Level 1~3.1的码流(如手机、普通PC)。
    • 支持High Tier的设备需额外处理Level 4+的高带宽需求(如专业显卡、8K播放器)。
  2. 编码策略
    • 通用场景选择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类型。

相关推荐
s153351 小时前
8.RV1126-OPENCV 视频中添加LOGO
人工智能·opencv·音视频
sukalot4 小时前
window 显示驱动开发-提供视频解码功能(二)
音视频
Oliverro8 小时前
EasyRTC嵌入式音视频通信SDK音视频功能驱动视频业务多场景应用
人工智能·音视频
楠目9 小时前
MP4文件声音与视频分离
音视频·pr剪辑
WebCsDn_TDCode10 小时前
正则表达式检测文件类型是否为视频或图片
javascript·正则表达式·音视频
阿幸软件杂货间10 小时前
video-audio-extractor:视频转换为音频
音视频
阿飞__12 小时前
C++ 使用 ffmpeg 解码本地视频并获取每帧的YUV数据
c++·ffmpeg·音视频
技术小丁12 小时前
让音乐“看得见”:使用 HTML + JavaScript 实现酷炫的音频可视化播放器
javascript·html·音视频
m0_7482451713 小时前
KrillinAI:视频跨语言传播的一站式AI解决方案
人工智能·音视频
蹦蹦跳跳真可爱58913 小时前
计算机视觉处理----OpenCV(从摄像头采集视频、视频处理与视频录制)
人工智能·python·opencv·计算机视觉·音视频