目录
- 工具
- 原理
- 实例视频二进制数据
- SPS分析
- nal_header
- profile_idc
- level_idc
- seq_parameter_set_id
- chroma_format_idc
- residual_colour_transform_flag
- bit_depth_luma_minus8
- bit_depth_chroma_minus8
- qpprime_y_zero_transform_bypass_flag
- seq_scaling_matrix_present_flag
- log2_max_frame_num_minus4
- pic_order_cnt_type
- log2_max_pic_order_cnt_lsb_minus4
- num_ref_frames
- pic_width_in_mbs_minus1
- pic_height_in_map_units_minus1
- PPS
- SEI
- 总结
工具
任意二进制工具
雷神作品:SpecialVH264.exe
原理
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每一帧大小不稳定,主要是为了维持图像质量稳定
图像变化是否剧烈,是选择码率控制模式的依据之一