关于视频压缩x264参数
番茄鸡蛋炒节操27015jc
2017年10月23日 15:42

  视频做出来肯定是要压缩到网站规定标准范围内的才不会被二压。如何在现有的码率下做到比别人画面更清晰呢?(有要注意的一点就是,B站自带的up水印是默认要二压视频的。最近加了up水印的都被压成24fps了。)那么这时候就要请到视频压缩工具了。B站投稿页面下面给了压缩工具。用小丸压制工具原版即可。不推荐用定制版的,因为不能自己改参数。下载地址的话:【https://dl.hdslb.com/video-press/xiaowantoolsrev194.zip】

  工具使用应该没啥难的,挺简单容易操作的。那么废话不多说直接切如入正题。

I P B 帧以及 GOP

  为啥要放到第一个讲?因为这个概念是挺重要的。关系到后面参数设置。

I帧—关键帧。体积最大。解码时候通过单一帧就能还原这一帧的画面。 P帧—向前参考I帧,记录相对于I帧画面变化后进行解码。体积小于I帧。 B帧—参考前面的I P帧前后预测编码。解码时候根据I P帧和B帧存储的差值还原绘制帧。体积最小。注意的是有一种特殊的B帧也可以作为参考。相关参数:b-pyramid。默认是normal。因为不是为蓝光盘编码所以不建议修改此值。参数相关设置为:是否允许B帧作为参考帧。关闭的话只有I帧和P帧才能作为参考帧。可以作为参考的B帧体积介于P帧和普通的B帧之间。

GOP【图片组】用I P B 帧组合起来的一个组,也就是说会有多长时间必定有一个关键帧。一个GOP里面也会有I帧,这是因为在这一组里面有一帧画面变化巨大,无法通过参考来还原这一帧所以才会插入I帧。也就是说检测到一个场景变化会插入一个I帧。类似这样:IBPBBBBBPBBI…PI。相关参数:--scenecut。数值越小检测到的场景变化越少。不推荐进行更改,默认即可。太小的话可能会导致部分地方编码错误。改高了会更频繁插入体积最大的I帧。

x264 相关参数

  这里只是会讲到一些关键的参数和功能性参数。并不是完整的各种x264参数。

crf 默认:23.0 可以设置为任意浮点数。CRF通过降低耗费码率难以用肉眼察觉的帧的码率来给高速运动的场景或者一些更有效的帧里。因为省略了2pass的第一遍编码。所以最终出来的视频码率是不可预测的。而且不同种类的视频用到的CRF的值也会不一样。(2Pass模式下不用打此参数)

_

ref 默认:3 此值会影响编码速度。值越大速度越慢。视频压缩率越高。 可以在0-16的值选择,P帧可以选择之前的多少帧作为参照帧。最小1,只参照自己前面一帧。还有一种说法是值越大P帧越多(个人觉得第一个解释正确一些)。网上说是level4.1下1080P最大4,720P最大9。不过我实际改过16压视频。出来的也能正常观看。但是保险起见还是建议720P最大改为9。

_

bframes 默认:3 此值会影响编码速度。值越大速度越慢。视频压缩率越高。 设置可使用的B帧最大连续数。B帧体积最小所以越多B帧可以很大的提升视频压缩率。最大值16,不建议低于10。因为压缩率会下降,如果b-adapt=2时候,时间上实在接受不了再低于10。

_

b-adapt 默认:1 这个值会影响x264如何使用P帧和B帧。 0——总是使用B帧 1——快速算法bframes越大速度越快。 2——最佳算法bframes越大越慢。效果更好。 如果是在意速度的话配合--bframes 16用1,如果追求效果用2。

_

me 默认:hex 设置全局运动预测的方法 dia(四边形搜索)最简单的搜索 hex(六边形搜索)比dia更有效同时耗时增加的不多。 umh(不均匀的多六边形搜索)比hex更慢,和前面两个参数不同的是,merange参数控制搜索半径。 esa(全局搜索)比umh要好一些不过并不会带来多大提升。时间也要慢一些。 tesa(变换全局搜索)比esa效果好一点。但是耗时也会增加。 推荐设置为umh。如果说是最求极致的话tesa。不过我相信你接受不了tesa的压制时间的。

