x265参数解析

  • ~7.95K 字
  1. 1. 参考资料
  2. 2. 基本设置(不区分源)
    1. 2.1. etc
    2. 2.2. rect & amp
    3. 2.3. crf,qp
    4. 2.4. rd (1-6)
    5. 2.5. rdoq-level
    6. 2.6. tu-intra-depth <1..4> tu-inter-depth <1..4>
    7. 2.7. max-tu-size <32|16|8|4>
    8. 2.8. max-merge <1..5>
    9. 2.9. me ,merange
    10. 2.10. subme
    11. 2.11. keyint
    12. 2.12. min-keyint
    13. 2.13. rc-lookahead
    14. 2.14. bframes
    15. 2.15. cutree
    16. 2.16. ref
    17. 2.17. strong-intra-smoothing
    18. 2.18. lookahead-slices
    19. 2.19. deblock 去色块
    20. 2.20. frame-threads
    21. 2.21. aq-mode
  3. 3. 根据源决定
    1. 3.1. ctu <64|32|16>
    2. 3.2. qcomp
    3. 3.3. aq-strength 默认1.0
    4. 3.4. psy-rd & psy-rdoq
  4. 4. 测试过但是不使用的参数
    1. 4.1. ssim-rd
  5. 5. Pools & Numa
    1. 5.1. CPU 区别
    2. 5.2. EPYC
    3. 5.3. pools
    4. 5.4. pmode & no-pmode (4.1 deprecated)

参考资料

请注意,不能确保完全正确

基本设置(不区分源)

etc

--preset veryslow or slower

--no-open-gop

--rskip 0 rskip是放弃某些质量用来加速

--high-tier

--range limited

--aud

--repeat-headers

--hist-scenecut 判断转场,VCB建议开着,不过目前看来这个参数还处于beta阶段

--no-sao 设计目的是去振铃(光环现象),但是细节丰富地方会去掉太多细节

--no-early-skip 加速开关,影响的溯块中不同算法的先后顺序,一般不会去开。

--no-strong-intra-smoothing

rect & amp

--no-rect rect提供更好的分割能力,能找到潜在的匹配块,它很可能被证明是有用的,但它可能不值得。(画面复杂。离子特效多的情况下会考虑开 rect -VCB)

--no-amp 类似rect,即使可能稍微有点用

VCB:通常来说,<=1080p 下,rect 基本上没什么作用,amp 是几乎完全没作用,但是这俩都是速度黑洞。因此从效率角度建议关闭,或者至少关闭 amp

个人测试中,1080p开了之后,码率低了一点,画面差了一点

crf,qp

qp 电脑认为的恒定画质(但一般不进行设置)

crf 人眼认为的恒定画质,但是运动时候画质会降低来节省码率

数值越低画质越好。

一般低于等于18可以认为和原画差不多(主观观点)

rd (1-6)

分析的复杂度,数值越大画质越高,压出来体积越大,5,6非常慢, 默认3.

rdoq-level

RDOP [rate-distortion optimized quantization] (率失真优化量化)

默认0,关闭,预设slow时候默认开启。(preset placebo 似乎也还是2)

x265最重要的参数,没有之一,开了能有助于保存细节,当然会有更大文件体积。关闭可以提高压缩速度,看起来会轻度模糊。开启掉速度30%以上,推荐舍弃其他参数,也要开启这个。

设成 1 时候 看起来效果最好,但是体积会大30%以上

设成 2 时候 效果略差,体积只会小幅度增加,推荐使用2

tu-intra-depth <1..4> tu-inter-depth <1..4>

默认1,开高会小幅增加压缩率,但是特别慢 (preset placebo 似乎就是4)

max-tu-size <32|16|8|4>

默认32,开低会降低压缩率,并且不会提速,推荐默认

max-merge <1..5>

开高小幅度提高压缩率,对速度影响不明显,默认2 (preset placebo 似乎就是5)

me ,merange

me 搜索方式,默认hex ,用umh 或star 能小幅度提高压缩率,但是掉速20%

merange 搜索范围,默认57,me设成hex时候,对速度影响不大,但是使用umh或star时候,开高掉速严重

umh比star好

  1. dia
  2. hex (default)
  3. umh
  4. star
  5. sea
  6. full

如果你的视频分辨率低,merange 可以适当降低; 如果你的视频帧率高,merange 也可以适当降低,因为高帧率视频里帧与帧之间变化小。 理论上 24 和 60 你可以给砍半 merange 都没问题。
当然了,画面动态大的打斗片,多给点总是没错的。
1080p 下 32 足矣,4k 下可以考虑给到像 x265 preset 默认的 57。
同样的,开太大可能会降低压缩率,因为大的 merange 搜索范围可能会搜索到错误的参考。-VCB

