以本文完成的这个时间节点来看,x264依然可以说是最流行的视频编码。至少在大部分web stream,非编软件上用的还是很多的,兼容性以及配置上也有较大优势。因此,我至今所有的视频相关流程最后都还是在使用AVC进行编码的。
今天有机会,重新研读一下x264的文档和相关文章,并且分析一下常用的一些编码参数,以便后续压制调整和参考。
talk is cheap, 我觉得与其事无巨细一个个讲,不如直接分析几个现成的参数。
首先是我常用的一份参数
—level 5.1 —preset veryslow —ref 8 —bframes 12 —vbv-bufsize 14000 —vbv-maxrate 14000 —merange 32 —colormatrix bt709 —qpmax 59 —qcomp 0.7 —aq-strength 0.85 —no-dct-decimate
这是很久之前问某大佬要的代码,最早是用于在B站传K-ON正片时不被2压(当然后面某站买了正版之后就全下架了)。后来发现这套参数压其他影片包括真人影像也没有什么太大瑕疵,就一直沿用下来了。
首先是level和preset。两者都是编码预设。
level建议是留空默认的,这样x264可以自动根据使用特性和片源来确定适合的level。
当然,像屑站二压后30fps以内的profile都是High@L4。虽然屑站现在对非1080+画质或者1080p60 720p60视频一律二压,但如果是传屑站还是建议手动指定一下level 4(4.1)
(按照规范,1080p60理论上是level4.2)
preset不多做解释。一般就是slow/slower/veryslow 想选其他选项建议出门左转消极压制无脑gpu压。

那么接下来和帧编码有关
ref, number of reference frame 参考帧数量,一帧最多可以参考多少帧。因此越大,相对能节约体积,但是增加编解码负担,降低效率
正常来说日常编码6或8就可以满足要求。追求极致压缩比ref可以选择13.追求极致编码速度ref可以选4 ref13比ref4节省6%~15%体积。
bframes最大允许连续的B帧数量,B帧是Bi-directional Frame,双向预测帧的意思,属于关键帧,和P帧(Predictive Frame)相似。区别在于B帧参考后帧而P帧是参考前帧。
值大,压缩比高,编码时间增加。
真人电影3~8,动漫6~12
当然,由于B帧体积比较小,所以保证体积角度应该在10以上。
所以其实这个也是参数需要调整的
merange是控制运动预测的搜索半径。值越大压制越慢。
正常来说只有追求极致才用到30。游戏等20就行。否则默认的16也管够了。
大概我去问的那个大佬有强迫症吧

前者是缓冲区大小,后者是最高码率。两者配合使用,保证buf>maxrate
一般buf扔在上限上,maxrate比buf相同或者再小一点
当然很玄学的是 之前压kon一直压到14000才控制在峰值码率24M以下。传屑站供参考
colormatrix 匹配蓝光原盘的709即可

然后就是涉及码率控制的qp值的问题。
qp值就是质量量化值,类似CRF的那个数。
qpmax 为了防止某一帧被压得烂,可以设置qpmax为36。一般默认就行
qcomp 决定了qp时域变化灵活度,人话就是数值越低qp变动就越大,不让高动态的场景拿到高码率,就会糊。高画质编码,qcomp要给高,反之亦然。
默认0.6 如果开了mbtree就要高 但不要超过0.8
aq-strength 先讲一下aq,Adaptive Quantizers即适应性量化数。主要作用是防止码率在纹理和平面处被过分降低
这里的strength同样也是越高质量编码数值越高
动漫选0.6~1.0左右,真人选0.8~1.2左右。
no-dct-decimate 不糊掉可忽略细节。显然要开,不差那2%体积。
当然这个也属于强迫症参数

ok,我的这个参数分析完了,接下来再找几个来分析一下。
—preset veryslow —crf 16.5 —threads 16 —deblock -1:-1 —keyint 600 —min-keyint 1 —bframes 8 —ref 13 —qcomp 0.75 —rc-lookahead 70 —aq-strength 0.8 —me tesa —psy-rd 0.6:0.15 —no-fast-pskip —colormatrix bt709 —aq-mode 3 —input-depth 16
这里是vcb教程提供的vcb开mbtree的参数。mbtree后面再谈 还是按顺序来说
threads线程数 这个也不多解释

deblock x264的去色块功能,默认0:0就可以,调高了会糊。或者-1:-1如果已经过好去块滤镜的话
keyint 关键帧(I帧或者IDR帧)最大允许间隔,默认是250.越大视频压缩率越高。但是注意!特别是传屑站,由于有keyframe至少10秒一个的限制,按24帧来算,就要改为240;30帧就是300.
min-keyint 最低关键帧间隔 由于兼容问题(如BD)强制指定1即可。默认为fps和keyint/10取小的
bframe和ref分别是b帧最大连续数量和参考帧数量都与体积成正比;而qcomp之前也都说过,略过。
rc-lookahead是mbtree帧控制应用的数量 默认40 也是越高质量越好速度越慢

