Compilation party 😎
Mise en place de Nvenc pour OBS
Si vous avez encore une Ubuntu 20.04 ou inférieur qui traîne, sachez que ce n’est pas bien car la 22.04 LTS existe. Toutefois, cette version de la distribution ne prend pas en charge Nvenc pour OBS. C’est frustrant de faire fonctionner le CPU plein pot alors qu’on a une carte graphique Nvidia qui peut le faire.
Comment faire en sorte que FFmpeg exporte les symboles nécessaires sur (K)ubuntu cosmic/disco (et distributions similaires) afin qu’OBS et MPV puissent utiliser NVENC et NVDEC (anciennement appelé CUVID) sur les architectures Fermi, Maxwell, Kepler, Pascal, Volta et Turing et comment utiliser l’accélération matérielle dans Chromium.
Ce guide vise les cartes les plus modernes compatibles avec NVENC et NVDEC, mais il contient également des instructions pour les cartes utilisant des pilotes hérités. (378, 390 et 396)
Cartes Nvidia supportées : https://developer.nvidia.com/video-encode-decode-gpu-support-matrix

Installation des pilotes Nvidia
Pour commencer nous allons mettre en place les pilotes Nvidia propriétaire.
sudo apt install ppa-purge # Par sécurité
sudo add-apt-repository ppa:graphics-drivers/ppa
# veuillez vérifier le support pour votre GPU - nvidia-driver-{390,396,410,415,418,430,435,440} disponible afin que votre serveur d'affichage n'échoue pas !
# Nous utiliserons 495.44
# Peut-être avez-vous besoin des versions 32 bits de certaines bibliothèques, ajoutez ":i386" au nom du package (par exemple : libnvidia-gl-430:i386)
sudo apt install nvidia-driver-510 xserver-xorg-video-nvidia-510 nvidia-utils-510 nvidia-kernel-source-510 nvidia-kernel-common-510 nvidia-dkms-510 nvidia-compute-utils-510 libnvidia-gl-510 libnvidia-fbc1-510 libnvidia-encode-510 libnvidia-decode-510 libnvidia-cfg1-510 libnvidia-compute-510

