H264——H264码流分析实例(SPS、PPS)

工具

任意二进制工具
雷神作品:SpecialVH264.exe

原理

NAL Unit结构分析

NALU

nalu语法图
在这里插入图片描述
nalu_type
在这里插入图片描述

SPS

在这里插入图片描述

PPS

在这里插入图片描述

实例视频二进制数据

每一个NALU以0x00 00 00 01为起始码,也作为分隔
在这里插入图片描述

SPS分析

在这里插入图片描述

nal_header

先分析第一个NALU
size是14byte,起始码之后正好是14byte
第一个字节是NAL的header

  • forbidden_zero_bit : 0
    静止位固定是0,也就是第7位为0
  • nal_ref_idc : 3
    第5第6位是11
  • header低5位表示类型,这里是SPS
    即低5位是7

于是第一个nalu header
二进制为:0110 0111
十六进制为0x67,和二进制解析一致


profile_idc

既然知道了这个NALU表示SPS,那么就以SPS的方式去进行解析,SPS语法见上方给出的sps语法表

实际视频的第2个字节

  • profile_idc : 43
    第二个42是指profile,表示profile是66(十进制),即baseline profile
    H264中的profile与level
    profile的值在H264标准文档附件A中可查

profile_idc = 66 —— basline
profile_idc = 77 —— main
profile_idc = 88 —— extend
profile_idc = 100 —— high


实际视频数据的第三个字节

  • constraint_set0_flag~constraint_set5_flag
    给当前帧加一些限制性条件,具体参考h264标准文档,在附录A中列出和各种profile对应的情况

level_idc