_

merange 默认:16 此值越大压缩速度越慢。 控制搜索的最大像素范围。dia和hex被控制在4-16。umh及以上可以超过16。主要还是对快速运动的视频有用。玩游戏镜头移动比较快的,类似KF2等。推荐设置为20即可。当然可以更高。追求极致可以设置为30。

_

subme 默认:7 设置设置亚像素估计的复杂度。越高效果越好,耗时越长。级别8会开启RDO显著增加耗时。 0 —— fullpel only 1 —— QPel SAD 1 iteration 2 —— QPel SATD 2 iterations 3 —— HPel on MB then QPel 4 —— Always QPel 5 —— Multi QPel + bi-directional motion estimation 6 —— RD on I/P frames 7 —— RD on all frames 8 —— RD refinement on I/P frames 9 —— RD refinement on all frames 10 —— QP-RD (需要–trellis=2, –aq-mode > 0) 设置7~10。低于默认值不推荐。速度快选择7~9配合--trellis 1(默认值)

_

trellis 默认:1 使用网格编码来增加效率 0——关闭 1——在宏块最终编码时候启用 2——所有模式下启用 同样也是值越高编码速度越慢。

_

aq-mode 默认:1 自适应量化器模式。可以使整个视频内的宏快里面更好的分配码率。 0——关闭(不推荐) 1——允许 2——自动决策 3——自动决策的升级。码率分配更好一些。 推荐设置为3。因为并不会怎么影响到编码速度。同时效果更好一些。

_

aq-strength 默认1.0 调整自适应量化的强度。削弱细节来做到宏块内的码率分配。一般来说降低到0.9就足矣了。多保留一些细节。

_

keyint 默认:250 设置视频的最大IDR帧间距。也就是说多少帧后会有一个关键帧可以作为视频的检索点。B站规定是至少10秒一个。那么30FPS的视频最大就是300。(视频帧数X10) 越大的话,视频压缩率越高。因为体积更小的P帧和B帧更多了。所以建议改为视频帧率的10倍。超过10倍的话不符合B站标准会被二压。

_

psy-rd 默认:1.0:0.0 第1个数字是psy-RDO的强度(subme大于等于6时激活)。第2个数字是Psy-Trellis的强度(subme大于等于1时激活)。这个参数咋说呢是个心里算法。前面的数字会让视频变得多出来很多毛边/噪点。后面是细节的多少。对于视频里面有文字的来说默认值总是会坏事的。因为文字外面会多许多毛边。前面这个值我个人觉得高于0.5是会坏事的。后面的值的提高会增加码率。所以个人建议设置为  0.3:0.0如果要视频更平滑一些设置为 0.0:0.0。   这个参数详细的解释为:【the human eye doesn't just want the image to look similar to the original, it wants the image to have similar complexity. Therefore, we would rather see a somewhat distorted but still detailed block than a non-distorted but completely blurred block. The result is a bias towards a detailed and/or grainy output image, a bit like xvid except that its actual detail rather than ugly blocking.】简单说就是人眼不仅希望图像看起来与原始图像相似,还希望图像具有类似的复杂性。因此,我们宁愿看到稍微扭曲但仍然详细的图像,而不是一个不失真但完全模糊的图像。   但是我压视频出来的实际效果为相反。我倒是更喜欢模糊一点而没有毛边和噪点扭曲的视频。

_

deblock 默认:0:0 调整去块滤镜。可以强制让视频的宏块感变顺畅但是会使得视频变模糊。  原文总结:【If you wan't to give your encodes a more detailed look and don't mind the occasional block try a setting of -2:-1. If you like a clean picture and don't mind a little bluriness try 1:2. A nice trick for anime is to use lower beta deblocking setting because it won't blur out lines as much that way. 】   也就是说如果不在意会变的模糊一些用 1:2 这样视频就不会出现宏块。强烈推荐使用此值。因为谁都不会愿意看到一个一块一块的宏块的视频。都希望看到更顺滑的视频。

