文章目录
- H.264 码流分析实验
- 实验目标
- 实验过程
- 分析SPS
- profile_idc
- level_idc
- seq_parameter_set_id
- log2_max_frame_num_minus4
- pic_order_cnt_type
- log2_max_pic_order_cnt_lsb_minus4
- num_ref_frames
- gaps_in_frame_num_value_allowed_flag
- pic_width_in_mbs_minus1
- pic_height_in_map_units_minus1
- frame_mbs_only_flag
- direct_8x8_inference_flag
- frame_cropping_flag
- vui_parameters_present_flag
- 分析PPS
- pic_parameter_set_id
- seq_parameter_set_id
- entropy_coding_mode_flag
- bottom_field_pic_order_in_frame_present_flag
- num_slice_groups_minus1
- num_ref_idx_l0_default_active_minus1、num_ref_idx_l0_default_active_minus1
- weighted_pred_flag
- weighted_bipred_idc
- pic_init_qp_minus26和pic_init_qs_minus26
- chroma_qp_index_offset
- deblocking_filter_control_present_flag
- constrained_intra_pred_flag
- redundant_pic_cnt_present_flag
- 可视化部分
- 以一个GOP为例进行分析
- 参考文献
H.264 码流分析实验
实验目标
选择一个.mp4
或者.264
文件,在码流分析仪软件中打开,从以下几个层次分析:
- 分析
SPS
和PPS
里都包含哪些主要的信息,给出参数值。(例如:分辨率、帧率、GOP结构信息等)。 - 以一个GOP为例,分析以下信息:
- 每个图像帧的类型及采用的编码比特数、QP值;并以图像帧号为横坐标,每帧所用比特数为纵坐标画出曲线图;以图像帧号为横坐标、每帧所用QP为纵坐标画出曲线图。
- 以第一个I帧作为分析对象,基于该帧图像的空间特性,分析每个宏块所采用的编码类型及其比例。
- 以第一个P帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。
- 以某一个B帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。
实验过程
分析SPS
SPS即Sequence Paramater Set
,又称为序列参数集。SPS中保存了一组编码视频序列的全局参数。通过码流分析软件打开.264
文件后可以查看到该文件的SPS
信息如下:
profile_idc
标识当前H.264
码流的profile
。我们知道H.264
中定义了三种常用档次的Profile
:
- 基准档次:
baseline profile
- 主要档次:
main profile
- 扩展档次:
extended profile
在H.264
的SPS中,第一个字节就表示为profile_idc
,根据它的值就可以确定码流符合那种档次:
根据新的标准规定,我们的实验码流中,
p
r
o
f
i
l
e
_
i
d
c
=
100
profile\_idc = 100
profile_idc=100,说明码流的档次为High
。
level_idc
标识当前码流的Level
,编码的Level
定义了某种条件下的最大视频分辨率、最大视频帧率等参数,码流遵从的Level
由Level_idc
决定。
由上表对照可得, 实验码流中
l
e
v
e
l
_
i
d
c
=
31
level\_idc = 31
level_idc=31,表示该码流支持720P高清格式,支持隔行扫描,每秒采样点数27648000。
seq_parameter_set_id
表示当前的序列参数集的id。通过该id值,图像参数集PPS可以引用其代表的SPS中的参数。
log2_max_frame_num_minus4
用于计算MaxFrameNum
的值,公式如下:
M
a
x
F
r
a
m
e
N
u
m
=
2
(
l
o
g
2
_
m
a
x
_
f
r
a
m
e
_
n
u
m
_
m
i
n
u
s
4
+
4
)
MaxFrameNum = 2^{(log2\_max\_frame\_num\_minus4 + 4)}
MaxFrameNum=2(log2_max_frame_num_minus4+4)
MaxFrameNum
是frame_num
的上限值,frame_num
是图像序号的一种表示方法,在帧间编码中常用作一种参考帧标记的手段。
在实验码流中:
M
a
x
F
r
a
m
e
N
u
m
=
2
6
=
64
MaxFrameNum = 2 ^ {6} = 64
MaxFrameNum=26=64
pic_order_cnt_type
表示解码picture order count(POC)
的方法。POC
是另一种计量图像序号的方式,与frame_num
有着不同的计算方法。该语法元素的取值为0、1或2。
实验码流中为该值为0。
log2_max_pic_order_cnt_lsb_minus4
用于计算MaxPicOrderCntLsb
的值,该值表示POC
的上限,计算公式如下:
M
a
x
P
i
c
O
r
d
e
r
C
n
t
L
s
b
=
2
(
l
o
g
2
_
m
a
x
_
p
i
c
_
o
r
d
e
r
_
c
n
t
_
l
s
b
_
m
i
n
u
s
4
+
4
)
MaxPicOrderCntLsb = 2^{(log2\_max\_pic\_order\_cnt\_lsb\_minus4 + 4)}
MaxPicOrderCntLsb=2(log2_max_pic_order_cnt_lsb_minus4+4)
实验码流中,
M
a
x
P
i
c
O
r
d
e
r
C
n
t
L
s
b
=
2
7
=
128
MaxPicOrderCntLsb = 2 ^ 7 = 128
MaxPicOrderCntLsb=27=128
num_ref_frames
表示参考帧的最大数目,实验码流中为16。
gaps_in_frame_num_value_allowed_flag
标识位,说明frame_num
中是否允许不连续的值。实验码流中为0,说明不允许不连续的值。
pic_width_in_mbs_minus1
用于计算图像的宽度。单位为宏块个数,因此图像的实际宽度为:
f
r
a
m
e
w
i
d
t
h
=
16
×
(
p
i
c
_
w
i
d
t
h
_
i
n
_
m
b
s
_
m
i
n
u
s
1
+
1
)
;
frame_width = 16 × (pic\_width\_in\_mbs\_minus1 + 1);
framewidth=16×(pic_width_in_mbs_minus1+1);
实验图像的实际宽度为:
f
r
a
m
e
_
w
i
d
t
h
=
16
×
40
=
640
frame\_width = 16 \times 40 = 640
frame_width=16×40=640
pic_height_in_map_units_minus1
使用PicHeightInMapUnits
来度量视频中一帧图像的高度。PicHeightInMapUnits
并非图像明确的以像素或宏块为单位的高度,而需要考虑该宏块是帧编码或场编码。PicHeightInMapUnits
的计算方式为:
P
i
c
H
e
i
g
h
t
I
n
M
a
p
U
n
i
t
s
=
p
i
c
_
h
e
i
g
h
t
_
i
n
_
m
a
p
_
u
n
i
t
s
_
m
i
n
u
s
1
+
1
;
PicHeightInMapUnits = pic\_height\_in\_map\_units\_minus1 + 1;
PicHeightInMapUnits=pic_height_in_map_units_minus1+1;
实验图像的值为22,故
P
i
c
H
e
i
g
h
t
M
a
p
U
n
i
t
s
=
23
PicHeightMapUnits = 23
PicHeightMapUnits=23
frame_mbs_only_flag
标识位,说明宏块的编码方式。当该标识位为0时,宏块可能为帧编码或场编码;该标识位为1时,所有宏块都采用帧编码。根据该标识位取值不同,PicHeightInMapUnits
的含义也不同,为0时表示一场数据按宏块计算的高度,为1时表示一帧数据按宏块计算的高度。按照宏块计算的图像实际高度FrameHeightInMbs
的计算方法为:
F
r
a
m
e
H
e
i
g
h
t
I
n
M
b
s
=
(
2
−
f
r
a
m
e
_
m
b
s
_
o
n
l
y
_
f
l
a
g
)
∗
P
i
c
H
e
i
g
h
t
I
n
M
a
p
U
n
i
t
s
FrameHeightInMbs = ( 2 − frame\_mbs\_only\_flag ) * PicHeightInMapUnits
FrameHeightInMbs=(2−frame_mbs_only_flag)∗PicHeightInMapUnits
故实验图像的实际高度仍为23。
direct_8x8_inference_flag
标识位,用于B_Skip
、B_Direct
模式运动矢量的推导计算。
frame_cropping_flag
标识位,说明是否需要对输出的图像帧进行裁剪。
vui_parameters_present_flag
标识位,说明SPS中是否存在VUI信息。
分析PPS
除了序列参数集SPS之外,H.264中另一重要的参数集合为图像参数集Picture Paramater Set(PPS)
。
pic_parameter_set_id
表示当前PPS的id。某个PPS在码流中会被相应的slice
引用,slice
引用PPS的方式就是在Slice header
中保存PPS的id值。该值的取值范围为
[
0
,
255
]
[0,255]
[0,255]。
seq_parameter_set_id
表示当前PPS所引用的激活的SPS的id。通过这种方式,PPS中也可以取到对应SPS中的参数。该值的取值范围为 [ 0 , 31 ] [0,31] [0,31]。
entropy_coding_mode_flag
熵编码模式标识,该标识位表示码流中熵编码/解码选择的算法。当该值为0时,通常为指数哥伦布编码或者CAVLC;当该值为1时,通常为CABAC。
bottom_field_pic_order_in_frame_present_flag
标识位,用于表示另外条带头中的两个语法元素delta_pic_order_cnt_bottom
和delta_pic_order_cn
是否存在的标识。这两个语法元素表示了某一帧的底场的POC的计算方法。
num_slice_groups_minus1
表示某一帧中slice group
的个数。当该值为0时,一帧中所有的slice
都属于一个slice group
。
实验码流中此值为0,表示图像帧中只有一个Slice group
。
num_ref_idx_l0_default_active_minus1、num_ref_idx_l0_default_active_minus1
表示当Slice Header
中的num_ref_idx_active_override_flag
标识位为0时,P/SP/B slice
的语法元素num_ref_idx_l0_active_minus1
和num_ref_idx_l1_active_minus1
的默认值。
weighted_pred_flag
标识位,表示在P/SP slice
中是否开启加权预测。
weighted_bipred_idc
表示在B Slice
中加权预测的方法,取值范围为
[
0
,
2
]
[0,2]
[0,2]。0表示默认加权预测,1表示显式加权预测,2表示隐式加权预测。
pic_init_qp_minus26和pic_init_qs_minus26
表示初始的量化参数。实际的量化参数由该参数、slice header
中的
s
l
i
c
e
_
q
p
_
d
e
l
t
a
s
l
i
c
e
_
q
s
_
d
e
l
t
a
\frac{slice\_qp\_delta}{slice\_qs\_delta}
slice_qs_deltaslice_qp_delta计算得到。
chroma_qp_index_offset
用于计算色度分量的量化参数,取值范围为 [ − 12 , 12 ] [-12,12] [−12,12]。
deblocking_filter_control_present_flag
标识位,用于表示Slice header
中是否存在用于去块滤波器控制的信息。当该标志位为1时,slice header
中包含去块滤波相应的信息;当该标识位为0时,slice header
中没有相应的信息。
constrained_intra_pred_flag
若该标识为1,表示I宏块在进行帧内预测时只能使用来自I和SI类型宏块的信息;若该标识位0,表示I宏块可以使用来自Inter类型宏块的信息。
redundant_pic_cnt_present_flag
标识位,用于表示Slice header
中是否存在redundant_pic_cnt
语法元素。当该标志位为1时,slice header
中包含redundant_pic_cnt
;当该标识位为0时,slice header
中没有相应的信息。
可视化部分
以一个GOP为例,以图像帧号为横坐标、每帧所用比特数为纵坐标画出曲线图。
从上图可以看出,第一个GOP长度为250。我们导出他的statistic
数据:
选取0-249的数据进行绘图:
以一个GOP为例进行分析
以帧作为分析对象,基于该帧图像的空间特性,分析每个宏块所采用的编码类型及其比例。
第一个I帧
可以看出,I帧本身作为帧内预测帧,无参考帧,编码时多采用
8
×
8
8\times8
8×8、
16
×
16
16\times16
16×16的宏块,细节部分也有采用
4
×
4
4 \times 4
4×4的宏块,平均每个宏块编码比特数为37.480,QP值为27.328.
第一个B帧
可以看出,B帧作为双向参考帧,压缩比较高,有很多Skip
宏块,平均每个宏块编码比特数为1.596,QP值为23.333。
第一个P帧
可以看出,P帧作为前向参考帧,压缩比比I帧高但比B帧低,有很多Skip
宏块,也有部分
16
×
16
16 \times 16
16×16和
8
×
8
8 \times 8
8×8的宏块,平均每个宏块编码比特数为10.870,QP值为30.558。
参考文献
https://blog.csdn.net/hdkks/article/details/117994216?spm=1001.2014.3001.5501
https://zhuanlan.zhihu.com/p/27896239
https://blog.csdn.net/heanyu/article/details/6204414