H.264编解码实验
一、实验原理
1.H.264文件编码原理
H.264和先前的标准一样,都采用变换编码、基于运动补偿的帧间预测和熵编码的混合框架。大的不同是增加了帧内预测,变换采用整数变换,熵编码采用自适应的方法。
2.序列参数集
语法结构说明的是某一段视频序列的编码特性
-
首先需要使用profile idc,level_idc两个语法元素说明该段视频序列遵循的是H.264/AVC标准的哪一种配置,以指导解码端调用合适的解码器进行解码。
-
其次需要使用pic order_cnt type等语法元素说明该段视频序列中每帧图像的记数方法,也需要使用 pic_ widthes in- mbs- minusl和height in- mbs minusl 这两个语法元素说明该段视频序列中图像帧的长度和宽度。
-
各段视频序列的编码特性可能不同,因此序列参数集的内容也就不会相同,也就需要一个 Sequence_parameter_set_id语法元素来区分不同的序列参数集,以方便解码端进行参考。
3. 图像参数集
说明的是某个图像帧的编码特性
-
包括编码该图像帧所采用的熵编码模式(CAVLC或 者CABAC),所使用的参考帧的数目,以及对该图像帧的亮度和色度残差进行量化时所采用的量化参数值等。
-
图像参数集中最主要的部分是该图像帧的Slice Group划分方式的表示(用于FMO)
-
其中num_ slice_groupes minusl语法元素说明了该图像帧中Slice Group的数目
-
num_ slice_group- map type语法元素说明了Slice Group 的划分方式
-
同序列参数集的情况一样,每个图像帧的编码特性 可能各不相同,也就需要一个 pic_parameter_set_id来区分不同的图像参数集。
二、文件分析步骤
1、 选择一个.mp4或者.264文件。
2、 在码流分析仪软件中打开该文件,从几个层次进行分析:
(1) 分析SPS和PPS里都包含哪些主要的信息,给出参数值。(例如分辨率、帧率、GOP结构等等)
(2) 以一个GOP为例,分析如下信息:
每个图像帧的类型及所用的编码比特数、QP值;并以图像帧号为横坐标、每帧所用比特数为纵坐标画出曲线图;以图像帧号为横坐标、每帧所用QP为纵坐标画出曲线图。
以第一个I帧作为分析对象,基于该帧图像的空间特性,分析每个宏块所采用的编码类型及其比例。
以第一个P帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。
以某一个B帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。
三、H.264文件分析
1、SPS信息的读取
2、PPS信息的读取
3、GOP中帧数据的分析
用参考软件eseye_u.exe打开demo.264观察
导出demo264.csv文件,发现视频中除了第一帧是I帧,其他全是P帧。用excel画图。
- (1)第一帧是I帧
①该帧每个宏块QP值为26。
②空间特性:在图像平滑处,格子少,量化程度低。在细节丰富处,格子越多,量化程度越高。
③ 分析每个宏块所采用的编码类型及其比例:该I帧没有使用到帧间编码,该帧完全使用了帧内编码,由于该帧没有前参考帧,没有使用到运动矢量。
- (2)第二帧是P帧
黄点
蓝点
红点
①该帧每个宏块所用的QP值为26
②分析每个宏块所采用的编码类型及其比例:该P帧黄色是b_skip块,蓝色是向前+向后编码,红色是帧内编码
四、编解码实验过程
1、实验要求
- 将自行选择或老师给的两个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、实验过程
(1)将两个264文件进行解码,得到相应的YUV文件
- demo.264
- highway_qcif.264
(2)将上面两个视频序列编码为.264文件
encoder.cfg修改后
# Files
##########################################################################################
InputFile = "demo.yuv" # Input sequence
InputHeaderLength = 0 # If the inputfile has a header, state it's length in byte here
StartFrame = 0 # Start frame for encoding. (0-N)
FramesToBeEncoded = 30 # Number of frames to be coded
FrameRate = 30.0 # Frame Rate per second (0.1-100.0)
Enable32Pulldown = 0 # Enable