avc(264) pps解析

pps和sps是视频编码中非常重要的部分,pps是描述视频的图像编码参数集。如图pps在标准中的定义,顶层语法结构,描述一组与图像(Picture)相关的编码工具和解码参数。PPS 可以被多个 Slice / Picture 复用,从而节省比特流带宽。
pps描述

  1. pic_parameter_set_id – ue(v)
    PPS 本身的索引值(0–255)。Slice Header 通过该 ID 引用本 PPS。

  2. seq_parameter_set_id – ue(v)
    关联的 SPS(Sequence Parameter Set)编号。决定了本 PPS 应与哪一个 SPS 配合使用。

  3. entropy_coding_mode_flag – u(1)
    0:CAVLC;1:CABAC。切换两种熵编码方式。CABAC 有更高压缩效率但运算复杂度高。
    CABAC个人理解他不是可变长编码因为它没有变长编码映射表,仅仅N个字符编出的结果是不确定的,而CAVLC码字长度随符号而变

  4. bottom_field_pic_order_in_frame_present_flag – u(1)
    为 1 时,Slice Header 会额外携带 bottom_field_pic_order_in_frame 的字段,用于帧场混合编码(MBAFF)。现在很少有场编码了所以这里一带而过

  5. num_slice_groups_minus1 – ue(v)
    (+1 后)给出本 Picture 中的 Slice Group 数量。大于 0 时启用 FMO(Flexible Macroblock Ordering)。
    当 num_slice_groups_minus1 > 0 时(即 SliceGroup > 1)
    该参数主要用于确定视频帧被划分成的条带组(slice groups)数量,此参数的取值范围是 0 到 7,也就意味着条带组的数量最多为 8 个,在视频处理过程中有错误恢复:当视频在传输过程中出现丢包情况时,条带组能够限制错误传播的范围。比如,若某个条带组在传输中丢失了数据,那么错误就只会影响到该条带组内的宏块,而不会扩散到其他条带组,并行处理:不同的条带组可以由解码器并行进行处理,这对于多核处理器来说非常友好,能够有效提升解码的效率,码率控制:针对不同的条带组,可以采用不同的编码参数,这样就能对视频的质量和码率进行更精细的控制

  6. slice_group_map_type – ue(v)
    0–6:七种 FMO 映射方式。指定宏块如何分配到各个条带组,即定义条带组的映射模式
    抗丢包作用:
    设置 num_slice_groups_minus1 = 3(4 个条带组),并使用 slice_group_map_type = 0(交织模式)。
    宏块将被交替分配到 4 个条带组中,若某个条带组在传输中丢失,错误仅影响局部区域。
    前景保护作用:
    设置 num_slice_groups_minus1 = 1(2 个条带组),并使用 slice_group_map_type = 2(前景 / 背景)。
    编码器将人脸等前景区域分配到一个条带组,背景分配到另一个条带组,优先保护关键内容
    slice_group_map_type == 0 时 run_length_minus1[iGroup] – ue(v) 每个 SliceGroup 的宏块 run-length。解码器依此顺序轮流填充宏块。
    slice_group_map_type == 2 时 top_left[iGroup] – ue(v) bottom_right[iGroup] – ue(v)共同描述每个 SliceGroup 的矩形区域左上 & 右下 MB 索引。
    slice_group_map_type == 3 / 4 / 5 时slice_group_change_direction_flag – u(1) 从左上到右下;1:相反方方slice_group_change_rate_minus1 – ue(v)变化速率,用于“蛇形/对角线/放射”三种模式。
    slice_group_map_type == 6 时 pic_size_in_map_units_minus1 – ue(v) Picture 的 MB 数(map unit)-1。slice_group_id[i] – u(v) 对 picture 中每个 MB 给出所属 SliceGroup 的 ID(变长位宽)。

  7. num_ref_idx_l0_default_active_minus1 – ue(v)
    用于控制 P 帧和 B 帧在解码过程中可使用的参考图像数量。影响视频的编码效率、码率和质量,参考图像数量 = num_ref_idx_l0_default_active_minus1 + 1
    在 H.264 中,帧间预测(运动补偿)依赖参考图像来预测当前帧的内容。参考图像列表分为两类:
    List 0(前向参考列表):包含早于当前帧的已解码图像,用于 P 帧和 B 帧的前向预测。
    List 1(后向参考列表):仅用于 B 帧的后向预测,包含晚于当前帧的已解码图像(通过双向预测技术)。
    num_ref_idx_l0_default_active_minus1 控制的是List 0 的默认长度

  8. num_ref_idx_l1_default_active_minus1 – ue(v)
    后向参考图像数量 = num_ref_idx_l1_default_active_minus1 + 1
    指定 B 帧在默认情况下可使用的 ** 后向参考图像列表(List 1)** 的最大长度。

  9. weighted_pred_flag – u(1)
    weighted_pred_flag 是一个用于控制帧间预测权重的重要参数。它主要影响 P 帧(预测帧)的编码效率,通过对参考图像的像素进行加权处理,提高预测精度,从而降低码率或提升视频质量。
    当 weighted_pred_flag = 1 时,启用加权预测;
    当 weighted_pred_flag = 0 时,使用默认的等权重预测

  10. weighted_bipred_idc – u(2)
    weighted_bipred_idc 是一个专门针对 B 帧(双向预测帧)的参数,用于控制双向预测时的加权策略。它与之前介绍的 weighted_pred_flag(针对 P 帧)共同构成了 H.264 的加权预测机制,旨在提高视频编码效率和质量
    适应光照变化
    当 B 帧的两个参考帧(过去和未来)之间存在亮度差异时,加权策略可以补偿这种变化,减少预测残差。
    优化运动补偿
    对于复杂运动(如加速、减速或非线性运动),加权双向预测可以更准确地估计中间位置,提高预测精度。
    降低码率
    通过更精确的预测,减少需要编码的残差数据,从而降低视频码率。
    在这里插入图片描述

  11. pic_init_qp_minus26 – se(v)
    pic_init_qp_minus26 是一个用于控制视频量化参数(QP, Quantization Parameter)的关键参数。它直接影响视频的编码质量、码率和压缩效率,是视频编码器调优的重要手段
    初始QP = pic_init_qp_minus26 + 26
    -26 ≤ pic_init_qp_minus26 ≤ 25(即初始 QP 范围为 0-51)
    量化是视频编码中损失信息的关键步骤,它通过将变换系数(如 DCT 系数)除以一个量化步长,减少表示系数所需的比特数。量化步长越大,信息损失越多,但压缩率也越高

  12. pic_init_qs_minus26 – se(v)
    是一个专门用于控制 B 帧(双向预测帧)量化参数的关键参数。它与之前介绍的 pic_init_qp_minus26(控制 P 帧和 I 帧的初始 QP)共同构成了 H.264 的量化参数调节机制,旨在优化不同类型帧之间的质量分配和码率控制
    -26 ≤ pic_init_qs_minus26 ≤ 25(即 B 帧初始 QP 范围为 0-51)

  13. chroma_qp_index_offset – se(v)
    用于精细控制色度(Chroma)分量量化参数的关键参数。它允许编码器对亮度(Luma)和色度采用不同的量化策略,从而在保持视觉质量的同时优化码率分配
    CbCr QP = Luma QP + chroma_qp_index_offset

  14. deblocking_filter_control_present_flag – u(1)
    控制去块效应滤波器(Deblocking Filter)的关键参数。它决定了视频流中是否包含去块滤波器的详细配置信息,从而影响解码后视频的视觉质量和块效应(blocking artifacts)的明显程度。
    当 deblocking_filter_control_present_flag = 1 时:
    表示 PPS 中包含去块滤波器的详细控制参数(如滤波强度、边界偏移等),允许对每个 slice 或宏块进行精细控制。
    当 deblocking_filter_control_present_flag = 0 时:
    使用默认的去块滤波设置(通常为中等强度),解码器忽略后续相关参数。
    块效应(Blocking Artifacts)
    在视频编码中,图像被划分为 16×16 的宏块(Macroblocks)进行独立处理。当量化参数(QP)较高时,相邻宏块的边界可能出现不连续,形成可见的 “块” 状边缘,影响视觉质量。
    去块滤波的作用
    通过对宏块边界的像素进行平滑处理,减少块效应,使图像看起来更自然。H.264 的去块滤波器可以调整边界像素的亮度和色度值或根据块边界的特性(如纹理复杂度、运动程度)自适应调整滤波强度。

  15. constrained_intra_pred_flag – u(1)
    控制帧内预测(Intra Prediction)行为的关键参数。它主要影响 I 帧(帧内编码帧)中宏块的预测方式,特别是在错误恢复和抗丢包场景下发挥重要作用
    当 constrained_intra_pred_flag = 1 时:
    强制 I 帧中的宏块只能使用已正确解码且无错误传播的相邻宏块作为预测参考。
    当 constrained_intra_pred_flag = 0 时:
    允许宏块使用任何相邻宏块(包括可能包含错误的宏块)作为预测参考,以提高编码效率

  16. redundant_pic_cnt_present_flag – u(1)
    控制 ** 冗余图片(Redundant Picture)** 机制的关键参数。它决定了视频流中是否包含冗余图片的计数信息,主要用于提高视频在不可靠网络中的抗丢包能力
    当 redundant_pic_cnt_present_flag = 1 时:
    每个 NAL 单元的头部会包含一个 redundant_pic_cnt 字段,用于标识当前图片是主图片的第几个冗余版本。
    当 redundant_pic_cnt_present_flag = 0 时:
    视频流中不包含冗余图片,所有图片均为主图片
    冗余图片是对同一原始帧的额外编码版本,通常使用不同的编码参数(如更高的量化参数 QP)或不同的预测模式。它们与主图片(Primary Picture)内容相同,但编码方式不同

  17. if( more_rbsp_data( ) ) —— PPS 扩展区

  18. transform_8x8_mode_flag – u(1)
    控制变换块大小的关键参数。它允许编码器在传统的4×4 变换和更大的8×8 变换之间进行选择,从而优化不同内容特性的编码效率
    当 transform_8x8_mode_flag = 1 时:
    允许编码器使用 8×8 离散余弦变换(DCT)或整数变换替代默认的 4×4 变换,以处理更大的图像块。
    当 transform_8x8_mode_flag = 0 时:
    编码器只能使用 4×4 变换,这是 H.264 的默认设置。
    变换编码的原理
    变换的目的 将图像像素从空间域转换到频率域,使能量集中在低频系数,从而提高压缩效率。
    4×4 变换的局限性==》对于大面积平滑区域或低频内容,4×4 变换效果良好;对于高分辨率视频或细节丰富的内容(如纹理、边缘),4×4 变换会产生大量非零系数,增加编码复杂度和码率。
    8×8 变换的优势 更大的变换块能更好地捕捉图像中的长距离相关性,减少块效应;对于高分辨率视频(如 1080p 及以上),8×8 变换可显著提高编码效率。

  19. pic_scaling_matrix_present_flag – u(1)
    控制 ** 量化矩阵(Quantization Matrix)** 的关键参数。它决定了视频流中是否包含自定义的量化矩阵数据,从而允许编码器针对不同类型的内容(如纹理、边缘、肤色)进行更精细的优化
    当 pic_scaling_matrix_present_flag = 1 时:
    表示 PPS 中包含一组或多组自定义的量化矩阵,用于替代标准默认的量化矩阵。
    当 pic_scaling_matrix_present_flag = 0 时:
    使用 H.264 标准定义的默认量化矩阵。

  20. pic_scaling_list_present_flag[i] – u(1)
    Bitstream 带自定义 scaling_list;0:使用默认。

  21. scaling_list( … )
    如果 i < 6 → 4×4 量化矩阵;否则 → 8×8。
    UseDefaultScalingMatrixXxXFlag[i] 用于指示解码器在 zig-zag 扫描遇到非合法值时回退到默认矩阵。

  22. second_chroma_qp_index_offset – se(v)
    当 transform_8x8_mode_flag 为 1 且 4:2:2/4:4:4 格式时,可给出第二组色度 QP 偏移;用于不同色度分量分别调节。

  23. rbsp_trailing_bits( )
    RBSP 尾部对齐位:一个 ‘1’ + 若干 ‘0’,补足到字节边界。