_

nr 默认:无 快速去噪。通过在量化前丢失小细节来达到去噪。不如优秀的外部去噪但是执行速度非常快。可以配合--psy-rd 0.0:0.0 --nr 100来让视频变的更加平滑一些。其他情况下不建议开启。除非视频种类不是屏幕录制的游戏视频而是摄像头录制出来的视频或者其他种类的。

_

direct 默认:spatial 原文:为’direct’类型的运动矢量设定预测模式。有两种可选的模式:spatial(空间预测)和temporal(时间预测)。可以设置为’none’关闭预测,也可以设置为’auto’让x264去选择它认为更好的模式,x264会在编码结束时告诉你它的选择。’auto’最好在2趟编码中使用,但也可以在1趟编码时使用。如果用于2趟编码,x264会在第1趟编吗时同时尝试2种预测模式,然后在第2趟编码时使用它认为较好的那一个。注意,如果第1趟编码时选择了’auto’,那么第2趟编码时也必须设置为’auto’。不然,第2趟编码会使用’temporal’。本选项从不会浪费比特,强烈推荐使用。 个人也是推荐启用auto

简单的使用实例

  我的电脑不是怎么好。cpu是6700k未超频。只是作为一个参考。考虑到B站那可怜的码率。1080P游戏视频根本不划在考虑范围内。所以下面的都是以720P 30FPS作为参考。60FPS的话要再降低视频分辨率。CRF我就不调整了。我比较懒直接2Pass 【:D】目标码率为1750。

因为我是要走2pass。所以直接修改的内置参数。

[1]速度最快,质量最差

--direct auto --level 4.1 --ref 5 --bframes 16 --aq-mode 3 --psy-rd 0.5:0.0 --keyint 300

大致速度:50FPS.数据速率:1746kbps

——

[2]速度快。画面还算说的过去。

--direct auto --level 4.1 --ref 9 --bframes 16 --me umh --subme 9 --aq-mode 3 --psy-rd 0.3:0.0 --keyint 300

大致速度:45FPS.数据速率:1745kbps

————

[3]平衡。时间快,视频质量不错。

--direct auto --level 4.1 --ref 9 --bframes 16 --me umh --subme 10 --trellis 2 --aq-mode 3 --psy-rd 0.3:0.0 --keyint 300

大致速度:35FPS.数据速率:1744kbps

——————

[4]高压。视频模糊一些换来顺滑度。

--direct auto --level 4.1 --ref 9 --bframes 16 --b-adapt 2 --me umh --merange 30 --subme 10 --trellis 2 --aq-mode 3 --aq-strength 0.9 --psy-rd 0.0:0.0 --deblock 1:2 --nr 100 --keyint 300

大致速度:30FPS.数据速率:1744kbps

————————

[5]极致。耗时最最最最长。

--direct auto --level 4.1 --ref 9 --bframes 16 --b-adapt 2 --me tesa --merange 30 --subme 10 --trellis 2 --aq-mode 3 --psy-rd 0.2:0.0 --deblock 1:2 --keyint 300

大致速度:15FPS.数据速率:1744kbps

我都出去吃完饭了还没压完。。。。

——————————————————

对比视频  

下面是随机4款游戏对比。以及游戏内嵌移动文字,和静态图片对比。

有兴趣的还可以看一下这个450P 60FPS和720P 60FPS同参数压出来的效果。

总结和压缩视频对比不容易。有帮助的话不妨分享给他人或者给两个硬币。如果有什么不对的地方也请指出来。下个文章会讲到OBS直播用的自定义x264编码设置,让你在同码率情况下比别人的画面更好,同时不怎么吃CPU。(还在研究中。。。)