使用 CUDA 加速 FFmpeg 编码


  CUDA 是建立在 NVIDIA 的 GPUs 上的一个通用并行计算平台和编程模型,基于 CUDA 编程可以利用 GPUs 的并行计算引擎来更加高效地解决比较复杂的问题。

  首先去 CUDA 官网下载运行环境和驱动: CUDA Tookit

2020-09-14_071444

  此时一定要选择在线安装,否则你将得到一个几乎没什么用的 2GB 的离线安装包。

  运行后选择自定义安装,我们只需要 Driver components 下的 Display Driver,以及 CUDA 下的 Runtime。如果有后续需求,可以再运行程序进行补丁式安装。

  执行 nvidia-smi 可以得到 显卡情况以及正在使用显卡的程序


Mon Sep 14 06:56:10 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 451.82       Driver Version: 451.82       CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 1660Ti WDDM  | 00000000:02:00.0 Off |                  N/A |
|  0%   51C    P0    18W /  N/A |    264MiB /  6144MiB |      9%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A     11072      C   ...am Files\Tools\ffmpeg.exe    N/A      |
+-----------------------------------------------------------------------------+

  然后去下载 FFmpeg,并添加到 PATH 环境变量。

  执行 ffmpeg -hwaccels 可以得到该版本 FFmpeg 支持的硬件加速器。


Hardware acceleration methods:
cuda
dxva2
qsv
d3d11va

  dxva 和 d3d11va 是解码器,cuda 是 NVIDIA CUDA,qsv 是 Intel Quick Sync Video。本文重点使用 CUDA。

  要想使用 CUDA,需要使用如下参数: -hwaccel cuvid -i inputfile -c:v nvenc_hevc outputfile

  由于使用了硬件编码器,所以 nvenc_hevc 的参数比 libx265 少很多,本人简单测试得到了一个可以用的完整参数:


ffmpeg -hwaccel cuvid -i inputfile -c:v hevc_nvenc -c:a:1 copy -c:a:2 copy -c:s:3 copy -c:s:4 copy -preset slow -me_method full -threads 4 -crf 20 -qcomp 0.8 -aq-mode 3 -psy-rd 3 -aq-mode 3 -bf 8 -rc vbr_hq -crf_max 10 -pix_fmt yuv420p10le outputfile

  实测开启硬件加速比使用 CPU 软件编码的 x265 快 5 倍以上(i7-1056G7 @ 3.3Ghz/GTX 1660Ti Max-Q) 2020-09-14_055250

AVC 10Bit (Source)

2020-09-14_055322

HEVC 10Bit

  可以注意到,左侧的树上少了一个亮斑,整体略微变暗。

  左下角的两块斑反映出 HEVC 对 Banding (色彩分层)处理的更好,不过略有涂抹感。 1

AVC 10Bit (Source)

2

HEVC 10Bit

  经过仔细对比发现,NVIDIA 的 HEVC 编码器在编码的过程中去除了一部分细节,尤其是雨丝的数量明显减少。

  如果有什么好参数可以避免这种情况发生,请务必推荐给我。

  不过就整体而言,图像质量并没有明显的衰减,并且使用 HEVC 后,视频减小了66%(5.2GB -> 1.7GB)。