一些x264参数以及其具体效果(扫盲用)

原地址 //www.cppblog.com/tx7do/archive/2013/01/30/197630.html


转载自://keyfc.laputachen.com/bbs/showtopic-52101.aspx


写这个没什么目的,就是针对目前各个高清PT站所谓的高码高参的一次阐明,详细解释每个参数在x264中对于压缩率的作用。

首先x264的参数主要分成5块


帧类型选项

位元率控制

分析

视讯可用性资讯

输入/输出


按作用而言就是两块,绝对的压缩率和码率的有效分配。


绝对的压缩率部分

me和merange和subme

这三个参数可以说是x264优秀于其他编码器最重要的工具,也是很多PT喜欢做文章的地方。

但是实际上这个在达到一定高度之后提升极为不明显。

例如很多组宣传的tesa 64 11 实际相当于umh 32 10质量提升不超过5%。(以后没说都是指同体积下,其他参数相同)但是时间的代价就基本上是多一倍的时间。非常没有意义的参数。用了只能说你狠2.



bframes和b-adapt和b-pyramid

B帧可以说是x264压制中压缩率最高的帧了(具体见附录1),所以提高B帧的压缩率对于提高整体压缩率很有帮助。

bframes就是最大B帧数,一般真人片再9在往上能囊括的不超过千分之5,动漫到12再往上能囊括的不超过千分之5。如果只要百分之1-2不能被囊括的话,真人片6,动画8。

后两个b-adapt和b-pyramid是用来提升B帧的压缩率的.

b-adapt(控制x264如何决定要放置P帧或B帧)2(最佳”算法)比1(“快速”算法)可以优秀很多,对于B帧很多的地方,效率同样的B帧数量下可以提升至少25%的压缩率(我使用GOSICK的NCED做测试bframes=8时间上多了25%-30%左右。)

b-pyramid(允许B帧作为其他帧的参照帧)也是一个有效提高压缩率的参数,允许B和p参考B帧获得更大的压缩率。strict如果你是为了保证那种茶USB的蓝光碟机能够播放就选择1强制支持标准。如果是一般高清播放机硬解就选normal,速度上影响不大(约5%左右),normal相对于strict提升也3-5%左右,性价比很高的参数。


keyint和min-keyint

keyint(设定x264输出的资料流之最大IDR帧(亦称为关键帧)间隔),越大表明越不会插入非场景变更的IDR帧。对于压缩率而言就是不会插入低压缩率的帧。所以这个是越高越安全,但是速度也会因此出现下降(开启infinite约比默认的250下降10%)。一般而言的话480-720左右就够了,除非你和我一样的EP。

min-keyint顾名思义是设定IDR帧之间的最小长度。这个参数我的意思是必须设置为1最好,不是说1可以提高压缩率什么的,而是很多商业解码器(FLASH,TMT,POWERDVD等等)解码的时候对于非1反而会出错,主要是跳到某个地方的时候会出现某几帧花屏的BUG。


ref和weightp和no-mixed-refs

ref:此值是每个P帧可以使用先前多少帧作为参照帧的数目,唯一一个影响X264级别的参数,如果要符合DXVA硬解码标准(lv4.1及以下)1080p不能超过4,720p不能超过9,如果要符合DXVA2硬解码标准(lv5.1及以下),1080p下随意,4K下不超过5。这个对速度的影响很大,但是相应参数高在有效范围内效率也很高。

weightp:这个是优化参考方法的,2(分析淡入/淡出和重复参照帧)相对于1(分析淡入/淡出,但不分析重复参照帧)在b-pyramid=2的时候很有优势,帧直接的来回参考可以大幅有效的提升压缩率。

no-mixed-refs这个如果关闭会以每个8x8分割为基础来选取参照,而不是以每个宏区块为基础,明显是降低效率的参数,而且关闭这个速度也不会提高多少。


no-chroma-me和no-fast-pskip和no-dct-decimate。

第一个是提高速度降低质量的,性价比很低,基本是提升了3%的速度换到了3%以上的质量下降,最好不要用。

后两个是提升质量降低速度的一般而言是提升1%左右的质量降低5%左右的速度。


码率分配


这个的作用和有效性远比提高压缩率重要。比如你有一斤饭,你分给吃饱的人吃8两,给饿的人吃2两,最后是吃饱的人吃撑了,饿的人丝毫没有吃饱。我们这里管这分给吃饱的人吃的8两叫做垃圾码率,这饿的人丝毫没有吃饱叫做局部欠码。可以看出,如果分配好,就可以让饱的人吃的尽量少,饿的人吃的尽量多,这样便是提高了码率的有效分配,作用是十分明显的。而且最重要的是这些都没有之前提高压缩率的参数耗时间。