00 00 00 01 28 fe 01 96 2c 00 00 01 25

  1. 0x28 => 0010 1000
    根据前文中的pps分析可知 前三部分为f(1) u(2) u(5) 之后是rbsp的数据这里我们不详细描述。
    f(1) 表示1bit的禁止位, u(2) 代表无符号整数2bit u(5) 代表无符号整数5bit
    forbidden_zero_bit 占用0bit, 0 表示码流正常,作用就是作为保留位,用于比特流完整性检查和错误检测,要求始终为 0。如果不为 0,说明数据有误。
    nal_ref_idc 占用2bit,01表示不能丢弃的帧
    nal_unit_type 占用5bit 01000==》8表示Picture parameter set 即pps
    2: pic_parameter_set_id ue(v) fe==》1111 1110
    所以pic_parameter_set_id 为0 所以该pps id为0
    3: seq_parameter_set_id ue(v) 111 1110
    seq_parameter_set_id 为0 匹配pps id为0
    4: entropy_coding_mode_flag u(1) 11 1110
    所以此flag = 1,此视频选择用更复杂的CABAC熵编码
    5: bottom_field_pic_order_in_frame_present_flag u(1) 1 1110
    1 用于帧场混合编码(MBAFF)
    6: num_slice_groups_minus1 1110 ue(v) ==>0 所以
    Slice Group 数量 = 0 + 1,FMO关闭 开销最小,这种配置最常见
    7: num_ref_idx_l0_active_minus1 和 num_ref_idx_l1_active_minus1 都是ue(v) 110两个值都为0
    List 0 的活动参考数 = 0 + 1 = 1
    List 1 的活动参考数 = 0 + 1 = 1
    也就是说,运动补偿时每个列表只允许使用“1 张”参考图像,索引恒为 0。
    对码流结构与信令的好处 Slice Header 更短:当一个列表只有 1 张参考帧时,宏块层无需发送 ref_idx_lX 语法;CABAC/CAVLC 直接按默认索引 0 处理。Encoder 计算量低:运动搜索目标只剩 “当前帧的 1 张参考候选”。DPB(Decoded Picture Buffer)压力小:虽然 DPB 可以存多张解码图像供将来参考,但实际查找仅限一张,适合低延时或实时场景
    对压缩效率与画质的影响,码流头信息更短,编解码器实现简单,预测空间被大幅度削减。
    8:weighted_pred_flag 0 u(1) 所以此值为0
    它决定了:在做运动预测时,编码器/码流能不能给参考块再套一个“乘权重 + 加偏移”的线性变换,用来更好地拟合亮度、渐隐、渐现或混合特效等场景,打开处理亮度渐变、对比度变动、淡入淡出、字幕叠加 → 码率可下降 5%–20%(场景依赖),减少因为亮度偏移而被迫切到帧内或残差过大的情况但是编码器开销大。这里设置成0即彻底关闭
    9: weighted_bipred_idc 0000 0001 u(2) 所以为0
    B-slice 加权预测关闭缺点对淡入淡出、闪光、亮度渐变、合成字幕等场景,B-slice 预测精度下降,码率往往比隐式(2) 或显式(1) 高 5 %–20 %。无法构建“B-pyramid + 隐式权重”这类高效 GOP 结构
    10: pic_init_qp_minus26 00 0001 10010 110(补上96)
    00000 110010 =》 50 = k+1 k=49; 2v = 49+1 v=25
    所以初始化QP为26+25 = 51 最大
    11 pic_init_qs_minus26 se(v) 110
    12 chroma_qp_index_offset 10 se(v) 所以为0
    当 chroma_qp_index_offset = 0 时 ⇒ 色度与亮度使用同一个 QP 索引 即为51
    13 deblocking_filter_control_present_flag 0 u(1) 所以为0
    Slice 头里不会再出现去方块控制字段,去方块滤波始终按默认方式“开着,且偏移=0”
    14 constrained_intra_pred_flag 0010 1100 u(1) 所以0
    Intra 块可以参考 Inter 块,编码自由度最大;对解码没任何额外限制
    15 redundant_pic_cnt_present_flag 010 1100 u(1) 所以0
    码流中不携带冗余片 (redundant slice),即没有“备份帧”
    16 transform_8x8_mode_flag u(1) 10 1100 所以1
    这意味着允许使用 8×8 的变换块来替代 4×4 的变换块
    17 pic_scaling_matrix_present_flag u(1) 所以0
    PPS 中没有自定义 Scaling List;编解码双方都用默认量化矩阵
    18 second_chroma_qp_index_offset se(v) 所以0
    对应色度 QP 的第二组偏移量为 0,等同于第一组(你前面给的 chroma_qp_index_offset = 0)所以这里还是51
    19 rbsp_stop_one_bit u(1) 1
    这里是天然对齐的就没有再补0
    264作为初级我们分析相对也比较简单。我们梳理完成264之后会进入265的梳理,到时候我们会更细致些。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值