2011年9月10日星期六

mencoder的x264encopts选项参数略解

blog.yikuyiku.com

概要


这份指南主要介绍两类编码选项:

第一类,主要对速度质量平衡造成影响的选项;

第二类,可以满足个性化需求的选项。

要注意的是,虽然不是主要目的,第二类选项同样会对速度和质量造成很大的影响。这类选项可能导致有人觉得视频质量提升了,有人觉得视频质量下降了。


继续之前还有两点要说明:

1、这份指南只以一个指标作为视频质量的标准:全局PSNR(峰值信噪比),也就是在x264encopts选项中带上PSNR参数后输出的数值。所有的PSNR都是以相同码率为前提假定条件的。

2、所有的选项介绍以使用2次编码为条件。使用2次编码有两个原因:第一,2次编码能提高1db的PSNR(很大的提升);第二,2次编码能避免1次编码一个很大的缺点:相当大的随机性的存在导致难以分辨质量变化是随机性造成的还是改变参数造成的。



主要影响编码速度和质量的参数


1、subq。它和下面的frameref是目前对编码速度和质量造成最大影响的两个参数。


如果是要在速度和质量牺牲一者换取另一者,它们是首先要被考虑到的选项。在速度方面,这两个选项间的相互影响也很大。经验指出,当frameref=1时,subq=5(默认值)要比subq=1多花出35%的时间。在frameref=6时,这个数值则超过60%。


不管frameref怎样设置,subq对PSNR的影响是恒定的。通常subq=5会比subq=1带来0.2-0.5db的PSNR提高,这是相当可观的提高。


subq=6更慢一些,但会换来值得的质量提升。通常它比subq=5多耗时25%-100%,同时带来0.1-0.4db的PSNR提高。subq=6和其它选择有个不同的地方,它不依赖frameref和me参数的设置,它主要依赖B帧的数量。这意味着它在激烈运动和碰撞的场景中会很有效,而对缓和的场景则起不到太大作用。不管怎样,建议不要把bframes设置为0(禁用B帧)。


subq=7是最慢质量最好的选择。它用比subq=6多出15%-33%的耗时换回0.01-0.05db的质量提升。若你非常不介意时间开销而且想充分利用每个比特时,选择它。


2、frameref。它的默认值是1,但不意味着1是最合理的值。


把frameref调整到2就可以马上获得0.15db的提升而仅仅只需要多付出5%-10%的时间开销,这是个不错的交易。frameref=3能比frameref=1多耗时15%,PSNR提高0.25db。


不幸的是,从3开始,收益开始迅速递减。frameref=6比frameref=3多耗时15%而只能带来0.05-0.1db的质量提升。比6更大的值只能带来非常少的质量提升(当然,和视频源有关系)。一般情况下,frameref=12比frameref=6多耗时15%-20%,而全局PSNR仅提高0.02db。


但无论frameref调得再高,它不会损伤PSNR,只是带来的提升很微小罢了。


目前,如果把frameref调高到不必要的非常高的值,那它只在关闭CABAC时才会影响编码速度,当打开CABAC时则不用担心。将来,关闭CABAC选项时的编码速度可能也会被优化,


如果十分在意编码速度,可以在第一次编码中调低subq和frameref的值,在第二次编码中调高它们(可以用方便的turbo参数),这样做会带来0.1db的PSNR损失,基本看不出来对画质的损伤。


frameref可能偶尔会影响到帧类型的决策,虽然非常少见,但如果要完全避免,那就去看看视频中是否有全白或者全黑的场景导致强制输出了I帧,调整第一次编码的frameref值,使它的值要大于连续全屏闪烁或全黑的帧数。比如,如果视频的5帧是在2个画面之间来回闪烁,那就应当把frameref设置为5或更大。这种情况在真实视频中很少发生,大多是游戏截出来的视频。


3、me。这个选项用于选择运动估计搜索算法。它直接影响编码速度和编码质量的平衡。


me=dia比默认选项(me=hex)只快一点点,带来0.1db的全局PSNR损失。默认选项me=hex在速度和质量间获得了不错的平衡。me=umh可以提高全局PSNR0.1db,它的速度损失取决于frameref的值。frameref=12时,me=umh比me=hex慢40%,frameref=3时,me=umh比me=hex慢25%-30%。me=esa使用穷举算法,对实际应用来说,它太慢了。


4、partition=all。这个选项会在默认值的基础上多开启8×4、4×8、4×4这3种预测宏块类型,它会带来10%-15%的速度损失。当视频源中的运动缓慢时,它几乎没用。但在饱含很多小物体的高速运动场景的视频源中,我们可以期望它带来0.1db的提升。


