原文地址:http://bbs.chinavideo.org/viewthread.php?tid=14356&extra=page%3D1
GOP 两个IDR帧之间的距离,x264中和GOP中相关的参数有两个,其一是-keyint,控制的是GOP中最大可能距离,另一个是-min-keyint,控制的是允许最小的GOP距离
IDR 和IDR有关的参数除了上面的GOP设定的两个基本参数之外,还有一个scenecut控制了如何自适应的通过判断场景的变化加入IDR帧,用来override之前的判断。具体做法是通过计算本帧和前一帧之间visual difference 在根据scenecut和minkeyint的设定值形成判断,判定此处是否存在scenechange,判断成立的话将本帧判断为IDR帧,反之则有可能为I帧(判断依据的前半成立)或者BP.
Ref
frames 首先这是一个针对sub-mb level而言的参数,而不是一个从frame角度说的参数。假定在b-pyramid关掉的前提下,ref frames控制的是p帧内每个P sub-macroblock(8x8),它可以选择的前向一遍吗P/I帧的最大值,已
编码帧一般放在decoded
picture buffer(DPB)中,而DPB的允许大小又level控制,这也是不同分辨率下DXVA Compatible Profile中ref设置的参照标准。在编码过程中,P Frame中每个P的8x8 sub-MB,都会在ref规定的DPB中寻找最合适(比如difference最小)的某一帧的某一位置作为它的参考块。在没有weightp引入 的前提下,对每一个P Sub-MB而言,最终作为参考总对象的只可能有一个。
Weightp,我们来看weightp下的情况()
编码顺序:
我们回到最基本的无weightp下,站在frame level的角度说下编码的顺序是怎样的,同时假设我们处理的第一真是DIR帧,此处所有的“向后”指的是回访顺序时间增长的方向:
1. 编码IDR帧
2. 根据scenecut 和 min-keyint的设置,向后移动 min-keyint的距离,开始判定是否为scenechange,直到判定满足,或者到达keyint设置值的距离时候停止。同时记录判定条件不完全满足时候的位置。
3. 编码找到的为指针,亦为IDR帧,GOP形成。
4. 根据2步中得到的判定条件不完全满足的位置,将对应帧按时间顺序用I编码。
5. 找到最头上IDR和离其最近的I帧形成的Sub-GOP(严格意义上说此处并非GOP因为GOP之间不能交换信息,)结合bframes的设定大小,推断P帧出现的位置。具体而言,按时间顺序走每一帧比较该帧用P编码和B编码时的视觉误差和复杂度何者更大,根据某些公式推导出此处应该用何种帧类型,再向后移一帧;如果直到bframes规定的值都未出现P,则强制插入一帧P。这样就决定了每个sub-GOP内P帧的位置。
6. 最后一步,根据I/IDR/P形成的子区间,按时间顺序编码各帧为B帧。
例子
100-120帧这样的一段
视频
第一步结束后编码完成 100帧
第二步结束后可能编码完成 120帧和110帧 (IDR帧)同时找出了104,108, 115帧应该编码为I
第四步结束后编码完成104 108 115 帧为I
第五步对 100-104 104- 108 108-110 110 – 115 115-120五个子区间,判断P帧出现的位置并编码有可能判断出102 113 118 为p帧
最后一步在编码之间的部分为B帧
于是
解码过程的输出帧顺序其实是
100 110 104 108 102 101 103 105 106 109.。。。。。。。