Installation des paquets nv-codec-headers
On prépare les codecs d’entête venant de chez VLC !
sudo apt install make git
mkdir ~/devel/ && cd ~/devel/
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers
#change to older SDK branch here if you use a legacy driver — one of: git checkout sdk/8.{0,1,2}
make && sudo make install
La version la plus récente du SDK Video Codec est 9.0.x. mais ci-dessous se trouve une liste des anciennes branches SDK pour les pilotes hérités.
FFmpeg version of headers required to interface with Nvidias codec APIs.
Corresponds to Video Codec SDK version 9.1.23.
Minimum required driver versions:
Linux: 435.21 or newer
Windows: 436.15 or newer
Liste des branches git pour les anciens pilotes
Si vous utilisez des pilotes hérités, voici les branches pour eux – après avoir cloné le cd du référentiel git et entré l’une des trois lignes suivantes avant l’installation (en entrant make && sudo make install). Vous êtes curieux de savoir ce qui se passera si vous utilisez les derniers en-têtes SDK avec un pilote hérité ? L’éditeur de liens/chargeur ne trouvera pas le point d’entrée ou la fonction (pointeur) ou l’en-tête et votre application échouera.
Toutes ces trois branches prennent en charge les fonctionnalités facultatives de CUDA 10 à partir du pilote 410.48 sous Linux et 411.31 sous Windows.
git checkout sdk/8.2 # for Linux 396.24 or newer | for Windows 397.93 or newer
git checkout sdk/8.1 # for Linux 390.25 or newer | for Windows 390.77 or newer
git checkout sdk/8.0 # for Linux 378.13 or newer | for Windows 378.66 or newer
Compilation de FFmpeg
FFmpeg détectera automatiquement les en-têtes ffnvcodec – extrait de ./configure –help :
The following libraries provide various hardware acceleration features:
--disable-amf disable AMF video encoding code [autodetect]
--disable-audiotoolbox disable Apple AudioToolbox code [autodetect]
--enable-cuda-sdk enable CUDA features that require the CUDA SDK [no]
--disable-cuvid disable Nvidia CUVID support [autodetect]
--disable-d3d11va disable Microsoft Direct3D 11 video acceleration code [autodetect]
--disable-dxva2 disable Microsoft DirectX 9 video acceleration code [autodetect]
--disable-ffnvcodec disable dynamically linked Nvidia code [autodetect]
--enable-libdrm enable DRM code (Linux) [no]
--enable-libmfx enable Intel MediaSDK (AKA Quick Sync Video) code via libmfx [no]
--enable-libnpp enable Nvidia Performance Primitives-based code [no]
--enable-mmal enable Broadcom Multi-Media Abstraction Layer (Raspberry Pi) via MMAL [no]
--disable-nvdec disable Nvidia video decoding acceleration (via hwaccel) [autodetect]
--disable-nvenc disable Nvidia video encoding code [autodetect]
--enable-omx enable OpenMAX IL code [no]
--enable-omx-rpi enable OpenMAX IL code for Raspberry Pi [no]
--enable-rkmpp enable Rockchip Media Process Platform code [no]
--disable-v4l2-m2m disable V4L2 mem2mem code [autodetect]
--disable-vaapi disable Video Acceleration API (mainly Unix/Intel) code [autodetect]
--disable-vdpau disable Nvidia Video Decode and Presentation API for Unix code [autodetect]
--disable-videotoolbox disable VideoToolbox code [autodetect]
Si la compilation standard ne correspond pas à vos besoins (vous avez besoin de lier des bibliothèques spécifiques/vous n’avez pas besoin de certaines bibliothèques ou vous souhaitez activer/désactiver des fonctionnalités spécifiques), vous pouvez modifier les règles de construction dans ~/devel/ffmpeg/ ffmpeg-4.1.3/debian/rules. Installez le paquet nv-codec-headers activera ffnvcodec vdpau nvenc nvdec cuda cuvid (NVDEC est juste un changement de marque de CUVID). CUDA ne signifie pas le code CUDA-SDK – juste une accélération matérielle via CUDA.
Passons à la compilation et à l’installation de ffmpeg
sudo apt build-dep ffmpeg
mkdir -p ~/devel/ffmpeg
cd ~/devel/ffmpeg
sudo apt source ffmpeg
sudo chown -hR $USER: * # atleast my distro has problems when unpacking source – so we change ownership
cd ffmpeg-4.2.6 # cd ffmpeg-x.x.x [x.x.x represents the version number]
debuild -b --no-sign --jobs-try=$((`nproc`/2))
cd ..
rm -f libavcodec-extra* libavfilter-extra*
sudo dpkg -i *.deb
sudo apt-mark hold ffmpeg ffmpeg-doc libavcodec-dev libavcodec58 libavfilter7 libavfilter-dev libavformat58 libavformat-dev libavresample4 libavresample-dev libavutil-dev libavutil56 libavdevice58 libavdevice-dev libswscale5 libswscale-dev libswresample3 libswresample-dev libpostproc55 libpostproc-dev
Test du bon fonctionnement de Nvenc
ffmpeg -hide_banner -encoders | grep nvenc
Cette commande doit vous donner ce résultat
V..... h264_nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc_h264 NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc_hevc NVIDIA NVENC hevc encoder (codec hevc)
V..... hevc_nvenc NVIDIA NVENC hevc encoder (codec hevc)
ffmpeg -hide_banner -decoders | grep cuvid
Doit vous donner :
V..... h264_cuvid Nvidia CUVID H264 decoder (codec h264)
V..... hevc_cuvid Nvidia CUVID HEVC decoder (codec hevc)
V..... mjpeg_cuvid Nvidia CUVID MJPEG decoder (codec mjpeg)
V..... mpeg1_cuvid Nvidia CUVID MPEG1VIDEO decoder (codec mpeg1video)
V..... mpeg2_cuvid Nvidia CUVID MPEG2VIDEO decoder (codec mpeg2video)
V..... mpeg4_cuvid Nvidia CUVID MPEG4 decoder (codec mpeg4)
V..... vc1_cuvid Nvidia CUVID VC1 decoder (codec vc1)
V..... vp8_cuvid Nvidia CUVID VP8 decoder (codec vp8)
V..... vp9_cuvid Nvidia CUVID VP9 decoder (codec vp9)
ffmpeg -hide_banner -hwaccels
Doit vous donner
Hardware acceleration methods:
vdpau
cuda
vaapi
drm
cuvid
Installion d’OBS Studio (pas besoin de compiler)
OBS détecte si FFmpeg (libavcodec) exporte dynamiquement h264_nvenc au démarrage de l’exécution si l’accélération GPU n’a pas été désactivée au moment de la construction.
Installation d’OBS Studio a partir des paquets officiels
sudo add-apt-repository ppa:obsproject/obs-studio
sudo apt update
sudo apt install obs-studio
MAINTENANT, vous devriez avoir un OBS entièrement fonctionnel avec une accélération matérielle ! Le reste de ce guide est facultatif (pour les personnes qui souhaitent tirer le meilleur parti de leur GPU).
Construisez MPV pour utiliser NVDEC pour le décodage vidéo
Compilation et installation avec la prise en charge de Nvdec
sudo apt build-dep mpv
mkdir -p ~/devel/mpv
cd ~/devel/mpv
sudo apt source mpv
sudo chown -hR $USER: *
cd mpv-0.32.0 # cd mpv-x.x.x [x.x.x represents version]
debuild -b --no-sign --jobs-try=$((`nproc`/2))
cd ..
sudo dpkg -i mpv*.deb # we dont need libmpv{-dev}
sudo apt-mark hold mpv
Puis vous pouvez lire la vidéo avec mpv
mpv Some.Home.Movie.mkv
Playing: Some.Home.Movie.mkv
(+) Video --vid=1 (*) (h264 1280x720 29.970fps)
(+) Audio --aid=1 (*) (aac 2ch 44100Hz)
Using hardware decoding (nvdec). # this line is very important, you can turn on debug output with --v
AO: [pulse] 44100Hz stereo 2ch float
VO: [gpu] 1280x720 => 1710x720 cuda[nv12]
Pour conclure
Cela fait des années que j’utilise cette méthode pour obtenir nvenc sur Ubuntu et OBS Studio. Ceci, n’est plus nécessaire sur Ubuntu 22.04, nvenc étant pris en charge nativement. De quoi faire de beau enregistrement pour DonF & DonF





