当前位置: 首页 > article >正文

【音视频】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_bit1禁止位,默认 0,错误时置 1。
nal_unit_type6NALU 类型(如 VPS=32,SPS=33,PPS=34,I 帧 = 16-21 等)。
nuh_layer_id6层 ID,预留扩展位,默认 0。
nuh_temporal_id_plus13时域 ID,值为实际 ID+1。

nal_unit_type 表

nal_unit_typeName of nal_unit_typeContent of NAL unit and RBSP syntax structureNAL unit type class
0TRAIL_NCoded slice segment of a non - TSA, non - STSA trailing picture slice_segment_layer_rbsp()VCL
1TRAIL_RCoded slice segment of a non - TSA, non - STSA trailing picture slice_segment_layer_rbsp()VCL
2TSA_NCoded slice segment of a TSA picture slice_segment_layer_rbsp()VCL
3TSA_RCoded slice segment of a TSA picture slice_segment_layer_rbsp()VCL
4STSA_NCoded slice segment of an STSA picture slice_segment_layer_rbsp()VCL
5STSA_RCoded slice segment of an STSA picture slice_segment_layer_rbsp()VCL
6RADL_NCoded slice segment of a RADL picture slice_segment_layer_rbsp()VCL
7RADL_RCoded slice segment of a RADL picture slice_segment_layer_rbsp()VCL
8RASL_NCoded slice segment of a RASL picture slice_segment_layer_rbsp()VCL
9RASL_RCoded slice segment of a RASL picture slice_segment_layer_rbsp()VCL
10RSV_VCL_N10Reserved non - IRAP SLNR VCL NAL unit typesVCL
12RSV_VCL_N12Reserved non - IRAP SLNR VCL NAL unit typesVCL
14RSV_VCL_N14Reserved non - IRAP SLNR VCL NAL unit typesVCL
11RSV_VCL_R11Reserved non - IRAP sub - layer reference VCL NAL unit typesVCL
13RSV_VCL_R13Reserved non - IRAP sub - layer reference VCL NAL unit typesVCL
15RSV_VCL_R15Reserved non - IRAP sub - layer reference VCL NAL unit typesVCL
16BLA_W_LPCoded slice segment of a BLA picture slice_segment_layer_rbsp()VCL
17BLA_W_RADLCoded slice segment of a BLA picture slice_segment_layer_rbsp()VCL
18BLA_N_LPCoded slice segment of a BLA picture slice_segment_layer_rbsp()VCL
19IDR_W_RADLCoded slice segment of an IDR picture slice_segment_layer_rbsp()VCL
20IDR_N_LPCoded slice segment of an IDR picture slice_segment_layer_rbsp()VCL
21CRA_NUTCoded slice segment of a CRA picture slice_segment_layer_rbsp()VCL
22RSV_IRAP_VCL22Reserved IRAP VCL NAL unit typesVCL
23RSV_IRAP_VCL23Reserved IRAP VCL NAL unit typesVCL
24 - 31RSV_VCL24 - RSV_VCL31Reserved non - IRAP VCL NAL unit typesVCL
32VPS_NUTVideo parameter set video_parameter_set_rbsp()non - VCL
33SPS_NUTSequence parameter set seq_parameter_set_rbsp()non - VCL
34PPS_NUTPicture parameter set pic_parameter_set_rbsp()non - VCL
35AUD_NUTAccess unit delimiter access_unit_delimiter_rbsp()non - VCL
36EOS_NUTEnd of sequence end_of_seq_rbsp()non - VCL
37EOB_NUTEnd of bitstream end_of_bitstream_rbsp()non - VCL
38FD_NUTFiller data filler_data_rbsp()non - VCL
39PREFIX_SEI_NUTSupplemental enhancement information sei_rbsp()non - VCL
40SUFFIX_SEI_NUTSupplemental enhancement information sei_rbsp()non - VCL
41 - 47RSV_NVCL41 - RSV_NVCL47Reservednon - VCL
48 - 63UNSPEC48 - UNSPEC63UnspecifiedVCL