5、bframes。如果用其它编码器编码,会发现B帧不是很有用。这个状况在H.264中得到了改善,它为B帧引入了很多新技术和块类型。


B帧对提高PSNR有重大作用,而且有趣的是,使用B帧会稍稍加速第2次编码,而在1次编码中,开启自适应B帧决策则会减速。如果关闭自适应B帧检测(nob_adapt),则bframe最好设为1,不然高速场景将会很惨。自适应B帧检测默认是开启的,此时把bframes设为较高的值是安全的,在会损伤压缩效果时,编码器会自动减少B帧的使用。编码器一般不会选择大于4的B帧,把这个值稍微设高点能得到一些效能提升。


6、b_adapt。默认开启,此时编码器将用一个较快的判定过程来排除那些不能带来足够质量提升的B帧生成。


可以使用b_bias选项调节排除的阈值。此选项牺牲的速度还算合理,而且它只会提升而不会损伤视频质量。要注意的是,b_adapt和b_bias只在第一次编码时影响速度和帧类型,对后续的编码不产生影响。


7、b_pyramid。如果bframes选项大于等于2的话,最好也开启此选项,它能在不增加时间开销的同时提升一些质量。要注意的是,开启此选项编码的视频不能被基于2005年3月5日之前的libavcodec核心的解码器解码。


8、weight_b。这个选项通常不会带来什么好处,但在渐变和淡入淡出的场景中,基于权重的预测可以很大地增加压缩比。


在MPEG-4 ASP中,类似的场景会用一连串昂贵的I帧来编码,开启本选项的话,就可能把其中很大一部分用小很多的B帧代替。因为决策过程并不复杂,所以时间开销也很小。而且和很多人幻想地不同的是,解码时也不怎么影响CPU开销。不幸的是,目前的自适应B帧决策算法恰恰强烈倾向于在淡入淡出时避免使用B帧,这样这个选项也就失效了。因此,在当前版本,如果想要把淡入淡出压缩好,需要设置nob_adapt。


9、threads。此选项可以在多核CPU的机器上开启多线程以加快编码速度。可以手动指定线程数,更好是设置threads=auto让x264自己侦测并决定使用多少个线程。如果使用多核机器,此选项可以依据CPU核心个数线性地加速编码时间(每个CPU核心约94% )。使用多核特性会稍微降低视频质量(双核约降低0.005db,4核约降低0.01db)。



个性化选择的参数


1、2次编码


本文一开始建议始终开启2次编码,但是也还是有一些不能使用它的时候。比如说实时编码电视信号时,就只能使用1次编码了。而且1次编码也明显比2次编码快,几乎只花费2次编码的一半时间。


再反过来继续说说2次编码的好处。因为1次编码无法对视频有整体把握,所以它的码率控制只能十分保守。比方说编码一个2分钟的视频,这个视频的前1分钟充满了激烈的运动,需要2500kbps的码率才能得到良好的观看效果,而随后的1分钟视频只需要300kbps的码率就能得到很好的观看效果了。其实此时平均1400kbps的码率就足以让整个视频看起来很好了。但由于缺乏对视频的整体把握,1次编码会在视频的前1分钟和后1分钟同样使用1400kbs的码率,这样就导致前1分钟的视频观看质量不可接受而后一分钟又产生严重的码率浪费。怎么适当地使用码率对1次编码是个难题。也有一些解决这个难题的办法,但他们都会导致另一个难题:码率有可能会不可控制地增大。


多次编码能对码率分配产生非常大的好处。由于有了从第一次编码中得到的对视频的整体把握,编码器就有了控制帧的使用和量化精度调整的依据,进而就可以更合理地在更需要码率和更不需要码率的视频片段间分配码率的利用。下面将要介绍的qcomp就是用于按照我们的喜好调节这个分配的力度的。


另外,2次编码并不真的要花费2倍于1次编码那么就的时间。第一次编码并不需要太高的质量,如果配置合适,第1次编码可以很快。当然更快的第1次编码会稍稍降低预测的精度从而稍稍影响最终的编码质量,但这个影响通常小到难以察觉。可以试试这个例子:使用参数subq=1:frameref=1进行快速第1次编码,然后使用subq=6:frameref=15:partitions=all:me=umh进行很慢的但高质量的第2次编码。


2、3次编码


x264可以进行任意次数的连续编码。如果第一次编码时设置pass=1而在随后的编码中设置pass=3,则随后的编码会读取前一次编码的统计信息并记录下新的统计信息,然后再随后的编码会得到更加精确的信息用于决策帧使用和量化精度。