参数并不多,但是用好他们你可以灵活有效的分配码率,甚至可以使自己12GB的看上去一点不比15GB的压制差


mbtree

使用宏区块树位元率控制会改善整体压缩率,借由追踪跨帧的时间传播(temporal propagation)并相应地加权。这个参数说白了就是把那些人眼认为不重要的地方少分配码率,人眼认为重要的地方多分配码率。不过这参数在CRF过低的时候(例如低于CRF17)后会看到优势远远不如副作用。不过一般压制没必要到那么低,个人是强烈建议开启。当然这个参数的副作用如果不做抑制也会很明显,例如出现那种给饿的人吃2两这样严重不足的情况,主要表现就是对于线条会毁的很厉害。


qcomp

这个当mbtree启用时,它会影响mbtree的强度(qcomp越大,mbtree越弱)。 预设的0.6还是会让MBTREE的副作用大于正作用,一般设置到0.75-0.8比较好,这样mbtree会处于一个分配较好的范围内。

如果你是no-mbtree,你就直接用默认好了。


psy-rd

这个是视觉最佳化的优化,但是不是意味着这个就表示越高越好。过高只会让原盘的颜色变得诡异,甚至因为调色而毁掉不少细节。

第一个数是Psy-RDO的强度,用于在量化的时候颜色更偏向人的喜好,默认1.0偏高,建议设置为0.6左右最好。第二个数是Psy-Trellis的强度用于增加平面的码率分配,是很好的抑制mbtree副作用的参数。设定0.15-0.18比较好。


aq-mode和aq-strength

没有AQ时,x264很容易分配不足的码率到细节较少的部分,而AQ的部分就是修正这个


aq-mode

1:允许AQ重新分配,最稳定但是效率最低的AQ。 

2:自动变化(Auto-variance)AQ,会尝试对每帧调整强度。不稳定,很容易出现平面区域欠码的问题,适合对于那种没有噪点,画面很干净的片子使用。

3(tmod专用):2的优化版本,修正了平面区域欠码的问题,个人认为可以替代AQ1。

4(tmod专用):一个针对真人优化的模式,整体上更多是在平面达到一定量化之后把冗余的码率分配到高动态场景上,对于abr较好,对于crf不如3效率高。

mixaq:(aq+aq2,tmod的8bit mix aq版本专用):用于进一步修正平面码率分配问题,一般设置--aq2-strength 0.6 --aq2-sensitivity 16这样。

oreaq(tmod专用):这个用的好就是神器用不好会出各种问题,对于AQ的分配采用对于不同的亮度分配不同的量化值,对于不同的片子要进行不同的预设值,需要反复调试才能获得比较好的效果,所以一般不要去用

aq-strength:设定AQ偏向低细节(平滑)的宏区块之强度。对于不同的AQ要用不同的参数

几个简单例子

对于动画(不很干净的):--aq-mode 3  --aq-strength 0.8

对于真人不做降噪:--aq-mode 3  --aq-strength 0.6

对于真人做降噪或者对于动画干净的:--aq-mode 2  --aq-strength 1.1


fade-compensate 

这个是压制8bit的时候用的,10bit就不要动这个了,一般设置为0.24-0.32左右比较好,一定程度上保护那些渐变场景不会出banding。


fgo(tmod专用)

这个是用于压制的时候保留噪点,用于压制的时候更多的码率分配到噪点下的细节上,对于8bit输入压制没有什么噪点的片源一般没什么必要用。对于16bit做了dither的用于保留dither噪点,可以用这个保留dither噪点。



























附录1:

采用的压缩方法: 分组:把几帧图像分为一组(GOP),为防止运动变化,帧数不宜取多。

1.定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;

2.预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;

3.数据传输:最后将I帧数据与预测的差值信息进行存储和传输。


I帧:帧内编码帧

I帧特点:

1.它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;

2.解码时仅用I帧的数据就可重构完整图像;

3.I帧描述了图像背景和运动主体的详情;

4.I帧不需要参考其他画面而生成;

5.I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);

6.I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;

7.I帧不需要考虑运动矢量;

8.I帧所占数据的信息量比较大。


P帧:前向预测编码帧。

P帧的预测与重构:P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。

P帧特点:

1.P帧是I帧后面相隔1~2帧的编码帧;

2.P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);

3.解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;

4.P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧;

5.P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧;

6.由于P帧是参考帧,它可能造成解码错误的扩散;

7.由于是差值传送,P帧的压缩比较高。


B帧:双向预测内插编码帧。

B帧的预测与重构

B帧以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。

B帧特点

1.B帧是由前面的I或P帧和后面的P帧来进行预测的;

2.B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;

3.B帧是双向预测编码帧;

4.B帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确;

5.B帧不是参考帧,不会造成解码错误的扩散。


你,确定要这么做吗?