Ffmpeg hevc_nvenc的-cq和 -qmax -qmin到底什么关系?

用来存档一些课程老视频,搞不太明白怎么配合使用,尤其理论上-cq的值是不会超过-qmax的,但是实际设置上它可以超过qmax仍然正常工作并且会对视频质量产生影响。qmax理论上最大值51,但可以设更高,和51没有区别。cq 也是51最大,超了会报错

用一小段视频测了一下,命令行大概是
ffmpeg -hwaccel cuda -c:v hevc_nvenc -cq 41 -qmin 1 -qmax 33 -i in.mp4 out.mp4
以下是压缩参数,空白的就是没有设置参数:

压缩前3011KB
-cq -qmin -qmax Output File (KB)
21 1 36 10764
30 1 36 4441
38 1 36 1996
38 1993
49 1 51 522
48 1 51 597
47 1 51 677
46 1 51 762
45 1 51 855
44 1 51 978
43 1 51 1092
42 1 51 1255
41 1 51 1402
43 1092
1 41 5802
41 1 51 1402
41 1 50 1402
41 1 49 1402
41 1 48 1402
41 1 47 1402
41 1 46 1402
41 1 45 1401
41 1 42 1404
41 1 41 1406
41 1 40 1405
41 1 39 1411
41 1 38 1412
41 1 37 1419
41 1 36 1463
41 1 35 1646
41 1 34 1821
41 1 33 2042
41 1 32 2273
41 1 31 2536
41 1 30 2821
41 1 29 3046
41 1 28 3379
51 1 36 1492
44 1 36 1492
43 1 36 1492
42 1 36 1492
41 1 36 1463
40 1 36 1492
39 1 36 1773
38 1 36 1996
37 1 36 2226
36 1 36 2484
35 1 36 2766
34 1 36 3009
33 1 36 3313
32 1 36 3656
31 1 36 4020
30 1 36 4441
29 1 36 4814
28 1 36 5300
27 1 36 5838
1 36 5709
51 1 28 3379
41 1 28 3379
38 1 28 3379
35 1 28 3379
34 1 28 3379
33 1 28 3375
32 1 28 3675
31 1 28 4025
30 1 28 4444
29 1 28 4817
28 1 28 5300
27 1 28 5849
26 1 28 6394
25 1 28 6943
24 1 28 7882
23 1 28 8722
22 1 28 9458
21 1 28 10739
20 1 28 11796
1 28 5836
25 10 28 6943
25 20 28 6912
25 21 28 6402
25 22 28 5907
25 23 28 5326
25 25 28 4456
25 26 28 4026
25 28 28 3379
28 5788
28 3369
41 1 18 8713
41 1402
51 1 36 1492

cq 0是自动,在1~51之内是数字越小分配码率越多,cq是整体的cq,max和min是单个的cq
你需要的是-preset p7,其他建议不需要折腾,反正我一对比实在受不了转头去软压了

1 个赞

我理解你是要尽量的尺寸小一些.

理论上-cq的值是不会超过-qmax的,但是实际设置上它可以超过qmax仍然正常工作并且会对视频质量产生影响。

当你使用了 qmax 和 qmin 后, 那么cq就被强行指定为在此区间内动态调整.
即便你的cq设置在了前两者之外, 似乎cq的设置被强行转换为最接近max-min范围的值.

从你的数据中, max-min在1-28那档, 你cq在28以下的, 基本都是按照28处理.

可以观察出来一个现象, 当cq值在范围之外, 且接近边缘时, 可能会对范围产生明显的影响. 我猜想这三条q线并不是直线, 编码时候是一种抖动的波形曲线, 当两条波形靠近的时候, 会产生比较大的干扰. 会放大其峰值. 导致范围的大幅度偏差.

qmax理论上最大值51,但可以设更高,和51没有区别。

这个可能是考虑兼容性吧? 避免无意义的报错.

ffmpeg -hwaccel cuda -c:v hevc_nvenc -cq 41 -qmin 1 -qmax 33 -i in.mp4 out.mp4

这段质量应该是在1-33间. 而cq41距离33比较远, 不会干扰它. 所以等于cq值未设置.

另外, 由于cq,qmax, qmin都针对vbr, 为了避免错误, 最好强行定义编码模式是vbr: -rc:v vbr

1 个赞

谢谢,是一些培训视频,类似于ppt,偶尔加一些动画
p7试了一下压完了文件反而变大了。。。越压越大,p7可能还是针对电影的
现在用-cq 42-48左右比较合适,但是不确定要不要搞qmax

因为之前压过一批但参数错了现在还要重压和重新备份浪费时间,所以这次准备先研究好了再弄

网上传说软压效果好,不过我觉得还是算法的关系,而且硬压实在是太快了,10倍左右

谢谢,参数感觉曲线确实是有点复杂了。。。
因为qmin基本一直是1所以忽略,
似乎cq和qmax两者差值在6和6以上的时候总会以较小的为准
和cq,qmax两个数值的平均数也有点关系
还是找不到明显规律,猜想可能需要matlab之类分析一下,我不会用