1 实验要求
1.1 H.264初探索
- 选择一个.mp4或者.264文件。
- 在码流分析仪软件中打开该文件,从几个层次进行分析:
(1)分析SPS和PPS里都包含哪些主要的信息,给出参数值。(例如分辨率、帧率、GOP结构等等)
(2)以一个GOP为例,分析如下信息:- 每个图像帧的类型及所用的编码比特数、QP值;并以图像帧号为横坐标、每帧所用比特数为纵坐标画出曲线图;以图像帧号为横坐标、每帧所用QP为纵坐标画出曲线图。
- 以第一个I帧作为分析对象,基于该帧图像的空间特性,分析每个宏块所采用的编码类型及其比例。
以第一个P帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。
以某一个B帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。
1.2 H.264编解码
- 将自行选择或老师给的两个264文件进行解码,得到相应的YUV文件
- 将上述两个视频序列编码为.264文件
- 固定码率,以不同的GOP长度及形状编码
GOP=15,2B帧;GOP=12,2B帧,GOP=9,2B帧
GOP=4,1B帧;GOP=12,无B帧;GOP=1,全I帧 - 相同的GOP长度及形状,不同的码率
例:1000kb/s, 800kb/s,400kb/s,… - 用码流分析软件检查所生成的码流中各种编码模式和运动矢量等信息
- 用播放器观看所生成码流的质量
- 生成率失真曲线
2 实验原理
2.1 视频压缩的基本框架
三种主要技术:
变换 —— 去除空间冗余
基于运动补偿的帧间预测 —— 去除时间冗余
熵编码 —— 去除统计冗余
2.2 SPS —— 序列参数集 (Sequence parameter set)
2.3 PPS —— 图像参数集 (Picture parameter set)
3 实验内容
3.1 H.264初探索
选择色温过低.mp4,用H264Visa.exe打开
3.1.1 结合文档对SPS和PPS分析:
1. SPS
(1)profile_idc
当前文件profile_idc = 100,查表可知码流档次为High-profile。
(2)level_idc
当前文件level_idc=31,即码流级别为3.1
(3)seq_parameter_set_id
当前文件seq_parameter_set_id=0
(4)log2_max_frame_num_minus4
当前文件log2_max_frame_num_minus4 = 2,
计算MaxFrameNum = 2^(log2_max_frame_num_minus4 + 4)= 64
(5) pic_order_cnt_type
当前序列pic_order_cnt_type=0,采用POC mode 0。
(6)log2_max_pic_order_cnt_lsb_minus4
当前文件log2_max_pic_order_cnt_lsb_minus4 = 3,
计算 MaxPicOrderCntLsb
= 2^(log2_max_pic_order_cnt_lsb_minus4+4)=128。
(7)num_ref_frames
当前文件max_num_ref_frames=16,所以参考帧最大数目为16。
(8)gaps_in_frame_num_value_allowed_flag
当前文件gap_in_frame_num_value_allowed_flag=0。
(9) pic_width_in_mbs_minus1
因此图像的实际宽度为16 ×(pic_width_in_mbs_minus1+1) = 16×(39+1)= 640
(10)pic_height_in_map_units_minus1
因此图像的实际高度为16 ×(pic_height_in_map_units_minus1+1) = 16×(22+1)= 368
比对视频信息,发现与(9)(10)中计算出的结果一致:
(11)frame_mbs_only_flag
在本文件中,frame_mbs_only_flag=1。
2. PPS
(1) pic_parameter_set_id
当前文件pic_parameter_set_id=0。
(2) seq_parameter_set_id
当前文件seq_parameter_set_id=0。
(3) entropy_coding_mode_flag
当前文件中,entropy_coding_mode_flag=1,采用CABAC方法。
(4) pic_order_present_flag
当前文件中,pic_order_present_flag=0,即条带头中不会出现与图像顺序有关的语法元素。
(5) num_slice_groups_minus1
当前文件中,num_slice_groups_minus1=0。
(6) num_ref_idx_l0_default_active_minus1 & num_ref_idx_l0_default_active_minus1
当前文件中,
num_ref_idx_l0_default_active_minus1=15
num_ref_idx_l0_default_active_minus1=0
(7) weighted_pred_flag
当前文件中,weighted_pred_flag=1。
(8) weighted_bipred_idc
当前文件中,weighted_bipred_idc=2。
(9) pic_init_qp_minus26 & pic_init_qs_minus26
当前文件中,pic_init_qp_minus26 和 pic_init_qs_minus26均为0。
(10)chroma_qp_index_offset
当前文件中,chroma_qp_index_offset=-2。
(11)deblocking_filter_control_present_flag
当前文件中,deblocking_filter_control_present_flag=1。
(12) constrained_intra_pred_flag
当前文件中,constrained_intra_pred_flag =0。
(13) redundant_pic_cnt_present_flag
当前文件中,redundant_pic_cnt_present_flag=0。
(14) transform_8x8_mode_flag
当前文件中,transform_8x8_mode_flag =1。
(15) pic_scaling_matrix_present_flag
当前文件中,pic_scaling_matrix_present_flag=0。
3.1.2 以一个GOP为例进行分析
第一个GOP长度为250帧。
将数据导出,用Excel绘制每帧所用比特数的图表:
以第一个I帧为例:
该帧完全使用帧内编码。每个宏块所用的平均编码比特数为37.480,QP(量化参数)值为27.328。
以第一个P帧为例:
注意该帧第四个显示:
可以看到,该帧使用了帧内编码和帧间编码。
以第一个B帧为例:
注意该帧第二个显示
该帧完全使用帧间编码。黄色为B_skip宏块,占737/920=80.11%。
3.2 H.264编解码
1. 将.264文件进行解码得到相应的YUV文件
2. 将.yuv文件编码回.264文件
改变参数,此处以码率1000kbps,GOP长度15,2B帧为例,修改encoder.cfg的参数:
(为了省时,只编30帧)
运行后:
其他参数改变方式同理,最终得到下面表格:
3. 用码流分析软件检查所生成的码流中各种编码模式和运动矢量等信息
以1000kbps码率,GOP长度15,GOP形状2B为例:
由图中可看出,显示顺序为IBBPBBPBBPBBP,但由于进行了帧重排,编解码顺序为与显示顺序不同。
此处以第一组IPBB(编解码)为例:
I帧:
可以看出,全为帧内编码。
P帧:
P帧中,红色橙色为帧内编码,且编码模式不同。蓝色为帧间编码,黄色为skip。由于该视频运动幅度不大,且背景没有变化,所以skip较多。
两个B帧:
B帧中,黄色代表skip,蓝色代表帧间编码。这两帧没有用到帧内编码(红色橙色)。
4 . 用播放器观看所生成码流的质量
此处举两个例子。(红色线为运动矢量)
(1)以1000kbps码率,GOP长度15,GOP形状2B为例:
可以看到,视频质量较高,较清晰。
(2)以400kbps码率,GOP长度15,GOP形状2B为例:
可以看到,图像变得有些模糊。
5 . 生成率失真曲线
可以看到,随码率下降,PSNR降低,视频质量降低。