【FFmpeg实战】GOP结构

在使用HM编码器时我们经常要使用预定义的配置文件,在配置文件里有关于GOP的相关定义,这里定义了GOP的结构和相关参数,GOP结构在视频序列中重复使用。定义中包含GOPSize行,按解码顺序每行一帧,所以Frame1是解码第一帧,Frame2是解码第二帧,依次类推。而且定义了每帧的参考图像,包括当前帧的参考图像和后续帧的参考图像。编码器不会自动计算哪一帧会在将来用作参考,所以必须指定。注意在第一个GOP的IDR帧后的图像为其指定的参考图像有些可能不可用,编码器会自动处理。
下面是LDP配置文件中GOP结构的相关定义:

在这里插入图片描述

在这里插入图片描述

下面逐项解释每列的意思:

Type:表示slice type,可取I、P、B。

POC:播放顺序,取值为1到GOPSize。

QPOffset:当前帧的最终QP等于QPOffset+QP。

QPOffsetModelOff:线性模型的偏移值,用于调整最终QP即QPOffset+QP。

QPOffsetModelScale:线性模型的缩放值,用于调整最终QP即QPOffset+QP。

CbQPOffset:Cb的QP offset。

CrQPOffset:Cr的QP offset。

QPFactor:RDO中使用的权重。取较大的值意味着较小的码率和较低的质量。典型取值在0.3到1间。

tcOffsetDiv2:在去方块滤波中最终的 tc_offset_div2 = LoopFilterTcOffset_div2 + tcOffsetDiv2。最终的tc_offset_div2取值为-6到6间的整数。

betaOffsetDiv2:在去方块滤波中最终的 beta_offset_div2 = LoopFilterBetaOffset_div2+ betaOffsetDiv2。最终的tc_offset_div2取值为-6到6间的整数。

temporal_id:表示该帧的时域层。低时域层的帧不能参考高时域层的帧。如果某帧的参考图像里有时域层大于自己的帧,则在参考时不会使用它,但是会保留它可能将来的帧会用到。

num_ref_pics_active:L0和L1的大小,表示在编码中每个方向使用多少个参考图像。

num_ref_pics:当前帧保存的参考图像数量。包括当前帧使用的和未来帧会使用的参考图像。

reference_pictures:包含num_ref_pics个整数,用空格分隔开。表示参考图像相对于当前图像的POC。这个列表是有序的,以负数开始从大到小,然后是正数,从小到大,例如(-1 -3 -5 1 3)。注意,该列表不包含的图像会被丢弃,即未来的帧无法参考不在该列表中的图像。

predict:定义语法元素inter_ref_pic_set_prediction_flag的值。0表示RPS编码时不适用帧间RPS预测,且deltaRIdx-1, deltaRPS, num_ref_idcs和Reference_idcs参数被忽略不需要传输。1表示RPS编码时使用帧间RPS预测且使用deltaRIdx-1, deltaRPS, num_ref_idcs和Reference_idcs参数。2表示RPS编码时使用帧间RPS预测且仅使用deltaRIdx-1参数,deltaRPS, num_ref_idcs和Reference_idcs参数编码器可以通过POC和refPic值自动推导,且deltaRIdx-1指向RPS。

deltaRIdx -1:表示当前RPS和预测RPS-1索引的差值。

deltaRPS:预测RPS的POC和当前RPS的POC差值。

num_ref_idcs:当前RPS需要编码的ref_idcs数,其值等于预测RPS的num_ref_pics+1。

reference_idcs:包含 num_ref_idcs个整数的用空格分隔开的列表,表示帧间RPS预测的参考索引。取值可以为0,1和2,分别表示该参考图像是当前图像的参考图像,未来图像的参考图像,不用作参考。前面num_ref_pics个值代表了预测RPS内的参考图像,最后一个值代表预测图像本身。
在这里插入图片描述
以上图为例,每个GOP包含4帧图像,按解码顺序排列。Frame1对应POC=4的图像,它参考了图像0,所以参考图像为-4。Frame2对应POC=2的图像,它参考了图像0和4,所以参考图像为-2,2。Frame3对应POC=1的图像,它比较特别虽然只参考了图像0和2,但是还需要保存图像4用作未来图像参考,所以参考图像为-1,1,3。Frame4对应POC=3的图像,参考了图像2和4所以参考图像为-1,1。

Frame2、Frame3、Frame4可以使用帧间RPS预测,所以这些帧的predict参数置为1。Frame2使用Frame1作为预测值所以deltaRIdx-1=0。同理,Frame3和Frame4分别使用Frame2和Frame3作为预测值,deltaRIdx-1=0。deltaRPS等于预测帧的POC减当前帧的POC,因此Frame2的deltaRPS=4-2=2,Frame3的deltaRPS=2-1=1,Frame4的deltaRPS=1-3=-2。

Frame2的参考图像POC为0和4,所以对应的reference_idcs为1,1,第1个1表示参考RPS(Frame1的RPS)中的-4仍作为参考,第2个1表示Frame1本身也用作参考。

Frame3的reference_idcs为1,1,1,第1个和第2个1表示参考RPS(Frame2的RPS)中的-2,2仍作为参考,最后一个1表示Frame2本身也用作参考。

Frame4的reference_idcs为0,1,1,0,第1个0表示参考RPS(Frame3的RPS)中的-1在Frame4中不用作参考,接下来的两个1表示参考RPS(Frame3的RPS)中的1,3仍作为参考,最后一个0表示Frame3本身不用作参考。

该GOP对应的参数如下:
在这里插入图片描述
其中用作参考的帧通过使用较小的QPOffset来提高质量。同时非参考帧时域层设置较大值。

FrameK的deltaRIdx-1, deltaRPS, num_ref_idcs和Reference_idcs参数可以通过其POC和FrameM的POC,num_ref_idcs,reference_pictures值生成。K表示待编码RPS的索引,M是参考RPS的索引。生成过程如下:
在这里插入图片描述
该生成过程集成到了编码器当中,需要通过设置predict=2开启。

  >>> 音视频开发 视频教程: https://ke.qq.com/course/3202131?flowToken=1031864 
  >>> 音视频开发学习资料、教学视频,免费分享有需要的可以自行添加学习交流群: 739729163  领取

猜你喜欢

转载自blog.csdn.net/weixin_52622200/article/details/131484342