关于X264比较好流程的介绍(GOP分法)

关于X264比较好流程的介绍(GOP分法)
 
转载自:http://www.nmm-hd.org/bbs/thread-1014-1-2.html
由于x264最近引入了weightp,虽然weighted p-prediction早已是H.264标准中规定的内容了,但由于其本身的难以实现,知道最近x264才加入对其的支持。那么我就从GOP开始理清下这堆让人烦恼的关系吧:

GOP:GOP的概念并非是独一的,比如我们在谈论Scalable Video Coding(可裁剪编码)时,会常常把GOP说成相邻IP之间的这么一组帧集合,所以早上大虾问我时我毫不犹豫的用了SVC中的定义。不过在X264 中,由于它本身尚不支持SVC,GOP被定义为IDR帧之间的距离,至于IDR是什么我在下面即会介绍,而x264中和GOP相关的参数主要有二,其一是 –keyint,控制的是GOP的最大可能距离;另一个是–min-keyint,控制的是允许最小的GOP距离。

IDR:即时可解码帧的缩写,所谓即时可解码无非就是本帧内所有的MB都采用的是Intra-prediction方式编码的,这样不需要任何其它帧的信息就能解码显示此帧的全部内容了。在x264中,IDR帧是I帧的一个子集,而和IDR有关的参数除了上面GOP设定的两个基本参数外,还有一个 –scenecut,它控制了如何自适应的通过判断场景的变化加入IDR帧,以override之前的判断。其具体做法是通过计算本帧和前一帧之间 visual difference在根据scenecut和minkeyint的设定值形成判据,判定此处是否存在scenechange,判据成立的话则将本帧判定为IDR帧,反之则有可能为I帧(判据的前半成立)或者BP。同时,x264中也限制了被两个IDR帧包括的区间之间,是没有任何信息的“交流”的,亦即不允许分属于不同IDR帧区间内的两帧互为参考关系。从这层意义上看,IDR即决定了GOP的size。

I Frame:Intra-predicted Frame,嗯,这个估计都知道,不过由于IDR的存在,使得x264的GOP内也可以存在I帧。

ref frames:首先,这是一个针对Sub-MB level而言的参数,而不是一个从Frame角度说的参数。假定在b-pyramid关掉的前提下,ref frames控制的是p帧内的每个P sub-macroblock(8×8),他可以选择的前向已编码P/I帧的最大值,已编码帧一般放在decoded picture buffer(DPB)中,而DPB的允许大小由Level控制,这也是不同分辨率下DXVA Compatible Profile中ref设置的参照标准。在编码过程中,P Frame中每个P的8×8 sub-MB,都会在ref规定的DPB中寻找最合适(比如difference最小)的某一帧的某一位置作为它的参考块。在没有weightp引入的前提下,对每一个P Sub-MB而言,最终作为参考的对象只可能有一个。

weightp:好,我们来看weightp下的情况(依然关闭b-pyramid),为了方便说明,我把当前待编码帧用n表示,比如ref frames此时是4,那么DPB能最多可能有4个之前已编码的I或者P帧,假设他们的标号分别是n0~n3。再规定,我现在编码到第m个sub-MB。在没有weightp的情况下,m只可能选择n0~n3中某一帧内的m’为参考对象;而weightp的引入,使得 m = a0*m’_n0 + a1*m’_n1 + a2*m’_n2 + a3*m’_n3 成为了可能。

编码顺序:在理清楚了上面的所有概念后,编码器在工作时到底是怎么一样的处理顺序,以及H.264引以为傲的编解码顺序和播放顺序分离的原理,就很容易理解了。
此处我们回到最基本的无weightp下,站在frame level的角度说下编码的顺序是怎样的,同时假设我们处理的第一帧是IDR帧,此处所有的“向后”指的是回放顺序时间增长的方向:
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 …



个人总结:
1.GOP被定义为IDR帧之间的距离,并且每个GOP之间是没有通信的。
2.IDR:即时可解码帧的缩写,所谓即时可解码无非就是本帧内所有的MB都采用的是Intra-prediction方式编码的,这样不需要任何其它帧的信息就能解码显示此帧的全部内容了。IDR帧是I帧的子集;
怎么样判断一个GOP的距离或者说设置一帧为IDR,在X264中有一个变量scenecut,通过计算本帧和前一帧之间visual difference在根据scenecut和minkeyint的设定值形成判据,判定此处是否存在scenechange,判据成立的话则将本帧判定为IDR帧,反之则有可能为I帧(判据的前半成立)或者BP

你可能感兴趣的:(x264)