H.264实验
- 一、H.264简介
- 二、解码.264文件,生成YUV文件
- 三、将YUV重新编码为H.264文件
- 三、分析码流的各种编码模式和运动矢量
- 四、用播放器查看所生成码流的质量
- 五、生成率失真曲线
- 六、分析H.264文件
- 1、SPS和PPS信息
- 1)sps——序列参数集 (Sequence parameter set)
- 2)PPS
- a)pic_parameter_set_id
- b)seq_parameter_set_id
- c) entropy_coding_mode_flag
- d)pic_order_present_flag
- e)num_slice_groups_minus1
- f) num_ref_idx_l0_default_active_minus1
- g)num_ref_idx_l1_default_active_minus1
- h) weighted_pred_flag
- i)weighted_bipred_idc
- j)pic_init_qp_minus26
- k)pic_init_qs_minus26
- l)chroma_qp_index_offset
- m)deblocking_filter_control_present_flag
- n) constrained_intra_pred_flag
- o) redundant_pic_cnt_present_flag
- p) transform_8x8_mode_flag
- q)pic_scaling_matrix_present_flag
- 2、以一个GOP为例分析
一、H.264简介
1、什么是H.264
H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式。H.264是ITU-T以H.26x系列为名称命名的视频编解码技术标准之一。该标准最早来自于ITU-T的称之为H.26L的项目的开发。H.26L这个名称虽然不太常见,但是一直被使用着。H.264是ITU-T以H.26x系列为名称命名的标准之一,AVC是ISO/IEC MPEG一方的称呼。
H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。这个标准通常被称之为H.264/AVC(或者AVC/H.264或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)而明确的说明它两方面的开发者。
H264标准各主要部分有Access Unit delimiter(访问单元分割符),SEI(附加增强信息),primary coded picture(基本图像编码),Redundant Coded Picture(冗余图像编码)。还有Instantaneous Decoding Refresh(IDR,即时解码刷新)、Hypothetical Reference Decoder(HRD,假想参考解码)、Hypothetical Stream Scheduler(HSS,假想码流调度器)。
2、H.264优势
- 低码率(Low Bit Rate):和MPEG2和MPEG4 ASP等压缩技术相比,在同等图像质量下,采用H.264技术压缩后的数据量只有MPEG2的1/8,MPEG4的1/3。
- 高质量的图像:H.264能提供连续、流畅的高质量图像(DVD质量)。
- 容错能力强:H.264提供了解决在不稳定网络环境下容易发生的丢包等错误的必要工具。
- 网络适应性强:H.264提供了网络抽象层(Network Abstraction Layer),使得H.264的文件能容易地在不同网络上传输(例如互联网,CDMA,GPRS,WCDMA,CDMA2000等)。
H.264最大的优势是具有很高的数据压缩比率,在同等图像质量的条件下,H.264的压缩比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍。举个例子,原始文件的大小如果为88GB,采用MPEG-2压缩标准压缩后变成3.5GB,压缩比为25∶1,而采用H.264压缩标准压缩后变为879MB,从88GB到879MB,H.264的压缩比达到惊人的102∶1。低码率(Low Bit Rate)对H.264的高的压缩比起到了重要的作用,和MPEG-2和MPEG-4 ASP等压缩技术相比,H.264压缩技术将大大节省用户的下载时间和数据流量收费。尤其值得一提的是,H.264在具有高压缩比的同时还拥有高质量流畅的图像,正因为如此,经过H.264压缩的视频数据,在网络传输过程中所需要的带宽更少,也更加经济。
3、H.264特点
H264标准的主要特点如下:
- 更高的编码效率:同H.263等标准的特率效率相比,能够平均节省大于50%的码率。
- 高质量的视频画面:H.264能够在低码率情况下提供高质量的视频图像,在较低带宽上提供高质量的图像传输是H.264的应用亮点。
- 提高网络适应能力:H.264可以工作在实时通信应用(如视频会议)低延时模式下,也可以工作在没有延时的视频存储或视频流服务器中。
- 采用混合编码结构:同H.263相同,H.264也使用采用DCT变换编码加DPCM的差分编码的混合编码结构,还增加了如多模式运动估计、帧内预测、多帧预测、基于内容的变长编码、4x4二维整数变换等新的编码方式,提高了编码效率。
- H.264的编码选项较少:在H.263中编码时往往需要设置相当多选项,增加了编码的难度,而H.264做到了力求简洁的“回归基本”,降低了编码时复杂度。
- H.264可以应用在不同场合:H.264可以根据不同的环境使用不同的传输和播放速率,并且提供了丰富的错误处理工具,可以很好的控制或消除丢包和误码。
- 错误恢复功能:H.264提供了解决网络传输包丢失的问题的工具,适用于在高误码率传输的无线网络中传输视频数据。
- 较高的复杂度:264性能的改进是以增加复杂性为代价而获得的。据估计,H.264编码的计算复杂度大约相当于H.263的3倍,解码复杂度大约相当于H.263的2倍。
二、解码.264文件,生成YUV文件
这里我们选用老师所给的两个264文件进行试验。
首先需要将两个264文件进行解码,得到相应的YUV文件。
在这里只需要修改配置文件如下即可得到YUV文件。
三、将YUV重新编码为H.264文件
1、固定码率,不同的GOP长度及形状编码
设定码率都为45000kb/s,为了方便观看,成功截图只以第一个为例
1)GOP=15,2B帧
更改GOP长度
IntraPeriod = 15 # Period of I-pictures (0=only first)
更改B帧数量
NumberBFrames = 2 # Number of B coded frames inserted (0=not used)
RCUpdateMode = 3 # Rate Control type. Modes supported :
# 0 = original JM rate control,
# 1 = rate control that is applied to all frames regardless of the slice type,
# 2 = original plus intelligent QP selection for I and B slices (including Hierarchical),
# 3 = original + hybrid quadratic rate control for I and B slice using bit rate statistics
2)GOP=12,2B帧
更改GOP长度
IntraPeriod = 12 # Period of I-pictures (0=only first)
更改B帧数量
NumberBFrames = 2 # Number of B coded frames inserted (0=not used)
3)GOP=9,2B帧
更改GOP长度
IntraPeriod = 9 # Period of I-pictures (0=only first)
更改B帧数量
NumberBFrames = 2 # Number of B coded frames inserted (0=not used)
4)GOP=4,1B帧
更改GOP长度
IntraPeriod = 4 # Period of I-pictures (0=only first)
更改B帧数量
NumberBFrames = 1 # Number of B coded frames inserted (0=not used)
5)GOP=12,无B帧
更改GOP长度
IntraPeriod = 12 # Period of I-pictures (0=only first)
更改B帧数量
NumberBFrames = 0 # Number of B coded frames inserted (0=not used)
6)GOP=1,全I帧
更改GOP长度
IntraPeriod = 1 # Period of I-pictures (0=only first)
更改B帧数量
NumberBFrames = 0 # Number of B coded frames inserted (0=not used)
2、相同的GOP长度及形状编码,不同的码率
这里固定GOP长度为15帧,2B帧
1)40000kb/s
只需更改下面两个参数即可,为了方便观看,成功截图只以第一个为例,剩下的给出PSNR值
RateControlEnable = 1 # 0 Disable, 1 Enable
Bitrate = 40000 # Bitrate(bps)
2)20000kb/s
RateControlEnable = 1 # 0 Disable, 1 Enable
Bitrate = 20000 # Bitrate(bps)
3)10000kb/s
RateControlEnable = 1 # 0 Disable, 1 Enable
Bitrate = 10000 # Bitrate(bps)
3)5000kb/s
RateControlEnable = 1 # 0 Disable, 1 Enable
Bitrate = 5000 # Bitrate(bps)
4)4000kb/s
RateControlEnable = 1 # 0 Disable, 1 Enable
Bitrate = 1000 # Bitrate(bps)
5)1000kb/s
RateControlEnable = 1 # 0 Disable, 1 Enable
Bitrate = 800 # Bitrate(bps)
6)600kb/s
RateControlEnable = 1 # 0 Disable, 1 Enable
Bitrate = 600 # Bitrate(bps)
7)200kb/s
RateControlEnable = 1 # 0 Disable, 1 Enable
Bitrate = 400 # Bitrate(bps)
三、分析码流的各种编码模式和运动矢量
以1000kbps码率,GOP长度15,GOP形状2B为例:
由图中可看出,显示顺序为IBBPBBPBBPBBP,但由于进行了帧重排,编解码顺序为与显示顺序不同。
此处以第一组IPBB(编解码)为例:
四、用播放器查看所生成码流的质量
1、1000kbps码率,GOP长度15,GOP形状2B的视频
2、200kbps码率,GOP长度15,GOP形状2B的视频
可以看到,相比于1000kps码率的,该图像变得有些模糊。
五、生成率失真曲线
由生成的码流数据可以得到以下表格
并由上表可以画出下图
六、分析H.264文件
1、SPS和PPS信息
用H264Visa.exe进行分析
1)sps——序列参数集 (Sequence parameter set)
当前文件profile_idc = 100,查表可知码流档次为High-profile。
a)profile_idc
当前文件level_idc=31,即码流级别为3.1
b)level_idc
c)seq_parameter_set_id
当前文件seq_parameter_set_id=0
d)log2_max_frame_num_minus4
当前文件log2_max_frame_num_minus4 = 2,
计算MaxFrameNum = 2^(log2_max_frame_num_minus4 + 4)= 64
e)pic_order_cnt_type
当前序列pic_order_cnt_type=0,采用POC mode 0。
f)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。
g)num_ref_frames
当前文件max_num_ref_frames=16,所以参考帧最大数目为16。
h)gaps_in_frame_num_value_allowed_flag
当前文件gap_in_frame_num_value_allowed_flag=0。
i) pic_width_in_mbs_minus1
因此图像的实际宽度为16 ×(pic_width_in_mbs_minus1+1) = 16×(39+1)= 640
j)pic_height_in_map_units_minus1
因此图像的实际高度为16 ×(pic_height_in_map_units_minus1+1) = 16×(22+1)= 368
比对视频信息,发现与结果一致:
k)frame_mbs_only_flag
在本文件中,frame_mbs_only_flag=1。
2)PPS
a)pic_parameter_set_id
当前文件pic_parameter_set_id=0。
b)seq_parameter_set_id
当前文件seq_parameter_set_id=0。
c) entropy_coding_mode_flag
当前文件中,entropy_coding_mode_flag=1,采用CABAC方法。
d)pic_order_present_flag
当前文件中,pic_order_present_flag=0,即条带头中不会出现与图像顺序有关的语法元素。
e)num_slice_groups_minus1
当前文件中,num_slice_groups_minus1=0。
f) num_ref_idx_l0_default_active_minus1
当前文件中,num_ref_idx_l0_default_active_minus1=15
g)num_ref_idx_l1_default_active_minus1
当前文件中,num_ref_idx_l0_default_active_minus1=0
h) weighted_pred_flag
当前文件中,weighted_pred_flag=1。
i)weighted_bipred_idc
当前文件中,weighted_bipred_idc=2。
j)pic_init_qp_minus26
当前文件中,pic_init_qp_minus26=0
k)pic_init_qs_minus26
当前文件中,pic_init_qs_minus26=0
l)chroma_qp_index_offset
当前文件中,chroma_qp_index_offset=-2。
m)deblocking_filter_control_present_flag
当前文件中,deblocking_filter_control_present_flag=1。
n) constrained_intra_pred_flag
当前文件中,constrained_intra_pred_flag =0。
o) redundant_pic_cnt_present_flag
当前文件中,redundant_pic_cnt_present_flag=0。
p) transform_8x8_mode_flag
当前文件中,transform_8x8_mode_flag =1。
q)pic_scaling_matrix_present_flag
当前文件中,pic_scaling_matrix_present_flag=0。
2、以一个GOP为例分析
1)每个图像帧的类型及所用的编码比特数、QP值
由上图可知此文件为IPPPPP格式,只有I帧与P帧,第一个为I帧剩下全为P帧
由上图可知I帧的编码比特数为269928bits、QP值为26
第一个P帧比特数为5024bits、QP值为26,剩下的帧也可以这样查看,在这里不再展示。
2)图像帧号为横坐标、每帧所用比特数为纵坐标的曲线图
统计每个帧所用的bit数,可以得到下表
并由上表可以画出下图
3)图像帧号为横坐标、每帧所用QP为纵坐标的曲线图
统计每个帧所用的QP值,可以得到下表
并由上表可以画出下图
4)第一个I帧
其中I帧,完全使用帧内编码,编码类型全部为16*16,并且其中分配bit数可看下图,块中格数少的分配bit数少,块中小格多的分配bit数多
5)第一个P帧
可以看到运动矢量如下:绿色的点为运动矢量因为该例子几乎没有运动所以为点
如下图所示,使用了帧内编码和帧间编码,绿色的格子为skip有1554个,红色的格子为帧内编码有57个,其中有44与1616格式,看红色格子中小格子数量。
6)B帧
因为所提供的视频没有B帧,因此这里采用别的视频对B帧讲解
该帧完全使用帧间编码。黄色为B_skip宏块,占737/920=80.11%。
其余部分上课也与老师较完全的讨论过,这里不在做截图展示。