home

Транскодирование видео FFMPEG с аппаратным ускорением NVENC в CentOS8

Если ваш сервер обеспечивает транскодирование видео с помощью FFMPEG, то его можно ускорить с помощью специализированных аппаратных кодировщиков в видеокартах.

NVIDIA, AMD, Intel имеют собственные решения по аппаратному ускорению в видеокартах: QSV у Intel, NVENC у NVIDIA, AMF у AMD.

Из производителей можно выделить Intel, аппаратно кодирующей не только H.264, HEVC, но и VP9. Все они на сегодня не могут аппаратно кодировать AV1.

В данной статье речь про ускорение на видеокартах NVIDIA в CentOS8.

Поддерживаемые видеокарты[править]

Не все видеокарты NVIDIA поддерживают NVENC, так GeForce 1030 лишена аппаратного кодировщика. Также видеокарты могут иметь ограничение на количество кодирующих сессий (например одновременно кодировать не более 2-3 потоков).

Список видеокарт с поддержкой NVENC есть здесь: https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new.

Естественно, если вы хотите засунуть видеокарту в сервер, она должна в него влезть и чтобы ей хватило питания.

В качестве дешёвой с относительно современным кодировщиком видеокарты можно рассмотреть Quadro P400.

quadro-p400.jpg

Установка[править]

Вам кроме собственно видеокарты надо:

  • установить проприетарный драйвер NVIDIA в ОС и поддержку CUDA;
  • установить сборку FFMPEG с включенным NVENC.

Подключение RPMFUSION[править]

Установить поддержку можно из RPMFUSION:

dnf install https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm
dnf install https://mirrors.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-8.noarch.rpm

Установка проприетарного драйвера[править]

Дальше установите драйвер, поддержку NVENC и CUDA:

dnf install akmod-nvidia xorg-x11-drv-nvidia xorg-x11-drv-nvidia-cuda xorg-x11-drv-nvidia-cuda-libs

Перезагрузите ПК:

init 6

После перезагрузки проверьте, что драйвера загрузились и видеокарта доступна для работы:

nvidia-smi

В вывод получите что-то похожее на:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.84       Driver Version: 460.84       CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Quadro P400         Off  | 00000000:01:00.0 Off |                  N/A |
| 42%   48C    P0    N/A /  N/A |      0MiB /  2000MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

Установка сборки FFMPEG[править]

Установите ffmpeg:

dnf install ffmpeg

Проверьте поддержку кодеков:

ffmpeg -hide_banner -codecs |grep nvenc

Проверка транскодирования[править]

Положим у вас есть файл input.mp4, проверить работу можно запустив транскодирование с использованием аппаратного кодека:

ffmpeg -y -vsync 0 -i input.mp4 -c:a copy -c:v hevc_nvenc -b:v 5M output.mp4

Аппаратное кодирование видео в PROXMOX[править]

Вам надо будет пробросить видеокарту целиком в виртуальную машину, работающую на базе KVM.

Для начала включите IOMMU в PROXMOX.

Затем найдите видеокарту, отключите её от хоста и пробросьте её в виртуальную машину.

Если проброс идёт через SeaBIOS, переключите эмуляцию чипсета в q35, добавьте PCI Device и укажите проброс видеокарты как primary GPU по PCI-Express. Дисплей тоже установите в VirtIO-GPU:

proxmox-gpu-passthrough.png