一、码流
H.264在视频编码层(VCL)和网络提取层(NAL)之间进行概念分割,以实现在不同的传输环境下的有效传输,便于与当前和将来的编码格式和不同类型的网络进行无缝连接。
二、SPS(Sequence Parameter Set)
是编码视频序列的全局参数,SPS里主要保存了一组编码视频序列(Coded Video Sequence)的全局参数。所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集(PPS)中。一般情况SPS和PPS的NAL Unit通常位于整个码流的起始位置。
三、PPS(Picture Parameter Set)
存储每一帧编码后数据所依赖的参数每一帧的编码后数据所依赖的参数保存于图像参数集(PPS)中。
四、文件GOP
单帧分析:视频每个GOP都非常长,采用对不同帧进行分析。
I帧:视频第一帧是I帧,该帧均采用帧内编码。这里面包含了1616作为一个宏块进行量化、88作为一个宏块进行一个量化、4*4作为宏块进行量化的三种类型。量化较细的地方通常有更多细节的呈现。I帧没有使用到帧间编码,该帧完全使用了帧内编码。除此以外,由于该帧没有前参考帧,没有使用到运动矢量。
B帧:视频的第二帧为B帧。我们知道,B帧的数据量是I、B、P三种数据类型中相对尺寸最小的一种类型,这是因为它支持帧间预测(包括了前向预测、后向预测和前向及后向预测)和帧内预测,以支持最大程度降低数据量。
P帧:图像的第五帧是P帧。(在编码时,是按照IPBBB的顺序进行编码,然后进行帧重排)图中的运动向量也非常明显,指出了某一宏块是从哪里移动来的。将两图来回切换,可以发现运动向量非常精准。
(参考学习于朱轩宇CSDN)
模块二:H.264不同编码定量分析
一、实验要求:
1、选择一个.mp4或者.264文件。
2、在码流分析仪软件中打开该文件,从几个层次进行分析:
(1)分析SPS和PPS里都包含哪些主要的信息,给出参数值。(例如分辨率、帧率、GOP结构等等)
(2)以一个GOP为例,分析如下信息:每个图像帧的类型及所用的编码比特数、QP值;并以图像帧号为横坐标、每帧所用比特数为纵坐标画出曲线图;以图像帧号为横坐标、每帧所用QP为纵坐标画出曲线图。以第一个I帧作为分析对象,基于该帧图像的空间特性,分析每个宏块所采用的编码类型及其比例。以第一个P帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。以某一个B帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。
二、实验原理:
见模块一
三、实验过程:
在encoder.cfg中修改下列参数即可
1.不同Gop类型的参数设置:
固定码率,以不同的GOP长度及形状编码GOP=15,2B帧;GOP=12,2B帧,GOP=9,2B帧GOP=4,1B帧;GOP=12,无B帧;GOP=1,全I帧
(以GOP=15,2B帧为例)
InputFile = "128x128_dec.yuv" # Input sequence
FramesToBeEncoded = 50 # Number of frames to be coded
SourceWidth = 128 # Source frame width
SourceHeight = 128 # Source frame height
OutputWidth = 128 # Output frame width
OutputHeight = 128 # Output frame height
ReconFile = "128x128_rec.yuv" # Reconstruction YUV file
OutputFile = "128x128_rec_GOP15-2B.264" # Bitstream
IntraPeriod = 15 # Period of I-pictures (0=only first)
IDRPeriod = 0 # Period of IDR pictures (0=only first)
NumberBFrames = 2 # Number of B coded frames inserted (0=not used)
RateControlEnable = 0 # 0 Disable, 1 Enable
编码后视频序列信息如下:
2.相同的GOP长度及形状,不同的码率
例:1000kb/s, 800kb/s,400kb/s,…
(以1000kbps为例)
nputFile = "flyer_converted_dec.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
OutputFile = "flyer_converted_rec_1000kbps.264" # Bitstream
IntraPeriod = 10 # Period of I-pictures (0=only first)
IDRPeriod = 0 # Period of IDR pictures (0=only first)
RateControlEnable = 1 # 0 Disable, 1 Enable
Bitrate = 1000000 # Bitrate(bps) -- 可变 --
RCUpdateMode = 2 # 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
#
四、实验结果及分析
六种Gop类型,截图中展示了编码中的帧重排和跳帧IBBPBBPBBPBBPBB
IBBPBBPBBPBB
IBBPBBPBB
IBPB
IPPPPPPPPPPP
IIIIIIIIII
失真分析:
在这里插入图片描述
由率失真曲线可知,GOP组结构相同时,比特率越大,编码后文件失真越小;比特率相同时,GOP越短,编码后文件失真越大。