我有一张 Nvidia 显卡,并且正在使用专有驱动程序。
我查看了可用的 ffmpeg H265 编码器,发现了 hevc_nvenc。使用 hevc_nvenc 实际上确实使用 GPU 来编码视频,这大大增加了编码时间,但输出文件大小要大得多。
例如:(input.mp4为H264和aac)
ffmpeg -hwaccel cuda -i input.mp4 -c:v libx265 -c:a libopus -crf 26 libx265_output.mkv
ffmpeg -hwaccel cuda -i input.mp4 -c:v hevc_nvenc -c:a libopus -crf 26 hevc_nvenc_output.mkv
文件大小为:
input.mp4 351M
libx265_output.mkv 134M
hevc_nvenc_output.mkv 360M
ffprobe 将两个输出显示为 hevc 编码,将输入显示为 h264。
那么为什么 hevc_nvenc 看起来表现这么差呢?一定有什么东西我失踪了。
答案1
更新
硬件加速编码器不支持恒定速率因子 (CRF, -crf
) 来确定大小/质量比。您可以检查编码器支持什么,例如使用ffmpeg -h encoder=hevc_nvenc -hide_banner
.Dennis Mungai 的详细解答到 '如何在 ffmpeg 中使用带有 nvenc 的 CRF 编码?' at Superuser 建议使用-cq:v 19
和-rc:v vbr
参数来获得可变比特率的恒定质量。您可能需要考虑这对您的情况有所帮助。
值得注意的是,这仍然与 CRF 不同,因为恒定质量(由 确定)-cq
而是设置恒定量化参数(CQP)。这是来自Werner Robitza 的 CRF 指南解释为什么与设置常数 QP 相比,CRF 仍然允许节省位:
...量化参数定义从给定的像素块(宏块)中丢弃多少信息。这通常会导致整个序列的比特率发生巨大变化。
恒定速率因子比这更复杂一些。它将以不同的量压缩不同的帧,从而根据需要改变 QP,以保持一定水平的感知质量。它通过考虑运动来做到这一点。 ……
原答案
ffmpeg
维基断言这是硬件加速编码的典型情况:
硬件编码器生成的输出质量通常明显低于 x264 等良好的软件编码器,但通常速度更快,并且不占用太多 CPU 资源。 (也就是说,它们需要更高的比特率才能产生具有相同感知质量的输出,或者它们以相同的比特率产生较低感知质量的输出。)
Peter Cordes 建议以下解释作为他在 Video Production Stack Exchange 上的回答到 '为什么处理器比 GPU 更适合编码?':
我的理解视频编码的搜索空间是如此之大,以至于 CPU 上提前终止搜索路径的智能启发式方法击败了强力 GPU,至少对于高质量编码而言是如此。它只是与
-preset ultrafast
您可能合理选择 HW 编码而不是 x264 的情况进行比较,尤其是。如果您的 CPU 速度较慢(例如具有双核且无超线程的笔记本电脑)。在快速 CPU(带有超线程的 i7 四核)上,x264superfast
可能会同样快,并且看起来更好(在相同的比特率下)。如果您要进行的编码中速率失真(每个文件大小的质量)非常重要,则应使用 x264
-preset medium
或更慢的速度。如果您正在归档某些内容,那么只要您保留该文件,现在花费更多的 CPU 时间就可以节省字节。
答案2
ffmpeg -h encoder=hevc_nvenc
给出您实际的预设列表
-preset <int> E..V....... Set the encoding preset (from 0 to 18) (default p4)
default 0 E..V.......
slow 1 E..V....... hq 2 passes
medium 2 E..V....... hq 1 pass
fast 3 E..V....... hp 1 pass
hp 4 E..V.......
hq 5 E..V.......
bd 6 E..V.......
ll 7 E..V....... low latency
llhq 8 E..V....... low latency hq
llhp 9 E..V....... low latency hp
lossless 10 E..V....... lossless
losslesshp 11 E..V....... lossless hp
p1 12 E..V....... fastest (lowest quality)
p2 13 E..V....... faster (lower quality)
p3 14 E..V....... fast (low quality)
p4 15 E..V....... medium (default)
p5 16 E..V....... slow (good quality)
p6 17 E..V....... slower (better quality)
p7 18 E..V....... slowest (best quality)
-tune <int> E..V....... Set the encoding tuning info (from 1 to 4) (default hq)