me 帧分析模型,veryslow默认是umh(多重六边形),tesa为“经过转换的全面搜索”会更慢更好一些
psy-rd “心理学优化强度” 前面的数字代表毛边噪点强度,后面的数字代表保留细节。为基于欠码率宁可看失真也不想看模糊的原则设置,有利于保留纹理和细节。前者压制动漫选择0.4~1.0,压制真人选择0.7~1.3 考虑到文字有毛边 有说不超过0.5的。越是高质量的编码,可以开的越高。
后者看开不开mbtree,开给0.1。不开直接0。这个高了加码率。
aq-mode
选择AQ的算法。
Disable(aq-mode=0,不用aq)
Variance AQ(aq-mode=1)
Auto-Variance AQ(aq-mode=2)。
tMod版x264还加了mode=3/4/5,只不过在megui中需要用自定义命令行来启用。
一般来说,mode=3最好,最适合动漫,但是码率稍高;mode=1效果中等,比较安全,不容易出现教烂的帧。mode=2比较省码率,但是偶尔容易出现烂帧。mode=4是由2优化而来,更保险一点。
一般来说,日常压动漫就选3,压真人特典选1或者4
默认是1
no-fast-pskip 关闭快速模式 这个关不关都行 差不了多少默认就行或者干脆就留着
input-depth 输入色深 这个跟帧服务器比如vapoursynth配合用的

—preset veryslow —crf 24 —pass 1 —slow-firstpass —stats “E:\disc_1_1.stats” —tune film —deblock -1:-1 —keyint 180 —min-keyint 1 —weightb —ref 13 —vbv-bufsize 24000 —vbv-maxrate 23000 —aq-mode 1 —mbtree —me umh —subme 7 —merange 16 —psy-rd 0.7:0.1 —no-fast-pskip —colormatrix bt709
下面借这个手动1pass 2pass的例子介绍一下人工2pass的方法。
常见策略:1pass 用crf跑 能成品就直接成品;差不多再2pass;差得多换方法。
1pass所需的具体参数:
pass 1 这个是废话
slow-firstpass 这个是保证虽然开的是1pass但是出来也没缩水
stats 保存1pass的分析结果 不然就白pass了
然后deblock,keyint,ref,bufsize,bufsize,aq,mbtree都说过了

subme和merange是me的具体参数;其实是和前面ref/bframes对应的。动态不高ref这一组拉高;动态高这组拉高。
但是!!!因为预设veryslow都设好了,其实不动就行。
或者
一般来说,下面三个组合是很好的快中慢三种选择
—me umh —subme 7 —me_range 16
—me umh —subme 10 —me_range 24
—me tesa —sumbe 10 —me_range 24
好了接着看2pass的
—preset veryslow —bitrate 5800 —pass 2 —stats “E:\disc_1_1.stats” —tune film —deblock -1:-1 —keyint 180 —min-keyint 1 —weightb —ref 13 —vbv-bufsize 24000 —vbv-maxrate 23000 —aq-mode 1 —mbtree —me umh —subme 7 —merange 16 —psy-rd 0.7:0.1 —no-fast-pskip —colormatrix bt709
—bitrate 5800 —pass 2 —stats “E:\disc_1_1.stats”
设好了码率,pass数,上次pass的stat就可以了 剩下的完全一致就行
最后看一个,vcb的不开麻痹树mbtree的
—preset veryslow —crf 17.5 —threads 16 —deblock -1:-1 —keyint 600 —min-keyint 1 —bframes 8 —ref 13 —qcomp 0.6 —no-mbtree —rc-lookahead 70 —aq-strength 0.8 —me tesa —psy-rd 0.6:0.0 —chroma-qp-offset -1 —no-fast-pskip —colormatrix bt709 —aq-mode 3 —input-depth 16
解析(与开mbtree不同的):
—crf 17.5 关mbtree下,crf应该适度增加
—qcomp 0.6 关mbtee下,一般不需要调节qcomp,或者仅仅提高一点点,不要超过0.7
—psy-rd 0.6:0.0 关mbtree下,编码器本身会倾向于保留更多噪点级别的细节。psy-trellis保持0就好了(开mbtree下是0.15)
—no-mbtree 不开启mbtree
—chroma-qp-offset -1 在psy-trellis=0的时候,手动调低这个以保证chroma平面画质更好点。
OK,基本上x264到这个份上编码器层面也就差不多到头了。x265的参数虽然很多关键词一致但是调起来区别还是挺大的。等我们改日再研究。
怎么说呢,到3月份了,要搞些专业相关的东西了(要编论文毕业啊)。大概这段时间更几个视频处理类的笔记在专栏里,就当是对自己的一个督促吧。…… 那么今天的主要研究成果和笔记就是这些。以上。
参考资料
[1]VCB-S.x264参数设置[EB/OL].https://vcb-s.nmm-hd.org,2016-02-19.
[2]27015jc.关于视频压缩x264参数[EB/OL].https://www.bilibili.com/read/cv44064/,2017-10-23.
[3]XSky123.整理下使用VapourSynth进行压制的相关流程[EB/OL].https://xsky123.com/archives/37/,2019-11-07.
[4]Chaneru.com.X264 Settings[EB/OL].http://www.chaneru.com/Roku/HLS/X264_Settings.htm.2011-02-07
[5]chenchong_219.x264码率控制总结3——码率控制参数详解[EB/OL].https://blog.csdn.net/chenchong_219/article/details/43941655.2015-02-25
[6]神代綺凜.[bilibili] 教你如何压制B站1080P60帧不二压视频[EB/OL].https://moe.best/tutorial/bilibili-1080p60fps.html.2018-04-19