RV1126 NO.15:H265码流结构的分析

一.H265的优势和特点

H265编码(也称之为HEVC编码),它是继H264之后所制定的一个全新的视频编码标准。H265保留了许多H264的技术,并在H264的基础上使用了全新的技术来改善编码质量和画面质量。H265的优势在于超高的压缩比(压缩比高达1:200)编码超高清的分辨率,如:4K分辨率(3840 * 2160)、8K分辨率(7680 * 4320),一般只有在编码超高清分辨率的时候才会用到H265编码,普通的分辨率如:1920 * 1080以下的分辨率只需要H264即可(这是由于H265虽然压缩比非常高,但是它的算法复杂程度也远超H264,对于一般播放器来说CPU运算也过于复杂)。

1.1.H265的帧内预测

H265的帧内预测比H264更加灵活,H264帧内预测只支持16 * 16的宏块。但是H265能够支持支持多种尺寸的宏块预测,包括4 * 48 * 816 * 1632 * 32多种宏块的预测。 下面我们来看看,两种编码格式的区别。

从上面两张图我们可以看出来,H264视频文件处理的宏块基本上都是固定16 * 16。而H265视频文件处理的宏块范围就比较广了,从4 * 4到32 * 32的宏块都可以进行编码。那么宏块广泛的好处就是H265编码的细节就会更加清晰,对绝大部分物体都可以进行清晰编码,这一点比H264编码要强。如下图:

除了多种尺寸的宏块预测外,HEVC总共还提供了35种预测模式,对比H264的9种帧内预测模式。H265的帧内预测模式是H264的4倍以上。下面我们来看看,HEVC的35种帧内预测模式。

从上面这张图我们可以看出来,35种帧内预测模式本质上可以分成三种帧内预测模式。0:Planner模式,它主要适用于像素变化缓慢区域,它和其他模式相比能够动态调节视频质量。1:DC模式,主要适用于大面积平坦区域;2-34就是33种角度预测,如图3,从这张图我们来看看,这33种角度模式,相当于33个角度向量的预测。

画一张图理解一下:

1.2.H265的帧间预测 

在HEVC中,帧间预测单元PU总共有8种划分方式,包括4种对称方式:2Nx2N、2NxN、Nx2N、NxN和4种非对称模式:2NxnN、2NxnD、nLx2N、nRx2N(如图1)。PU指的是帧间预测的基本单元,每个单元通过帧间预测获得一组运动数据。HEVC定义了两种帧间预测模式:分别是帧间模式(inter mode)、合并模式(merge mode)。

1.2.1.Merge模式:

Merge模式会为当前预测单元建立一个MV候选表,在列表中存在着5个候选MV。通过遍历5个候选MV,同时进行失真率计算,最终选择失真率最低的MV作为最优的MV。假设编/解码依旧相同的候选表,编码器只需要传输最优MV索引,这样就可以大幅度节省运动信息传输数。(MV指的是运动向量)

在空域领域最多提供4个候选MV,最多使用5个候选中的4个候选块的运动信息,如列表所示按照A1-B1-B0-A0的顺序建立起来。这其中B2属于替补位置,当A1、B1、B0、A0中只有一个或者多个不存在的时候,此时就需要用到B2。下面我们来看看,时域候选列表的建立过程,它的过程如下:利用当前PU在邻近已编码图像中找到对应的PU位置的运动信息,相比于空域,时域候选表不能直接使用候选块的信息,它是需要根据参考图像位置来做对应的比例伸缩调整。

curr_PU表示的是当前PU(预测单元)、col_PU表示的是同位PU, td和tb分别表示图像cur_pic、同位col_pic与二者参与图像cur_ref、col_ref之间的距离,当前的PU时域候选MV计算公式为:curPU = (td/tb)*colPU; 

1.2.2. ​​​​​​​​​​​​​​Inter模式:

Inter模式也称之为AMVP模式(高级运动向量预测),它是利用空域、时域上运动变量的相关性,并且为当前PU建立了候选的预测MV列表。HEVC编码器会从中选出最优的预测MV。HEVC编码器从中选择最优质的预测MV,并对MV进行编码。下面我们来看看inter模式如何计算当前PU。