merange 不建议低于32 -Advanced Encoding Guide

me 追求快就用 umh,一般只会开 star。sea,full 都是暴力穷举类型的算法,开了纯属冬天太冷想要取暖用的。-VCB

subme

开高小幅提高压缩率,开低提高压缩速度,5比3慢10%

推荐7,但是会导致锐化

VCB: 动画给4,希望好的线条给5

Advanced Encoding Guide: 推荐5

不过个人测试中,subme 7 会在细节的还原中更接近源,特别是眼睛。 https://slow.pics/c/RZOrImeg

keyint

最大IDR间隔

关键帧相关,这个将会影响到点击跳转,开高能提升压缩率(但个人不建议随便动他,720对于一般的24p意味着30秒的时间,60p你可以稍微开高点?)

默认250

min-keyint

最小分组帧数,默认23,推荐改成个位数,提高gop准确度。

小幅度提高压缩率,对压缩速度没影响

min-keyint=1 的情况对于一些高速切换的场景会因此要强制1秒内一个IDR帧,造成P或者B等参考帧使用效率降低(换场景了参考的意义已经不大了)。

还有就是这样可以避免一些老旧的设备出现硬解的bug。 - by fch1993

rc-lookahead

预览帧数,默认20

开高可以提高分组(gop)准确度,小幅度提高压缩率,同时小幅度降速,推荐40

crf模式时,rc-lookahead可以提高cutree的准确度(提高画质)

bframes

最大b帧数量,推荐16

开高小幅度提高压缩率,默认4,开到8,掉速10%

bframes 开高了会小幅降低画质

cutree

--no-cutree since this seems to be a poor implementation of mbtree.

目前测试是静态场景表现不错,具体可以看https://ted423.github.io/Document/Encode/cutree/ 不建议开,码率分配存在非常大的问题(有一处分配了31M的码率结果效果还不如一半码率的x264)

doom9 上2020年有人说"在快速移动的场景中,我一直在努力解决丑陋的扭曲(用条带涂抹看起来有点像运动模糊的东西),最后发现 x265 的 CUTree 是罪魁祸首。

关闭它可以解决它,但是当试图在其他场景中保持相同的整体质量时,比特率会爆炸。

有什么方法可以使 CUTree '不那么激进' 或将其设置为 50% 或某些阈值参数吗?"

ref

参照帧数量,默认3

开高小幅度提高压缩率,同时小幅度降速,

3和4速度差不多,推荐4

VCB:不过实测 ref 增加在 x265 中作用不明显。建议不超过 6

strong-intra-smoothing

推荐在追求还原度的压制的时候关闭,严重欠码压制时开启(部分情况下,aq2 或者降低 aqs 更为优先)

对关键帧进行平滑处理,看起来挺吓人的,实际上效果不明显,推荐用--no-strong-intra-smoothing关闭,保留细节(来源贴吧 连接1 的帖内说明)

http://forum.doom9.net/showthread.php?p=1873696

相关讨论,与贴吧给出的结论不同

个人测试是开的话画面细节丢失,影响蛮大 可能适合低码压制

