简单整理一下x264参数 时间: 2020-03-01 17:41 分类: 技术笔记 以本文完成的这个时间节点来看,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也管够了。 *大概我去问的那个大佬有强迫症吧* ------ **vbv-bufsize和vbv-maxrate** 前者是缓冲区大小,后者是最高码率。两者配合使用,保证buf>maxrate 一般buf扔在上限上,maxrate比buf相同或者再小一点 当然很玄学的是 之前压kon一直压到14000才控制在峰值码率24M以下。传屑站供参考 **colormatrix** 匹配蓝光原盘 ------ 然后就是涉及码率控制的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的不开~~麻痹~~树 > --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的参数虽然很多关键词一致但是调起来区别还是挺大的。等我们改日再研究。 **参考资料** [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 标签: 无