从上面这张图我们可以看出,inter处理过程是从空域MV列表5个里面选择2个,时域MV列表2个选择1个,紧接着去除重复的MV,然后填补零矢量(填补0,0),保留候选列表中前2个MV,最后选择出最优MV。

注意:这里要科普两个东西分别是空域和时域

空域:指的是像素域,换言之空域处理就是在像素级别进行处理,比方说像素叠加等等。

时域:自变量是时间,换言之横轴是时间,纵轴是信号的变化

二.H265重点帧类型的讲解

在H265中,绝大部分的结构都和H264是一样,但是H265码流增加了一个NALU结构,那就是VPS。VPS的主要作用是对传输的视频进行分级,视频分级的最主要作用是有利于兼容标准在多视点视频的扩展,下面是一个经典H265的NALU结构。

2.1. VPS:视频参数集(NALU:00 00 00 01 40 01),VPS主要用于传输视频的分级信息,它用于兼容可分级视频编码和多视点的扩展。H265中加入该结构主要目的是兼容标准在系统多字方面的扩展。可分级编码主要解决的是根据网络情况的好坏来判断传输什么类型的数据,比方说在弱网环境下可分级编码可以使得视频数据只保留基本的信息进行传输,并实时根据网络的情况动态来决定是否传输增强的视频信息从而使得图像质量得以提升,我们来看看每个VPS里面的内容。

2.1.1. vps_video_parameter_set_id:当前的VPS标识号

2.1.2. vps_reserved_three_2bits:保留位,其值为3

2.1.3. vps_max_layers_minus1:当前保留位其数值为0,主要用于3D视频的编码或者可分级视频编码使用。

2.1.4. vps_max_sub_layers_minus1:表示比特流中可支持子层的最大数目减一,最大可以支持7个子层。

2.1.4. vps_temporal_id_nesting_flag:vps_max_sub_layers_minus1等于0时,这个参数为1;当vps_max_sub_layers_minus1大于0时,这个参数指定是否对帧间预测进行限定。该参数主要用于子层升档,相当于从低子层升级到高子层。

2.1.5. vps_reserved_0xffff_16bits:两字节的保留位

vps_sub_layer_ordering_info_present_flag:等于1的时候,vps_max_dec_pic_buffering_minus[1]vps_max_num_reorder_pics[1]、vps_max_latency_incresing_plus[1]并用于vps_max_sub_layers_minus1 + 1子层;当这个值等于0的时候,三个语法都可以用于所有子层。

2.1.6. vps_max_dec_pic_buffering_minus1[i]:当HighestTid等于i的时候,CVS图像存储单元中解码图像所需要的最大缓存。

2.1.7. vps_max_num_reorder_pics[i]:规定了HighestTid等于i的时候,在CVS解码顺序在某一副图像之中,而显示顺序在该图像之前的最大数量

2.1.8. vps_max_latency_incresing_plus1[i]:当HighestTid等于i时,该语法元素用于计算VpsMaxLatencyPictures[i]的数值

2.1.9. vps_max_layer_id:指定CVS所有的NAL单元nuh_layer_id的最大值

2.1.10. vps_num_layer_sets_minus1:指定VPS中图层集的数量该语法被要求是0。解码器的范围是0-1023之间的值

2.1.11. 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不存在上面这四个元素

2.2. SPS:序列参数集(NALU:00 00 00 01 42 01),一段H265视频码流可能包含一个或者多个编码的视频序列号。SPS的内容包含了一个CVS里面所有编码图像的编码参数,SPS通过被PPS引用并且作用在编码图像,值得注意的是一个CVS中所有被使用的PPS必须引用到同一个SPS里面。实际上,SPS为编码图像提供了公共参数,如图像格式,档次,编码等级,若一个SPS被引用的时候,整个SPS都处于激活状态。

2.2.1. sps_video_parameter_set_id:指定当前激活的VPS的ID号

