H.264编码实验
码流分析仪分析.264文件
本次实验以编码器输出的highway_qcif_enc.264文件为例分析。
SPS与PPS主要信息
序列参数集SPS(Sequence parameter set): 说明的是某一段视频序列的编码特性。profile_idc,level_idc两个语法元素说明该段视频序列遵循的是H.264/AVC标准的哪一种配置,以指导解码端调用合适的解码器进行解码。pic_order_cnt_type等语法元素说明该段视频序列中每帧图像的记数方法,pic_ widthes_in_mbs_minus1和pic_ height_in_map_units_minus1这两个语法元素说明该段视频序列中图像帧的长度和宽度。各段视频序列的编码特性可能不同,因此序列参数集的内容也就不会相同,seq_parameter_set_id语法元素用来区分不同的序列参数集,以方便解码端进行参考。
由上图可得,该视频序列只有一个序列参数集,其序号为0。
profile_idc=100,level_idc=40,pic_order_cnt_type=0,pic_ widthes_in_mbs_minus1=10,pic_ height_in_map_units_minus1=8,seq_parameter_set_id=0。
宽为16x(10+1)=176,高为16x(8+1)=144,分辨率为176x144。
图像参数集PPS(Picture parameter set): 说明的是某个图像帧的编码特性。 包括编码该图像帧所采用的熵编码模式(CAVLC或者CABAC),所使用的参考帧的数目,以及对该图像帧的亮度和色度残差进行量化时所采用的量化参数值等。图像参数集中最主要的部分是该图像帧的Slice Group划分方式的表示(用于FMO),其中num_slice_groups_minus1语法元素说明了该图像帧中Slice Group的数目。同序列参数集的情况一样,每个图像帧的编码特性可能各不相同,也就需要一个pic_parameter_set_id来区分不同的图像参数集。
由上图可得,该视频序列有三个图像参数集,其序号分别为0,1,2。
以第一个图像参数集为例,num_slice_groups_minus1=0,pic_parameter_set_id=0。
该图像帧中Slice Group的数目为1,该图像参数集序号为0。
GOP结构及帧率
由上图可得,其GOP结构为IBBPBBPBB,长度为9。帧率为30帧/秒。
以一个GOP为例,分析信息
本次实验以该视频序列的第五个GOP(GOP4)为例分析。
每个图像帧的类型及所用的编码比特数、QP值
该视频序列单个图像帧内每个宏块QP值一致。
帧号 | 类型 | 编码比特数 | QP值 |
---|---|---|---|
37 | I | 57018 | 8 |
38 | B | 8261 | 10 |
39 | B | 13279 | 10 |
40 | P | 28251 | 8 |
41 | B | 21324 | 10 |
42 | B | 18281 | 10 |
43 | P | 50082 | 8 |
44 | B | 10968 | 10 |
45 | B | 8726 | 10 |
以该GOP第一个I帧为分析对象
空间特性
如上图所示,共99个宏块。
编码类型 | 宏块数 | 占比(%) |
---|---|---|
I_4x4 | 90 | 90.91 |
I_8x8 | 9 | 9.01 |
时间特性
如上图所示,I帧为帧内预测,无运动矢量。
以该GOP第一个P帧为分析对象
空间特性
如上图所示,共99个宏块。
编码类型 | 宏块数 | 占比(%) |
---|---|---|
I_4x4 | 5 | 5.05 |
P_L0_16x16 | 19 | 19.19 |
P_L0_L0_16x8 | 9 | 9.09 |
P_L0_L0_8x16 | 4 | 4.04 |
P_8x8 | 43 | 43.43 |
P_Skip | 19 | 19.19 |
时间特性
如上图所示,P帧为前向预测,只有一种运动矢量。该视频序列统计特性为前景(路面及其两侧)有变化,背景(天空)变化小,其运动矢量集中在前景。
以该GOP第一个B帧为分析对象
空间特性
如上图所示,共99个宏块。
编码类型 | 宏块数 | 占比(%) |
---|---|---|
B_L0_16x16 | 34 | 34.34 |
B_L1_16x16 | 5 | 5.05 |
B_Bi_16x16 | 1 | 1.01 |
B_L0_L0_16x8 | 3 | 3.03 |
B_L0_L0_8x16 | 3 | 3.03 |
B_L1_L0_16x8 | 3 | 3.03 |
B_L0_Bi_16x8 | 1 | 1.01 |
B_Bi_L0_16x8 | 2 | 2.02 |
B_Bi_L1_16x8 | 1 | 1.01 |
B_Bi_Bi_16x8 | 2 | 2.02 |
B_8x8 | 13 | 13.13 |
B_Skip | 31 | 31.31 |
时间特性
如上图所示,B帧为双向预测,有绿、红两种运动矢量。该视频序列统计特性为前景(路面及其两侧)有变化,背景(天空)变化小,其运动矢量集中在前景。
H.264编码
编码器参数设置
本实验以解码器生成的highway_qcif_dec.yuv文件为输入,以GOP长度及形状为4/1B,目标比特率为400kbit/s的编码参数为例,输出60帧帧率为30帧/秒的highway_qcif_enc41B400.264文件,编码器需要修改的参数如下:
InputFile = "highway_qcif_dec.yuv" # Input sequence
FramesToBeEncoded = 60 # Number of frames to be coded
FrameRate = 30.0 # Frame Rate per second (0.1-100.0)
SourceWidth = 176 # Source frame width
SourceHeight = 144 # Source frame height
OutputWidth = 176 # Output frame width
OutputHeight = 144 # Output frame height
ReconFile = "highway_qcif_rec.yuv" # Reconstruction YUV file
OutputFile = "highway_qcif_enc41B400.264" # Bitstream
IntraPeriod = 4 # Period of I-pictures (0=only first)
NumberBFrames = 1 # Number of B coded frames inserted (0=not used)
QPBSlice = 30 # Quant. param for B slices (0-51)
HierarchicalCoding = 2 # B hierarchical coding (0= off, 1= 2 layers, 2= 2 full hierarchy, 3 = explicit)
RateControlEnable = 1 # 0 Disable, 1 Enable
Bitrate = 400000 # Bitrate(bps)
InitialQP = 30 # Initial Quantization Parameter for the first I frame
其中IntraPeriod为GOP长度,NumberBFrames为插入的B帧数,Bitrate为目标比特率。
实验结果
同样以上述编码参数为例,其结果为:
此处重点需要记录该编码参数对应的Y-PSNR=48.433dB,实际比特率为390.02kbits/s。
率失真曲线
本次实验选取的GOP长度及形状编码有:GOP=15,2B帧,GOP=12,2B帧,GOP=9,2B帧,GOP=4,1B帧,GOP=12,无B帧,GOP=1,全I帧。
目标比特率有:30kbits/s,60kbits/s,100kbits/s,200kbits/s,300kbits/s,400kbits/s。
由率失真曲线可得:
对于这种统计特性的视频序列,
在低码率的情况下,生成码流的客观质量15/2B>12/2B>12/0B>9/2B>4/1B>全I帧;
在中高码率的情况下,生成码流的客观质量12/0B>15/2B>12/2B>9/2B>4/1B>全I帧。
播放器观看生成码流
目标比特率(kbits/s) | 30 | 100 | 400 |
---|---|---|---|
9/2B | |||
12/2B | |||
15/2B | |||
4/1B | |||
12/0B | |||
全I帧 |
横向对比可得,在码率越高时,图像细节更丰富清晰,尤其体现在云层和远处告示牌上,生成码流的主观质量更高;
纵向对比可得,在码率一定时,全I帧的图像尤为模糊,生成码流的主观质量明显低于其他GOP长度及形状。