目前测试是在低码压制上会降低块效应(不知道这么说对不对,aqs psy-rdoq开高会导致块变得严重。特别是4K,44Mbps仍然有些欠码,因此4K欠码压制的情况下,这种现象会非常严重,见 https://slow.pics/c/uvnpqHrU 不过这个对比图没有块现象严重的对比,只是用于说明所需码率,因为一个没注意顺手删了)

lookahead-slices

设成0有助于提高画质,开高有利于lookahead的并行度,

推荐设成0,对压缩速度无影响

deblock 去色块

要调低 默认太高, 推荐最高调到-1,-1以下,调高了会模糊

frame-threads

帧线程数量,开高提高cpu利用率,开低有利于小幅度提高压缩率

如果cpu能够满载可以考虑调到2,如果不能满载考虑使用默认值

(默认会自动调整)

aq-mode

aq 是防止平面过度量化的功能,用被量化程度去进行 qp 值的补偿 -VCB(其实我没看懂)

目前测试在不足码率压制的情况下,aq1可能会导致画面出现一些奇怪的现象,aq2相对画面更好一些,并且不会出现奇妙的画面

不同的 aq-mode 需要的 aqs 可能不一样

  1. 关闭
  2. 标准自适应量化:简单为复杂区块分配更多码率。
  3. x265默认 进行帧间 aq-variance 计算,允许跨帧进行调整,带自动方差(auto-variance)调整的自适应量化。(推荐)
  4. 带自动方差调整和暗场偏置(bias to dark scenes)的自适应量化。
  5. 带自动方差调整和更优边缘保留(edge preservation) (会摧毁平面,但会给更多码率线条和纹理和暗场。除非你追求压缩率,喂给编码器的东西也有针对性处理防止出现伪影(artifact),不然别开 -VCB 注意该意见可能比较适合动画)
  6. 带自动方差调整、更优边缘保留和暗场偏置的自适应量化。(仅aMod)

--aq-mode 2 会强调动态和高频部分,平面码率会被削(整体视频码率也就低了),开了很容易平面上出瑕疵,所以如果想开,最好喂视频之前就把平面抹抹干净,并且给 0.9 及以上的 strength。-VCB (该意见可能相对动画来说)

《Advanced Encoding Guide》的推荐是 3或4 带上--hevc-aq(原文很可能缺了个标点,有歧义,实际应该是不带--hevc-aq,这个参数会关闭其他 AQ 模式)

不过上面的意见可能比较适合足码压制,想压低码的话可能aq3不太合适,可能下面的--hevc-aq更好

--hevc-aq
根据编码单元(coding unit)的空间活动度相对于帧平均活动度,动态调整量化步长。此方法通过子单元的最小方差来表征编码单元的空间复杂度(spatial complexity)。
注意:尽管 x265 文档描述较为抽象,实际效果未必显著,且开启时需禁用其他 AQ 模式。

--aq-bias-strength(仅限 aMod 及支持暗场偏置的 AQ 模式)

范围:0.50 至 1.20(数值越低,偏置越弱)

默认值:1.00

根据源决定

--colorprim 9 for HDR, 1 for SDR.

--colormatrix 9 for HDR, 1 for SDR.

--transfer 16 for HDR, 1 for SDR.

--hdr10 for HDR.

ctu <64|32|16>

分块大小,64速度最慢,32其次

ctu 开的越大,平面的涂抹也越严重,速度也越慢,但是有损压缩效率越高, 值得一提的是, x265 的默认 preset,其实是偏向 4k 级别高分辨率视频给的
ctu 64 下,cu 的划分会耗费更多计算量,并且 cu 更倾向于变得更大。这使得给 cu 下更大 TU 的 qp 值给的不是很精确,看起来就是糊。-VCB

16适合DVD,32适合1080p,64适合4K,720p用16,x265可能就会直接退出

《Advanced Encoding Guide》中把这个归类为不调的参数,不过实际可能因为他们只用x265压4K或HDR有关。

qcomp

运动时候画质 crf开启时候有效

开高提高运动时候画质,开低减少文件体积

推荐0.6-0.7

aq-strength 默认1.0

低于1.0首先保留边缘,高于1.0优先保留纹理,这个值也要看aq-mode,噪点多的片可以调低这个值,噪点少的片调高这个值

不了解不要乱调这个

VCB:aq-strength 决定了 aq 的强度,一般来说,Anime 的 aq-strength 不用太高(太高了码率也会浪费)。通常,aq-mode=1,aq-strength 给 0.8 比较合理;aq-mode=2,aq-strength 给 0.9 左右,aq-mode=3,aq-strength 给 0.7 左右。

psy-rd & psy-rdoq

都是Psycho-visual options的参数

具体见https://x265.readthedocs.io/en/latest/cli.html#psycho-visual-options

这两者都会影响码率(经测试,开高psy-rdoq到5所增加的码率通过crf来给画面反而效果更好)

psy-rd 默认 2.0 有些高,建议开到1.5,开高反而降低画质(不过这种仅适用高还原度压制,如果希望节省码率,这个可能要再试试) 目前看来 VCB 似乎建议开高,国外是推荐真人电影(x264)开到1左右,不过4k 可能需要开到2

psy-rd: 它的核心作用是在编码器进行“模式决策”(比如决定一个编码块应该如何分割、使用何种预测方式等)时,引入一个额外的“惩罚项”。这个惩罚项的目标是:阻止编码器为了节省码率而过度简化(模糊化)人眼认为重要的细节和纹理。

高强度的 psy-rd 可能会导致伪影(artifact)

psy-rdoq 其实这玩意儿,可以理解为你想保留的细节大小,你想保留的越小,就给更高。-VCB

一些测试见Compare

测试过但是不使用的参数

ssim-rd

--ssim-rd 会让 x265 在进行“码率-失真优化”(Rate-Distortion Optimization, RDO)时,使用 SSIM (结构相似性) 作为衡量“失真”的标准,而不是默认的 PSNR (峰值信噪比)。其目标是在同等码率下,生成人眼看起来观感更好、纹理和细节保留更自然的视频,但代价是编码速度会显著变慢。

有需要可以主要了解下 PSNR 和 SSIM

实际使用后感觉同码率下没法保留细节。

Pools & Numa

CPU 区别

Intel 和 AMD 在 NUMA 的物理实现和拓扑结构上有着显著的不同,这直接影响了它们在操作系统中的表现以及像 x265 这样的软件如何最优地利用它们。

简单来说:AMD EPYC 的架构更“原生 NUMA”,其内部结构更复杂;而 Intel Xeon 的传统架构更“统一”,但通过特定技术也能模拟出更复杂的 NUMA 拓扑。
by Gemini

由于其 Chiplet 架构,AMD EPYC 天然就存在内部的 NUMA 边界。BIOS 中有一个关键设置叫 NPS (NUMA Nodes Per Socket),它决定了如何向操作系统报告 NUMA 节点。

EPYC

NPS 设置:

  • NPS1: 将整颗 CPU 报告为 1 个 NUMA 节点。这简化了拓扑,但隐藏了内部延迟差异,性能可能不是最优。
  • NPS2: 将 CPU 沿内存控制器通道对半分,报告为 2 个 NUMA 节点。
  • NPS4: 将 CPU 沿内存控制器通道四等分,报告为 4 个 NUMA 节点。这是最能反映其物理架构的模式,能提供最低的本地延迟。

官方文档: https://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/tuning-guides/amd-epyc-7002-tg-hpc-56827.pdf

好像也不用设太多,因为 太多了之后一个 Numa x265 会自动设少线程数,一个线程池最多是64个线程

查到的一些讨论 http://wp.xin.at/archives/5478

L3 cache as NUMA Domain

当你启用 “L3 cache as NUMA Domain”(或 BIOS 中的 “ACPI SRAT L3 Cache as NUMA Domain”)时,系统确实会将每个 L3 缓存 (通常与各 CCD 或 CCX 关联) 视为独立的 NUMA 节点。这意味着操作系统会识别更多 NUMA 域,而不是简单按照 CPU 插槽来划分。

如果启用该设置,每个 L3 缓存会被报告为一个独立的 NUMA 节点。例如,每个 CCD(独立的核心/cache 单元)有一个 L3 缓存,那么每个 CCD 就成为一个 NUMA 节点。举例来说,如果一个处理器有 8 个 CCD,会报告 8 个 NUMA 节点;双路系统则会有 16 个 NUMA 域。

当 未启用 L3 作为 NUMA 域 时,NPS 参数定义系统如何划分 NUMA 域,以及内存交错(interleaving)方式。例如,NPS=2 表示每个插槽按左右半边划分为两个 NUMA 域;NPS=4 则划分为四个,分别对应每个 Quadrant(象限) 。

当 启用 L3 作为 NUMA 域 时,NPS 不再决定 NUMA 域的数量(由 L3 缓存数决定),而仅控制内存通道的交错方式。例如,一个处理器有 8 条内存通道,如果 NPS=1,则所有通道交错;NPS=2 或 NPS=4 则按照半边或象限分组交错访问

pools

注意,这个参数在 GUI 下传递可能出问题,使用的话可能需要纯命令行,见issue,一般 wpp 默认开启

x265 会根据 CPU 自动配置线程数量,目前测试是两个 Numa 线程数翻倍的情况下,压制速度没有区别。

x265 有两种主要的并行方式:

帧级并行(Frame-level Parallelism):最高效的方式。多个线程同时处理不同的帧。

帧内并行(Intra-frame Parallelism):如 WPP,多个线程协同处理同一帧的不同部分。

核心逻辑在于:当 x265 检测到只有一个线程池时,它会优先最大化效率更高的帧级并行。

在一个大的、统一的线程池里(比如你的例子,一个 NUMA 节点上有 24 或 32 个核心),调度器可以非常灵活地将不同的帧分配给任意空闲的线程。这种情况下,帧级并行的效率非常高。

而 WPP 本身是有一些同步开销的。为了处理一行 CTU,需要等待上一行处理完某些初始信息。

因此,x265 的开发者做出了一个明智的决定:如果只有一个线程池,就认为帧级并行已经足够,此时禁用 WPP 可以减少不必要的同步开销,从而可能获得微小的性能提升或简化调度逻辑。

pmode & no-pmode (4.1 deprecated)

并行决策模式

官方推荐是CPU不饱和才开,编码器将跨多个工作线程分配每个 CU 的分析工作。

--追加说明,--pme--lookahead-slices 也在4.1中禁用了。

pmode 和 wpp 是设计理念和实际效果上是冲突的,ps,我以前犯蠢不知道

打赏
打赏提示信息
分享
分享提示信息