2.2.2. sps_max_sub_layers_minus1:用于指定时域子层的最大数目

2.2.3. sps_temporal_id_nesting_flag:当sps_max_sub_layers_minus1大于0的时候,其规定是否额外限制帧间预测的范围。当sps_max_sub_layers_minus1为0时,该语法取值是1。

2.2.4. sps_seq_parameter_set_id:表示当前SPS的ID号,取值范围是[0,15]

2.2.5. chroma_format_idc:表示色度采样格式,取值范围是[0,3]。

2.2.6. pic_width_in_luma_samples:解码图像中的亮度样点的宽度

2.2.7. pic_height_in_luma_samples:解码图像中的亮度样点的高度

2.2.8. conformance_window_flag:解码器是否要对解码后的数据进行裁剪。当这个值等于1时,conf_win_left_offset、conf_win_right_offset、conf_win_top_offset、conf_win_bottom_offset这四个参数就会用到。

2.2.9. bit_depth_luma_minus8:表示亮度像素的比特深度

2.2.10. bit_depth_chroma_minus8:表示色度像素的比特深度

2.2.11. log2_max_pic_order_cnt_lsb_minus4:该语法元素的取值范围是[0,12],它用于计算变量MaxPicOrderCntLsb。MaxPicOrderCntLsb用于控制进位,在HEVC比特流中只传入一个低位的POC,而不需要传入高位的POC。

2.2.12. sps_sub_layer_ordering_info_present_flag:时域子层顺序标识开关。这值等于1,表示sps_max_dec_pic_buffering_minus[i]、sps_max_num_reorder_pics[i]、sps_max_latency_increase_plus[1]适用于sps_max_sub_layers_minus1+1子层;若该数值等于0,则表示这些参数适用于子层。

2.2.13. log2_min_luma_coding_block_size_minus3:指定亮度编码块的最小尺寸

2.2.14. log2_diff_max_min_luma_coding_block_size:指定亮度编码块最大尺寸和最小尺寸的差值

2.2.15. log2_min_transform_block_size:指定亮度变换块最大尺寸和最小尺寸差值

2.2.16. log2_diff_max_min_transform_block_size:指定亮度变换块的最大尺寸和最小尺寸差值

2.2.17. max_transform_hierarchy_depth_inter:表示帧间预测变换块的最大划分深度,取值范围是[0, CtbLog2SizeY - Log2MinTrafoSize]

2.2.18. max_transform_hierarchy_depth_intra:表示帧内预测变换块的最大划分深度,取值范围是[0, CtbLog2SizeY - Log2MinTrafoSize]

2.2.19. scaling_list_enable_flag:表示对变换系数在量化过程中是否使用量化矩阵。

2.2.20. amp_enable_flag:是否使用非对称划分模式,非对称模式有四种分别是PART_2NxnU、PART_2NxnD、PART_nLx2N、PART_nRx2N

2.2.21. sample_adaptive_offset_enable_flag:表示去方块滤波过程后的图像重构是否自适应补偿

2.2.22. pcm_enable_flag:是否使用pcm模式

2.2.23. num_short_term_ref_pic_set:表示sps中short_term_ref_pic_ste的数目,取值范围是[0,64]

2.2.24. long_term_ref_pics_present_flag:表示帧间预测是否使用长期参考图像

2.2.25. sps_temporal_mvp_enable_flag:指定非IDR图像片头中是否存在slice_temporal_mvp_enable_flag

2.2.26. strong_intra_smoothing_enable_flag:表示滤过的时候,是否使用双向性插值

2.2.27. vui_parameters_present_flag:表示是否含有语法vui_parameters()

2.3. pps:图像参数集(NALU:00 00 00 01 44 01)在HEVC中会包含多个图像,每一张图像会提供所引用的PPS标识符,以此会得到PPS的共用信息。需要注意的是,pps中存在许多和sps相同的参数,在pps中这些参数有可能会直接覆盖sps的取值。换言之,在HEVC开始解码的时候,所有的PPS参数都是非活动状态,当解码过程中某一张图片在解码过程中引用了某个pps参数的时候,这个PPS就会处于激活状态直到图像解码结束。