但在实际应用中,这样做所带来的提升几近于0,还很有可能第3次编码的全局PSNR还稍低于第2次编码的全局PSNR。推荐只在2次编码确实没有控制好码流率或者视频质量不合理的低下时才使用3次以上的编码,这种情况通常只在编码非常非常短的视频时发生。


对于高级用户而言,3次以上的编码还有另外一些特殊用途,但这已超出这份指南的范围。


3、qcomp。用于调节在视频片段间转移码率的力度。


一个极端就是设置qcomp=0,这样就完全关闭了在视频片断间转移码率,会导致快速运动的视频片断看起来很糟,而缓慢的视频片断浪费码率的问题。另一个极端是设置qcomp=1,这样会产生恒定的QP(量化参数)。这没太大坏处,但很多人认为还是稍稍限制一下那些极度需要使用码率的视频片断对码率的获取,这样对整体视频的质量提升比较好。


qcomp=0.6是默认值,大部分人都会觉得这个值有点偏低(常用0.7-0.8)。


4、keyint。这是唯一平衡编码效率和视频可拖动程度的选项。


默认值是250,这意味着在1个25fps的视频中,至少可以以10秒为单位拖动。如果想要以5秒为单位拖动,那就把这个值设置为125,这样会稍稍损伤视频质量。如果完全不关心视频的可拖动性,把这个值设超大也没有关系(注意收益是会递减的,直至0)。即使这样,视频也会在场景转换的地方留下可拖动的点。


5、deblock。该参数调整的是H.264内循环反块效应滤镜所用的阈值。


这是这篇指南中唯一一个稍微有些争议的参数。H.264标准中定义了一个简单的反块效应的滤镜,并且有预制好的阈值和过滤强度,这个阈值是以块的QP(量化参数)为标准的。


此滤镜默认的行为是大力过滤QP高的块而完全放过QP低的块。预制的强度是H.264标准定义的,这个强度是仔细选择的结果,通常它对所有视频都可以起到很好的效果。可以通过deblocl参数重设此阈值。


一些人认为应该大幅度调低过滤强度(比如把deblock设置为-3)。这绝不是一个好主意,大多数这么干的人并没有完全理解反块效应滤镜在默认状态下是怎么工作的。


首先且必须知道的是,这个内循环反块效应滤镜在默认状态下是以PSNR为优化目标的,而且优化地非常好。即使它没做好,使用deblock=1或者deblock=-1微调它就足够了。更大幅度的调整是绝对会损伤PSNR的。


正值会导致滤镜干掉更多视频细节,而负值会导致更多可见的块效应。


如果视频源不是空间复杂度很高(充满了细节)的话,调低deblock的值会是个坏主意。内循环反块效应滤镜把人工处理的痕迹处理得非常好。如果视频源在空间上十分复杂,块效应就会相对弱很多。这是因为人总是更容易把注意力放在细节或者噪音上。人类视觉体系很容易发现移动的细节,而不容易发现静止的噪音。当然主观判断时,细节和噪音也许是一回事。所以,如果降低反块效应的强度,虽然同时增加了噪音和细节,但人眼却难以发觉那些参杂在细节中的噪音。


以上并非说明调低反块效应滤镜的强度就是绝对正确的了。


我们还能在后续处理中进一步处理噪音。如果H.264编码器出来的结果看上去模糊而且有点脏脏的,可以试试在播放视频时加上-vf noise滤镜。-vf noise=8a:4a几乎可以隐藏所有噪音,这个设置几乎总是能得到比只是来回调校deblock更好的观看效果。




几个例子


以下参数演示了在目标码率相同时几个在编码速度和质量间取得的不同平衡。


测试环境:

视频源:720×[email protected],目标码率900kbps,AMD64 3400+ 2.4Ghz 64位模式。


注意1:表格第三列的PSNR数值是以[超高质量]为基准比较的(这也是它的此项为0的原因)。

注意2:不同视频源、转码机器和软件版本都可能造成很不同结果。































类型参数选择每秒编码帧数相对 PSNR 损失
超高质量subq=6:partitions=all:8x8dct

:me=umh:frameref=5:bframes=3:

b_pyramid:weight_b
6fps0dB
高质量subq=5:8x8dct:frameref=2:

bframes=3:b_pyramid:weight_b
13fps-0.89dB
快速subq=4:bframes=2:b_pyramid:weight_b17fps-1.48dB

本文翻译自:http://www.mplayerhq.hu/DOCS/HTML/zh_CN/menc-feat-x264.html?

没有评论:

发表评论