控制数据流

  • 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_idu(4)
vps_base_layer_internal_flagu(1)
vps_base_layer_available_flagu(1)
vps_max_layers_minus1u(6)
vps_max_sub_layers_minus1u(3)
vps_temporal_id_nesting_flagu(1)
vps_reserved_0xffff_16bitsu(16)
profile_tier_level( 1, vps_max_sub_layers_minusl )-
vps_sub_layer_ordering_info_present_flagu(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_idu(6)
vps_num_layer_sets_minus1ue(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_flagu(1)
if( vps_timing_info_present_flag) { }-
vps_num_units_in_ticku(32)
vps_time_scaleu(32)
vps_poc_proportional_to_timing_flagu(1)
if( vps_poc_proportional_to_timing_flag )-
vps_num_ticks_poc_diff_one_minus1ue(v)
vps_num_hrd_parametersue(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_flagu(1)
if( vps_extension_flag )-
while( more_rbsp_data( ) )-
vps_extension_data_flagu(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 ]由下面方式生成:
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_idSPS 自身标识号(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_minus1PCM 模式下亮度样点比特深度(实际值 = 1 + 该值,如 0 对应 1bit)。
pcm_sample_bit_depth_chroma_minus1PCM 模式下色度样点比特深度(实际值 = 1 + 该值)。
log2_min_pcm_luma_coding_block_size_minus3PCM 编码块最小尺寸(单位同 CU 尺寸参数)。
log2_diff_max_min_pcm_luma_coding_block_sizePCM 编码块最大/最小尺寸差值(推导方式同 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_idPPS标识符(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_minus1P/B片默认参考索引数(L0方向,0~14)。
num_ref_idx_l1_default_active_minus1P/B片默认参考索引数(L1方向,0~14)。
weighted_pred_flagP片是否启用加权预测(1=启用,0=禁用)。
weighted_bipred_flagB片是否启用双向加权预测(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_depthQP调整范围深度,影响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_minus1Tile列数(列数=该值+1,范围:0~PicWidthInCtbsY-1)。
num_tile_rows_minus1Tile行数(行数=该值+1,范围:0~PicHeightInCtbsY-1)。
uniform_spacing_flagTile边界是否均匀分布(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定义了以下三种档次:

档次名称位深支持采样格式典型应用场景
Main8bit4:2:0网络流媒体、常规视频存储
Main 108bit/10bit4: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)最小压缩比
136,8640.128-2
2122,8801.5-2
3.1983,04010-2
42,228,22412304
5.18,912,896401608
6.235,651,58424048008

核心规则

  • 向下兼容:支持某一级别的解码器可解码低于该级别或同级别、同层的码流。
  • 参数限制:级别越高,允许的分辨率、码率和压缩比上限越高(如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。下表给出了不同档次和级别的语法元素:

LevelMax 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
136864552960128-2
212288036864001500-2
2.124576073728003000-2
3552960165888006000-2
3.19830403317760010000-2
422282246684672012000300004
4.1222822413369344020000500004
58912896267386880250001000006
5.18912896534773760400001600008
5.289128961069547520600002400008
6356515841069547520600002400008
6.13565158421390950401200004800008
6.23565158442781900802400008000008

语法元素

下⾯是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类型。

相关文章:

【音视频】H265 NALU分析

1 H265 概述 H264 与 H265 的区别 传输码率&#xff1a;H264 由于算法优化&#xff0c;可以低于 2Mbps 的速度实现标清数字图像传送&#xff1b;H.265 High Profile 可实现低于 1.5Mbps 的传输带宽下&#xff0c;实现 1080p 全高清视频传输。 编码架构&#xff1a;H.265/HEVC…...

运维 vm 虚拟机ip设置

虚拟网络设置 nat 模式 网卡 主机设置网卡地址 虚拟机绑定网卡...

飞牛fnNAS存储模式RAID 5数据恢复

目录 一、添加硬盘 二、创建RAID 5 存储空间 三、上传测试文件 四、拆除硬盘 五、更换硬盘 六、修复RAID 5 七、验证其内文件 八、NAS系统崩溃后的数据盘 前文《飞牛fnNAS存储空间模式详解》 中介绍了fnNAS存储空间的几个模式,细心的网友应该能感受到,我是非常推崇R…...

论文笔记:DreamDiffusion

【初中生也能看得懂的讲解】 想象一下&#xff0c;我们能不能直接用“脑子想”来画画&#xff1f;比如你想到一只猫&#xff0c;电脑就能画出一只猫。这听起来是不是很酷&#xff1f;科学家们一直在努力实现这个“意念画画”的梦想。 以前&#xff0c;科学家们可能会用一种叫…...

户外摄像头监控如何兼顾安全实时监控

一、技术手段提升隐私安全性 硬件与功能设计 采用支持隐私保护技术的设备&#xff0c;例如带电子开关的摄像头&#xff08;可远程控制摄像头启闭&#xff09;3&#xff0c;或搭载本地AI算法的设备&#xff0c;仅识别人形、车辆等目标&#xff0c;减少无关信息采集。 使用安全…...

Neo4j 备份与恢复:原理、技术与最佳实践

在数据驱动的应用中&#xff0c;图数据库Neo4j承载着至关重要的关联数据。确保其数据安全与业务连续性依赖于强大的备份与恢复策略。本文将深入探讨Neo4j备份恢复的核心原理、关键技术、实用技巧及行业最佳实践&#xff0c;内容基于官方最新文档。 构建健壮的 Neo4j 备份恢复体…...

简单实现Ajax基础应用

Ajax不是一种技术&#xff0c;而是一个编程概念。HTML 和 CSS 可以组合使用来标记和设置信息样式。JavaScript 可以修改网页以动态显示&#xff0c;并允许用户与新信息进行交互。内置的 XMLHttpRequest 对象用于在网页上执行 Ajax&#xff0c;允许网站将内容加载到屏幕上而无需…...

关于 java:3. Java 常用类库与数据结构

一、String 1.1 String 是什么&#xff1f; public final class String implements java.io.Serializable, Comparable<String>, CharSequence特点&#xff1a; 是 不可变对象&#xff08;immutable&#xff09; 是 final 类&#xff0c;不能被继承 内部使用 字符数组…...

数据挖掘顶刊《IEEE Transactions on Knowledge and Data Engineering》2025年5月研究热点都有些什么?

本推文对2025年5月出版的数据挖掘领域国际顶级期刊《IEEE Transactions on Knowledge and Data Engineering》进行了分析&#xff0c;对收录的62篇论文的关键词与研究主题进行了汇总&#xff0c;并对其中的研究热点进行了深入分析&#xff0c;希望能为相关领域的研究人员提供有…...

LabVIEW双光子显微镜开发

基于LabVIEW 开发高性能双光子显微镜系统&#xff0c;聚焦于生物样本深层成像与纳米材料三维表征。实现了超快激光控制、多维数据采集与实时图像重建。系统采用飞秒激光光源与高精度振镜扫描模块&#xff0c;结合 LabVIEW 的 FPGA 实时控制能力&#xff0c;可对活体组织、荧光纳…...

WordPress 6.5版本带来的新功能

WordPress 6.5正式上线了&#xff01;WordPress团队再一次为我们带来了许多新的改进。在全球开发者的共同努力下&#xff0c;WordPress推出了许多新的功能&#xff0c;本文将对其进行详细总结。 Hostease的虚拟主机现已支持一键安装最新版本的WordPress。对于想要体验WordPres…...

将材质球中的纹理属性对应的贴图保存至本地

通过Texture2D的EncodeToPNG方法将纹理转为图片形式 material.GetTexture方法通过属性名获取纹理贴图 material.SetTexture方法通过属性名设置纹理贴图 属性名可在shader代码中查看 using UnityEngine; using System.IO;public class TextureSaver : MonoBehaviour {public…...

Linux应用开发之网络套接字编程

套接字&#xff08;Socket&#xff09;是计算机网络数据通信的基本概念和编程接口&#xff0c;允许不同主机上的进程&#xff08;运行中的程序&#xff09;通过网络进行数据交换。它为应用层软件提供了发送和接收数据的能力&#xff0c;使得开发者可以在不用深入了解底层网络细…...

实现RabbitMQ多节点集群搭建

目录 引言 一、环境准备 二、利用虚拟机搭建 ​ 三、镜像集群配置 四、HAProxy实现负载均衡(主用虚拟机操作) 五、测试RabbitMQ集群搭建情况 引言 在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;扮演着至关重要的角色,而 RabbitMQ 作为…...

GLIDE论文阅读笔记与DDPM(Diffusion model)的原理推导

Abstract 扩散模型&#xff08;Diffusion model&#xff09;最近被证明可以生成高质量的合成图像&#xff0c;尤其是当它们与某种引导技术结合使用时&#xff0c;可以在生成结果的多样性与保真度之间进行权衡。本文探讨了在文本条件图像生成任务中使用扩散模型&#xff0c;并比…...

机器学习——放回抽样

为了构建树集成模型&#xff0c;需要一种叫做有放回采样的技术。 以4个标记为演示&#xff0c;分别是红色、黄色、绿色和蓝色&#xff0c;用一个黑色的袋子把这四个标记的例子放进去&#xff0c;然后从这个袋子里有放回地抽取四次&#xff0c;抽出一个标记&#xff0c;结果是绿…...

前端内存泄漏:原理、检测与防范实践

一、什么是内存泄漏 内存泄漏&#xff08;Memory Leak&#xff09;是指程序中已动态分配的堆内存由于某种原因未能被释放或无法被释放&#xff0c;造成系统内存的浪费&#xff0c;导致程序运行速度减慢甚至系统崩溃等严重后果。 在前端开发中&#xff0c;虽然现代浏览器具备垃…...

Go的隐式接口机制

正确使用Interface 不要照使用C/Java等OOP语言中接口的方式去使用interface。 Go的Interface的抽象不仅可以用于dynamic-dispatch 在工程上、它最大的作用是&#xff1a;隔离实现和抽象、实现完全的dependency inversion 以及interface segregation(SOLID principle中的I和D)。…...

UE音频中间件wwise插件

虚幻引擎用wwise插件有什么用? 没有这个插件不是也能播放声音吗? 为什么要用他? 在Unreal Engine&#xff08;UE&#xff09;中使用 Wwise 插件&#xff0c;不是因为 UE 不能做声音&#xff0c;而是因为 Wwise 更强、更专业&#xff0c;适合复杂的音频需求。 &#x1f3a7; …...

C++.cstring string

C.cstring string 1. C 中的字符串概述1.1 C 中字符串的两种表示方式C 中的 cstring示例代码 C 中的 string示例代码 1.2 C 中字符串的使用场景使用 cstring 的场景使用 string 的场景示例对比使用 cstring 的示例使用 string 的示例 2. C 中的 cstring2.1 cstring 的定义与基本…...

Spring AOP 和 AspectJ 有什么区别

1. 织入方式 Spring AOP&#xff1a; 运行时织入&#xff1a;Spring AOP 使用动态代理技术&#xff08;如 JDK 动态代理或 CGLIB 代理&#xff09;在运行时创建代理对象。 依赖 Spring 容器&#xff1a;仅支持 Spring 管理的 Bean。 AspectJ&#xff1a; 编译时织入&#xf…...

报表/报告组件(二)-实例与实现解释

上篇《报表/报告组件(一)-指标/属性组件设计》介绍了组件核心指标/属性设计&#xff0c;本文以实例介绍各个特性的实现和效果&#xff0c;实例是多个报告融合&#xff0c;显示所有的特性。 设计 指标/属性组件是报告/报表关键部分&#xff0c;上篇已介绍过&#xff0c;本节回顾…...

linux的实时性

Linux 的实时性取决于其内核配置和使用场景。标准 Linux 内核&#xff08;非实时内核&#xff09;在设计上更注重吞吐量和公平调度&#xff0c;而非严格的实时性。但通过以下方式可以显著提升其实时性能&#xff1a; 1. 标准 Linux 内核的实时性 优点&#xff1a; 适用于大多数…...

Opencv4 c++ 自用笔记 04 图像滤波与边缘检测

图像滤波与边缘检测 直接采集到的图像可能带有噪声的干扰&#xff0c;因此去除噪声是图像预处理中十分重要的一步。图像滤波是图像噪声去除的重要方式。 图像卷积 卷积操作广泛应用于信号处理领域&#xff0c;而图像本质上可以视为一种二维信号数据。 卷积过程可以理解为一…...

流媒体基础解析:音视频封装格式与传输协议

在视频处理与传输的完整流程中&#xff0c;音视频封装格式和传输协议扮演着至关重要的角色。它们不仅决定了视频文件的存储方式&#xff0c;还影响着视频在网络上的传输效率和播放体验。今天&#xff0c;我们将深入探讨音视频封装格式和传输协议的相关知识。 音视频封装格式 什…...

一个html实现数据库自定义查询

使用场景 应用上线后甲方频繁的找开发查询数据库数据&#xff0c;且没有固定的查询规律&#xff0c;产品经理也没有规划报表需求。 实现方案 后端开放自定义sql查询&#xff0c;屏蔽所有数据库的高危操作&#xff0c;将常用查询的sql放在一个html中的js中直接查询&#xff0…...

OCC笔记:TopoDS_Edge上是否一定存在Geom_Curve

1. 问题 写occt代码时&#xff0c;访问边的几何数据&#xff0c;通常有以下代码&#xff0c;若边不为空&#xff0c;BRep_Tool::Curve函数是否能返回Curve的有效对象指针呢&#xff1f; //其他略...const TopoDS_Edge& curEdge TopoDS::Edge(edgeExp.Current()); if( cu…...

Python aiohttp 全面指南:异步HTTP客户端/服务器框架

边写代码零食不停口 盼盼麦香鸡味块 、卡乐比&#xff08;Calbee&#xff09;薯条三兄弟 独立小包、好时kisses多口味巧克力糖、老金磨方【黑金系列】黑芝麻丸 边写代码边贴面膜 事业美丽两不误 DR. YS 野森博士【AOUFSE/澳芙雪特证】377专研美白淡斑面膜组合 优惠劵 别光顾写…...

更新已打包好的 Spring Boot JAR 文件中的 class 文件

# 1. 解压原始 JAR unzip -q original-app.jar -d temp # 2. 替换 class 文件 cp ~/projects/new-classes/*.class temp/BOOT-INF/classes/com/example/ # 3. 保留原始清单 cp temp/META-INF/MANIFEST.MF . # 4. 重新打包 jar -cf0m new-app.jar MANIFEST.MF -C temp/ . # …...

容器(如 Docker)中,通常不建议运行多个进程或要求进程必须运行在前台

在容器&#xff08;如Docker&#xff09;中&#xff0c;通常不建议运行多个进程或要求进程必须运行在前台&#xff0c;这与容器的设计理念、资源管理和生命周期管理机制密切相关。以下是具体原因和深入解析&#xff1a; 一、容器的设计理念&#xff1a;单一职责原则 容器的核…...