2.3.1. pps_pic_parameter_set_id:当前激活的PPS ID号,取值范围是[0,63]

2.3.2. pps_seq_parameter_set_id:当前激活的SPS ID号,取值范围是[0,15]

2.3.3. dependent_slice_segments_enable_flag:表示slice头中是否存在句法dependent_slice_segment_flag,并用于判断当前片段是否有依赖片

2.3.4. output_flag_present_flag:表示Slice头中是否存在句法pic_output_flag、pic_output_flag影响解码图像的输出

2.3.5. num_extra_slice_headers_bits:其数值为0,表示Slice头部中没有额外的Slice头比特

2.3.6. sign_data_hiding_enable_flag:表示是否不允许使用符号位隐藏技术

2.3.7. cabac_init_present_flag:表示片头中是否存在cabac_init_flag、此标志位用于判断在CABAC中使用何种方法初始化变量

2.3.8. num_ref_idx_10_default_active_minus1:该语法元素取值范围是[0,14],表示在num_ref_idx_active_override_flag等于0,P Slice和B Slice中num_ref_idx_l0_active_minus1默认值。

2.3.9. num_ref_idx_11_default_active_minus1:该语法元素取值范围是[0,14],表示在num_ref_idx_active_override_flag等于0,num_ref_idx_11_default_active_minus1的默认值,也就是引用list1中参考图像数目的最大默认值。

2.3.10. init_qp_minus26:规定了每个Slice亮度分量的量化参数初始值

2.3.11. constrained_intra_pred_flag:表示帧内预测是否受限制,就是是否允许采用帧间预测模式的临近块信息进行帧内预测

2.3.12.transform_skip_enabled_flag:指定在残差编码语法中是否存在transform_skip_flag,transform_skip_flag用于表示残差编码是否为transform_skip模式

2.3.13.cu_qp_delta_enable_flag:取值1,表示当前PPS存在difff_cu_qp_delta_depth,并且在变换单元句法可能存在

2.3.14.pps_cb_qp_offset:表示色度分量Cb采用量化参数(Qp’cb模式)

2.3.15.pps_cr_qp_offset:表示色度分量Cr采用量化参数(Qp’cr模式)

2.3.16.pps_slice_chroma_qp_offsets_present_flag:Slice头中是否存在slice_cb_qp_offset和slice_cr_qp_offset,这两个参数用来计算量化参数QpCb和QpCr。

2.3.17.weighted_pred_flag:表示P Slice是否使用加权预测

2.3.18.weighted_bipred_flag:表示B Slice是否使用双向加权预测

2.3.19.transquant_bypass_enable_flag:表示是否存在cu_transquant_bypass_flag,cu_transquant_bypass_flag用于判断是否存在cu_transquant_bypass模式,换言之是否调过滤波变化

2.3.20.tiles_enable_flag:表示是够使用tile模式

2.3.21.entropy_coding_sync_enable_flag:是否使用编码同步机制

2.3.22.pps_loop_filter_across_slices_enabled_flag:是否允许环路滤波跨越Slice左边界和上边界

2.3.23.deblocking_filter_control_present_flag:表示PPS中是否存在去方块滤波控制信息

2.3.24.pps_scaling_list_data_present_flag:表示当前PPS中是否存在变换矩阵的信息,若存在,在一信息中会对SPS中的信息进行覆盖

2.3.25.lists_modification_present_flag:表示Slice头中是否存在结构ref_pic_lists_modification()

2.3.26.log2_parallel_merge_level_minus2:给出变量Log2ParMrgLevel的值,变量Log2ParMrgLevel被用在merge模式下亮度分量MV产生过程

2.3.27.slice_segment_header_extension_present_flag:表示SS头部扩展元素是否存在,在这个版本中取值为0。若取值为1,用做保留,提供给ITU-T和ISO/IEC使用

2.3.28.pps_extension_flag:表示是否存在语法元素pps_extension_data_flag,默认取值为0。若取值为1,用做码流ITU-T以及ISO/IEC来使用

