使用编码器
TAppEncoder [--help] [-c config.cfg] [--parameter=value]
样例配置文件在 cfg/ 文件夹中提供。参数最后的值由在命令行最后出现的命令(或配置文件)为准。因此,如果一个参数的值通过一个配置文件给定,之后又通过命令行给定这个参数的值,那么命令行的参数的值将会被使用。
另外,如果使用两个配置文件指定相同的参数的话,那么将会使用在命令行最后的那个配置文件中的值。(我亲自实验过)
命令选项和描述
- –help: 打印参数的使用方法。
- -c: 指定需要使用的配置文件。如果要使用多个配置文件,则重复使用多个 -c 选项进行指定。
- –parameter=value: 将给定的参数赋值(这些参数将会在之后进行讲解)。一些参数也支持缩写 “-opt value”。这些将在本文档中,在参数名之后的括号中展示出来。(译者注:但是很抱歉,我并没有把它们写上来 TvT)
1. GOP 结构列表
定义在序列中将会重复使用的循环 GOP。这个列表需要包括 GOPSize 行、名为 Frame1, Frame2 等参数。这些帧将按照解码的顺序列出。所以 Frame1 是第一帧被解码的,Frame2 是第二帧被解码的等等。在其它方面,列表会指出每一帧解码所需要的所有被解码器保存的参考图片。这包括当前图片所使用到的参考图片,也包括未来解码所需要的参考图片。编码器不会自动计算哪些图片在未来会被参考需要保存,它们必须被指定。需要注意的是,在IDR帧之后的第一个GOP中编码的图片的某些指定参考帧可能不可用 (比如指定参考 IDR 帧之前的帧。由于 IDR 帧会清空之前所有的缓存,所以 IDR 帧之前的帧不可用) ,这将由编码器自动处理。因此在 GOP 结构列表中指定参考帧时,可以看作在当前的 GOP 前有无穷多个相同的(identical) GOP 序列。列表中的每一行包括应用于相应帧的参数,用空格隔开。
参数有(从前往后):
- Type: 片段类型,可以选择 I, P, B 中的一个
- POC: 一个 GOP 内的播放顺序,范围从 1~GOPSize
- QPOffset: QP 偏移量将会被加到 QP 参数上,以设置当前帧最终所使用的 QP 值。
QP(Quantitative Parameters 量化参数):反映空间压缩情况。QP越小,大部分细节都能被保留;QP越大,细节丢失,码率降低。一般情况下取值为 0~51
- QPOffsetModelOff: 将参数按一定比例偏移 (offset) 成线性模型,以便基于 QPOffset 调整最终的 QP 值。
- QPOffsetModelScale: 将参数按一定比例规格化 (scale) 成线性模型,以便基于 QPOffset 调整最终的 QP 值。
- SliceCbQPOffset: Cb 层级的 QP 偏移量
- SliceCrQPOffset: Cr 层级的 QP 偏移量
- QPFactor: 用于码率失真优化的权重。值越大意味着更低的图像质量和更低的比特数。一般取值为 0.3~1
- tcOffsetDiv2: 环路去方块滤波器(in-loop deblocking filter)参数 tcOffsetDiv2 会加到基本参数 LoopFilterTcOffset_div2 来为表示片段头部的图片设置最终的 tc_offset_div2 参数的值。最终的 tc_offset_div2 的值应为 -6~6 范围内的整数。
- betaOffsetDiv2: 环路去方块滤波器(in-loop deblocking filter)参数 betaOffsetDiv2 会加到基本参数 LoopFilterBetaOffset_div2 来为表示片段头部的图片设置最终的 beta_offset_div2 参数的值。最终的 beta_offset_div2 的值应为 -6~6 范围内的整数。
- temporal_id: 该帧的时序层 id 。一帧图像不能从拥有更高时序ID(temporal id)的帧预测。如果该图像的参考图片列表中有更高的时序ID的图像,那么这些图像不会被使用,但它们会被保留以备在未来的图像帧中可能会被使用。
- num_ref_pics_active: 参考图片列表 L0(前项预测列表) 和 L1(后向预测列表) 的大小,指明在编码中每个方向使用到了多少张参考图片。
- num_ref_pics: 当前帧保留的参考图片的数量。这包括将要用于当前图片的参考图片以及将在之后用于参考的参考图片。
举个例子:现在有一帧 B 帧,前项参考某 I 帧,后向参考某 B 帧,且后向参考的这个 B 帧参考某 P 帧,该 P 帧参考的 I 帧与前项参考的某 I 帧相同。那么此时 num_ref_pics_active 值为1(因为前向后向分别只直接参考了一张图像),num_ref_pics 的值为3(因为需要保存前项参考的某 I 帧、后向参考的某 B 帧以及该 B 帧所参考的 P 帧)
-
reference_pictures: 用空格隔开的 num_ref_pics 个整数的列表,指定当前帧需要保存参考图像的相对于当前图像的 POC(视当前图像为0,前一张为 -1,后一张为1,以此类推)。图像列表需要是有序的,一开始是负数从大到小排列,正数紧随其后,从小到大排列 (例如 -1 -3 -5 1 3)。注意,在列表中未出现的图片将被丢弃,因此将不能作为接下来的参考图片。
-
predict: 定义符号元素 inter_ref_pic_set_prediction_flag 的值。
-
值为0 指明参考图像集 (reference picture set RPS) 将不使用帧间预测进行编码,并且随后的(subsequent)参数 deltaRIdx-1, deltaRPS, num_ref_idcs 和 Reference_idcs 将被忽略并且不需要给出。
-
值为1 指明参考图像集将使用帧间预测编码并使用后续的deltaRIdx-1, deltaRPS, num_ref_idcs 和 Reference_idcs 参数。
-
值为2 指明参考图像集将采用帧间预测编码,但只使用 deltaRIdx-1 参数。 参数 deltaRPS, num_ref_idcs 和 Reference_idcs 的值将通过编码器基于当前 POC 和 refPic 的值,以及 deltaRIdx-1 参数所指向的参考图像集自动生成。
-
-
deltaRIdx-1: 当前 RPS 和预测器 RPS 的下标(index)差值加1
-
deltaRPS: 预测器 RPS 和当前 RPS 的 POC 的差值。
-
num_ref_idcs: 用于给当前 RPS 编码的 ref_idcs 的个数,等于预测器 RPS 的 num_ref_pics 值加一
-
reference_idcs: 一个由空格隔开的 num_ref_idcs 个整数列表,指明帧间预测的参考idcs。 ref_idcs 的值可以是 0, 1, 2, 分别表示该图片是当前图片的参考图片;该图片是未来某帧的参考图片;该图片将不再是参考图片。The first num_ref_pics of ref_idcs correspond to the Reference pictures in the predictor RPS. The last ref_idcs corresponds to the predictor picture.(后面这句不会翻译了~)
此处可参考的博客
HEVC函数入门(10)——HM软件手册software-manual(GOP,RPS,POC)
HEVC 参考帧管理(RPS)
例如,考虑如下图的编码结构。该编码结构的大小为 4,图片按照解码顺序列出。 因此,Frame1 描述 POC=4 的图片。它的参考图片是 POC=0 的图片,因此用 -4 (相对 POC ) 表示参考的图片。类似地,Frame2 的 POC=2 ,由于它参考了 0 和 4 的图片,因此参考图片将用 -2 2 列出。Frame3 是一个特例:即使它只参考了 POC 的值为 0 和 2 的图片,它仍需包含 POC 为 4 的图片。为了之后用于参考图片,它 (POC=4的图片) 必须被保留。因此,Frame3 的参考图片列表将变为 -1 1 3. Frame4 的 POC=3,它的参考图片列表为 -1 1.
帧间预测在 Frame2, Frame3, Frame4 中可能会被使用到,因此这些帧的 predict 参数将设置为 1. Frame2 使用 Frame1 作为预测器,因此(hence) Frame2 的 deltaRIdx-1 的值设为0. 类似地,Frame3, Frame4 的 deltaRIdx-1 的值也可以这么设置,它们分别以 Frame2, Frame3 作为参考器。 deltaRPS 的值等于预测器帧的 POC 的值减去当前帧的 POC 的值。因此,Frame2 的 deltaRPS 的值为 4 − 2 = 2 4-2=2 4−2=2、Frame3 的为 2 − 1 = 1 2-1=1 2−1=1、Frame4 的为 1 − 3 = − 2 1-3=-2 1−3=−2。
在 Frame2 中,使用了 POC 为 0 和 2 的参考图片,因此 reference_idcs 参数的值为 1 1,指明在 Frame1 中的参考图片 -4 在 Frame2 中仍然是参考图片,并且 Frame1 也是 Frame2 的参考图片。Frame3 的 reference_idcs 的值是 1 1 1 。第一个和第二个 “1” 表示 Frame2 的参考图片 “-2 2” 仍然是 Frame3 的参考图片,并且最后的一个 “1” 表示 Frame2 仍然是 Frame3 的一张参考图片。在 Frame4 中,reference_idcs 的值为 0 1 1 0 。第一个 “0” 表示 Frame3 中的参考图片 “-1” 将不再是 Frame4 的参考图片。接下来的两个 “1” 表示 Frame3 中接下来的两张参考图片 “1 3” 将成为 Frame4 的参考图片,最后的 “0” 表示 Frame3 不是 Frame4 的参考图片。
为了向编码器指明这些信息,Table2 中的参数可能会被使用到。
Frame1 | Frame2 | Frame3 | Frame4 | |
---|---|---|---|---|
Type | P | B | B | B |
POC | 4 | 2 | 1 | 3 |
QPOffset | 1 | 2 | 3 | 3 |
QPOffsetModelOff | 0 | 0 | 0 | 0 |
QPOffsetModelScale | 0 | 0 | 0 | 0 |
SliceCbQPOffset | 0 | 0 | 0 | 0 |
SliceCrQPOffset | 0 | 0 | 0 | 0 |
QPfactor | 0.5 | 0.5 | 0.5 | 0.5 |
tcOffsetDiv2 | 0 | 1 | 2 | 2 |
betaOffsetDiv2 | 0 | 0 | 0 | 0 |
temporal_id | 0 | 1 | 2 | 2 |
num_ref_pics_active | 1 | 1 | 1 | 1 |
num_ref_pics_active | 1 | 2 | 3 | 2 |
reference_pictures | -4 | -2 2 | -1 1 3 | -1 1 |
predict | 0 | 1 | 1 | 1 |
deltaRIdx-1 | 0 | 0 | 0 | |
deltaRPS | 2 | 1 | -2 | |
num_ref_idcs | 2 | 3 | 4 | |
reference_idcs | 1 1 | 1 1 1 | 0 1 1 0 |
在这里,用于预测的帧被赋予了更高的质量,通过分配一个更低的 QPOffset 值来实现。同样的,不用于参考的帧也被指定为更高时序层,使其能够在其余每帧之后进行解码。注意:每行需要包括一帧的信息,所以这个配置内容可以写成如下形式:
Frame1: P 4 1 0 0 0 0 0.5 0 0 0 1 1 -4 0
Frame2: B 2 2 0 0 0 0 0.5 1 0 1 1 2 -2 2 1 0 2 2 1 1
Frame3: B 1 3 0 0 0 0 0.5 2 0 2 1 3 -1 1 3 1 0 1 3 1 1 1
Frame4: B 3 3 0 0 0 0 0.5 2 0 2 1 2 -1 1 1 0 -2 4 0 1 1 0
注:原手册中可能有错误,漏了 SliceCbQPOffset 和 SliceCrQPOffset 两个参数,会导致编码器无法解析。这里的是我修改过的。
FrameK 的 deltaRIdx-1, deltaRPS, num_ref_idcs 和 reference_idcs 的值可以通过 Frame K _K K 的 POC 值和 Frame M _M M 的 num_ref_pics 和 reference_pictures 的值推到出来。其中 K 是即将进行帧间编码的 RPS 的下标(index),M 是接下来要参考的 RPS 的下标。
注:上述的帧间 RPS 参数值的自动生成功能 已经集成进了编码器,并且可以通过以下步骤激活:设置 deltaRIdx-1 的值,并且将 predict 的值设为 2 即可。正如之前描述的一样。