实际视频数据的第四个字节

  • level_idc : 31
    当前码流中,level对应3.1,即720p,30fps,和sample中对应(h264的level表在H264中的profile与level
    在这里插入图片描述

标识当前码流的Level。
编码的Level定义了某种条件下的最大视频分辨率、最大视频帧率等参数,码流所遵从的level由level_idc指定。


seq_parameter_set_id

表示当前的RBSP(序列参数集)的id。通过该id值,图像参数集pps可以引用其代表的sps中的参数。


chroma_format_idc

  • chroma_format_idc : 1
    表示色度采样结构,示例的视频流为yuv420

在这里插入图片描述


residual_colour_transform_flag

  • residual_colour_transform_flag = 0
    值等于1时,应 用 264文档8.5节规定的残余颜色变换 。
    residual_colour_transform_flag 等于 0 时则不使用残余颜色变换。当 residual_colour_transform_flag 不存在时,默认其值为 0

bit_depth_luma_minus8

  • bit_depth_luma_minus8 = 0

是指亮度队列样值的比特深度以及亮度量化参数范围的取值偏移 QpBdOffsetY ,如下所示

  • BitDepthY = 8 + bit_depth_luma_minus8
  • QpBdOffsetY = 6 * bit_depth_luma_minus8

当 bit_depth_luma_minus8 不存在时,应推定其值为 0。bit_depth_luma_minus8 取值范围应该在 0 到 4 之间(包括 0 和 4)。


bit_depth_chroma_minus8

  • bit_depth_chroma_minus8 = 0

是指色度队列样值的比特深度以及色度量化参数范围的取值偏移 QpBdOffsetC ,
如下所示

  • BitDepthC = 8 + bit_depth_chroma_minus8
  • QpBdOffsetC = 6 * ( bit_depth_chroma_minus8 + residual_colour_transform_flag )

当 bit_depth_chroma_minus8 不存在时,应推定其值为 0。bit_depth_chroma_minus8 取值范围应该在 0 到 4 之间(包括 0 和 4)。


qpprime_y_zero_transform_bypass_flag

  • qpprime_y_zero_transform_bypass_flag : 0

等于 1 是指当 QP’Y 等于 0 时变换系数解码过程的变换旁路操作和图像构建过程将会在H264文档第 8.5 节给出的去块效应滤波过程之前执行qpprime_y_zero_transform_bypass_flag 等于 0 是指变 换 系 数 解 码 过 程 和 图 像 构 建 过 程 在 去 块 效 应 滤 波 过 程 之 前 执 行 而 不 使 用 变 换 旁 路 操 作 。
当qpprime_y_zero_transform_bypass_flag 没有特别指定时,应推定其值为 0


seq_scaling_matrix_present_flag

  • seq_scaling_matrix_present_flag : 0

等 于 1 表 示 存 在 i=0…7 的 标 志 seq_scaling_list_present_flag[ i ] 。
seq_scaling_matrix_present_flag 等于 0 则表示不存在这些标志并且由 Flat_4x4_16 表示的序列级别的缩放比例列表应被推断出来(对应 i=0…5),由 Flat_8x8_16 表示的序列级别的缩放比例列表应被推断出来(对应 i=6…7)。当seq_scaling_matrix_present_flag 没有特别指定时,应推定其值为 0。


log2_max_frame_num_minus4

  • log2_max_frame_num_minus4 : 6

用于计算MaxPicOrderCntLsb的值,该值表示POC的上限。计算方法为
MaxPicOrderCntLsb = 2^(log2_max_pic_order_cnt_lsb_minus4 + 4)


pic_order_cnt_type

  • pic_order_cnt_type : 2

表示解码picture order count(POC)的方法。POC是另一种计量图像序号的方式,与frame_num有着不同的计算方法。该语法元素的取值为0、1或2

log2_max_pic_order_cnt_lsb_minus4

  • log2_max_pic_order_cnt_lsb_minus4 : 0

用于计算MaxPicOrderCntLsb的值,该值表示POC的上限。计算方法为
MaxPicOrderCntLsb = 2^(log2_max_pic_order_cnt_lsb_minus4 + 4)

num_ref_frames

规定了可能在视频序列中任何图像帧间预测的解码过程中用到的短期参考帧和长期参考帧、互补参考场对以及不成对的参考场的最大数量。num_ref_frames 字段也决定了 8.2.5.3 节规定的滑动窗口操作的大小。num_ref_frames 的取值范围应该在 0 到 MaxDpbSize (参见 A.3.1 或 A.3.2 节的定义)范围内,包括 0 和MaxDpbSize 。

pic_width_in_mbs_minus1

  • pic_width_in_mbs_minus1 : 79

加 1 是指以宏块为单元的每个解码图像的宽度。
PicWidthInMbs = pic_width_in_mbs_minus1 + 1
16是h264中的宏块边长
于是示例视频流中的图像宽度为80 x 16 = 1280

pic_height_in_map_units_minus1

  • pic_height_in_map_units_minus1 : 44
    使用PicHeightInMapUnits来度量视频中一帧图像的高度。PicHeightInMapUnits并非图像明确的以像素或宏块为单位的高度,而需要考虑该宏块是帧编码或场编码。PicHeightInMapUnits的计算方式为:

PicHeightInMapUnits = pic_height_in_map_units_minus1 + 1
16是h264中的宏块边长
于是示例视频流中的图像宽度为45 x 16 = 720

PPS

分析同SPS

SEI

在这里插入图片描述
用于存放payload相关信息

总结

SPS 用于存放视频信息,图像profile、level、chroma、图像长宽等关键信息

SEI存放payload相关信息

  • I帧越大,P帧越小;I帧越小P帧越大
  • I帧大小取决于图像本身内容,和压缩算法的空间部分
  • P帧的大小取决于图像变化的剧烈程度
  • (码率控制模式)CBR和VBR下P帧的大小策略会不同,CBR时P帧大小基本恒定
    CBR是固定码率;VBR是可变码率
    码率的概念就是,沿着时间轴,这些帧的大小。如果每个P帧的大小相差过大,那么网络传输就会很麻烦,带宽可能不够或者闲置
    CBR每一帧的大小是差不多的,主要是为了方便网传
    VBR每一帧大小不稳定,主要是为了维持图像质量稳定
    图像变化是否剧烈,是选择码率控制模式的依据之一
  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Spark!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值