2.4.SEI帧:

HEVC的SEI帧(它的NALU是:00 00 00 01 4e 01)和H264的SEI帧功能是一样的,也是在HEVC中添加额外的信息如:字幕、表情、时间戳等等的信息。下面我们来看看SEI的组成部分:

00 00 01 4E 01 + 05 + payloadSize + sei_payload

00 00 01 4E 01:表示的是NALU是SEI类型

05:SEI的 payload type,这里的sei payload遵循user_data_unregistered()语法

PayloadSize:05后面的这个值是SEI的长度,SEI的长度是包含了UUID+PAYLOAD_CONTENT的总长度

SEI_PAYLOAD:SEI的内容包含了UUID和PAYLOAD_CONTENT。

2.5.I帧

HEVC的I帧,NALU是(00 00 00 01 26 01)。HEVC的I帧和H264的I帧也是同样的概念,同样也是表示一副完整的图片。

好的,说到这,大家可能还是有点懵,我用通俗易懂的话语解释一下H265码流结构:

H.265(也叫HEVC)的码流结构就像一个精心打包的“视频快递箱”,里面用分层文件夹、说明书和零件包,把视频数据高效地压缩起来。咱们用生活化的比喻拆解它的结构:

1. 最外层:NAL单元(快递箱)

  • 整个码流被切成一个个小包裹(NAL Unit),每个包裹有独立标签,告诉解码器“这是啥内容”。
  • 比如:标签写“参数说明书”的包裹必须先看,写“视频片段”的包裹后面再拆。

2. 参数集说明书(关键配置)

  • VPS(视频参数集):整个视频的“总目录”,比如总分辨率、帧率、层数(比如3D视频可能有多层)。
  • SPS(序列参数集):每一季电视剧的“分季手册”,定义这一季的通用参数(比如这一季都用1080P)。
  • PPS(图像参数集):每一集的“单集指南”,比如这集是否用特殊滤镜、亮度怎么调。

💡 比喻:就像看剧前先翻总目录、分季手册,再读单集指南,解码器需要先读这些“说明书”才能看懂后续内容。

3. 视频数据主体(乐高积木块)

  • CTU(编码树单元):一个大积木块(比如64x64像素),是H.265处理的最小单位。
  • CTU拆解:大积木可以拆成更小的块(CU/PU/TU):
    • CU(编码单元):像乐高拆分成小方块(8x8到64x64可选),决定“这块区域怎么压缩”。
    • PU(预测单元):选择预测方式(比如“参考前面帧”或“自己算细节”)。
    • TU(变换单元):对残差数据(预测误差)做数学压缩。

💡 比喻:就像拼乐高,大块拆成小块,每块决定用哪种方式拼(比如平铺、叠加),最后再压缩体积。

4. 帧类型(视频的关键页)

  • I帧(关键帧):像书的封面,独立完整,不依赖其他帧,但体积大。
  • P帧(预测帧):像书的正文页,只记录“与前一页的变化”,体积小。
  • B帧(双向预测帧):更聪明的页,能同时参考前面和后面的页,压缩率最高。

💡 比喻:I帧是独立章节,P帧是“承接上文”,B帧是“承上启下”,B帧越多视频越小,但解码稍复杂。

5. 高级工具包(可选配件)

  • Tiles:把画面切成多个“小格子”,解码时可以并行处理(比如多核CPU分工)。
  • WPP(波前并行):像流水线作业,一行像素处理完马上传给下一行,减少等待时间。

💡 比喻:Tiles是分装到不同盒子,WPP是传送带加速,目的都是让解码更快。

总结:H.265为啥更高效?

  1. 分层更细:从CTU到TU的四级拆解,精准压缩每个区域。
  2. 预测更智能:B帧和双向预测减少冗余。
  3. 并行友好:Tiles和WPP让多核设备解码更快。

就像用更小的收纳盒、智能分类标签和并行整理术,H.265在同样画质下把视频体积压缩到H.264的一半,但代价是编码复杂度翻倍(需要更强的处理器)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值