Compilar FFMPEG con NVENC en Ubuntu

Mascote do LinuxPro encaixando uma placa NVIDIA para usar o NVENC com FFmpeg

Nota (2026): el texto original era Ubuntu 16.04, FFmpeg 3.2.1 y NVIDIA Video Codec SDK 6.0.1/7.0.1. El vídeo del Canal Oficina do Tux (xdltF4HvfjE) dejó de estar disponible. Los DEB del repositorio oficinadotux (16/18/19) y el gist de compilación de 2017 quedan solo como histórico al final. Hoy el camino es driver propietario + FFmpeg con ffnvcodec (headers 13.1.15, driver Linux ≥ 610) — y, en la mayoría de los casos, sin descargar el SDK propietario.

NVENC sigue siendo el mismo bloque de hardware de NVIDIA: quita H.264/HEVC/AV1 de la CPU y lo envía al ASIC de la GPU. Lo que cambió es el empaquetado. En 2017 compilabas FFmpeg contra el SDK. En 2026 FFmpeg habla con el driver mediante nv-codec-headers (MIT). Primero comprueba si el binario que ya tienes ya lista los encoders; solo compila si faltan.

Lo que cambió desde 2017

  • Ubuntu 24.04 LTS incluye FFmpeg 6.1.1; el 26.04 LTS incluye 8.0.1 (universe).
  • El Video Codec SDK actual es el 13.1. Las cabeceras públicas están en nv-codec-headers 13.1.15: controlador mínimo 610.
  • Presets antiguos (llhq, slow como nombre de preajuste NVENC) dieron lugar a p1…p7.
  • Además de h264_nvenc e hevc_nvenc existe av1_nvenc (Ada / RTX 40 y más nuevo).
  • NPP en FFmpeg está obsoleto con CUDA > 12.8. NVIDIA pide scale_cuda, no scale_npp. Evite --enable-libnpp.
  • OBS en Linux habla con NVENC a través del driver. Compilar FFmpeg ya no es un requisito previo para grabar/transmitir en OBS.

Comprobar GPU y driver

Sin controlador propietario no hay NVENC. Nouveau no cuenta. Detalle de cómo trabaja la GPU: Cómo funcionan las tarjetas de vídeo.

nvidia-smi
# Driver Version e o nome da GPU. Para headers 13.1: driver ≥ 610.

ffmpeg -hide_banner -encoders | grep nvenc
ffmpeg -hide_banner -decoders | grep cuvid
ffmpeg -hide_banner -hwaccels | grep -E 'cuda|nvdec'

Si aparece h264_nvenc / hevc_nvenc (y av1_nvenc en Ada+), el FFmpeg del sistema ya sirve. Instale también las libs de encode/decode del controlador:

# Ubuntu
sudo apt install libnvidia-decode libnvidia-encode

# Debian (nomes com sufixo 1)
sudo apt install libnvcuvid1 libnvidia-encode1

Quien aún no tiene el controlador:

ubuntu-drivers devices
sudo ubuntu-drivers install
# ou um ramo específico, ex.: sudo apt install nvidia-driver-570
sudo reboot

Atajo: el ffmpeg de Ubuntu

sudo apt update
sudo apt install ffmpeg
ffmpeg -version
ffmpeg -hide_banner -encoders | grep nvenc

Debian/Ubuntu compilan FFmpeg con libffmpeg-nvenc-dev (solo cabeceras MIT). NVENC/NVDEC entran por autodetección; las libs de NVIDIA son una dependencia sugerida, no obligatoria del paquete. Por eso el binario lista los encoders incluso en una máquina sin GPU — y falla en tiempo de ejecución si el driver no está.

Si grep nvenc devuelve vacío, has pillado un build sin ffnvcodec (snap, binario estático antiguo, PPA raro). En ese caso usa jellyfin-ffmpeg o compila.

Atajo 2: jellyfin-ffmpeg

O jellyfin-ffmpeg es FFmpeg 7.1.x / 8.1.x ya enlazado a NVENC, QSV y VA-API. Se puede instalar el paquete solo, sin el servidor Jellyfin. En 2026: jellyfin-ffmpeg7 (7.1.4) y jellyfin-ffmpeg8 (8.1.1).

curl -fsSL https://repo.jellyfin.org/install-debuntu.sh | sudo bash
sudo apt install jellyfin-ffmpeg7 libnvidia-decode libnvidia-encode

/usr/lib/jellyfin-ffmpeg/ffmpeg -hide_banner -encoders | grep nvenc

El binario está en /usr/lib/jellyfin-ffmpeg/ffmpeg, no sustituye al /usr/bin/ffmpeg de Ubuntu. Usa la ruta completa (o un alias) cuando quieras NVENC garantizado.

Compilar: receta oficial de NVIDIA 13.1

Documentación: Using FFmpeg with NVIDIA GPU Hardware Acceleration (SDK 13.1). Los repositorios oficiales de FFmpeg ahora están en code.ffmpeg.org.

Útil cuando quieres FFmpeg 8 en el 24.04, filtros CUDA, o un prefijo aislado sin tocar el paquete del sistema.

sudo apt update
sudo apt -y install git build-essential pkg-config nasm clang 
  libx264-dev libx265-dev libopus-dev libvpx-dev libmp3lame-dev 
  libass-dev libfreetype6-dev libgnutls28-dev

mkdir -p ~/src && cd ~/src

git clone https://code.ffmpeg.org/FFmpeg/nv-codec-headers.git
cd nv-codec-headers
# driver < 610: git checkout n12.2.72.0
sudo make install
cd ..

git clone https://code.ffmpeg.org/FFmpeg/FFmpeg.git
cd FFmpeg
# master quebra de vez em quando; pin numa release:
# git checkout n8.0.1

./configure --prefix="$PWD/build" 
  --enable-gpl --enable-nonfree 
  --disable-static --enable-shared 
  --nvcc=clang 
  --enable-libx264 --enable-libx265 --enable-libopus 
  --enable-libvpx --enable-libmp3lame --enable-libass --enable-gnutls

make -j"$(nproc)"
make install

export PATH="$PWD/build/bin:$PATH"
export LD_LIBRARY_PATH="$PWD/build/lib:${LD_LIBRARY_PATH:-}"

ffmpeg -hide_banner -encoders | grep nvenc
ffmpeg -hide_banner -filters  | grep cuda

La flag --enable-nonfree entra porque FFmpeg trata NVENC como nonfree a la hora de redistribuir el binario. Los headers son MIT; el blob propietario es el driver. No habilite --enable-libnpp. El runtime de CUDA no es obligatorio: FFmpeg usa la driver API.

Para persistir el prefijo local, añada en ~/.bashrc:

export PATH="$HOME/src/FFmpeg/build/bin:$PATH"
export LD_LIBRARY_PATH="$HOME/src/FFmpeg/build/lib:${LD_LIBRARY_PATH:-}"

No instale en /usr encima del paquete ffmpeg. El prefijo build/ evita pelearse con apt.

Usar los codificadores

Pipeline entero en la GPU (decode CUDA → encode NVENC), sin vuelta por la RAM:

ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda 
  -i entrada.mp4 
  -c:v h264_nvenc -preset p4 -b:v 5M -fps_mode passthrough 
  -c:a copy 
  saida.mp4

HEVC (Maxwell 2.ª gen+) y AV1 (Ada / RTX 40+):

# HEVC qualidade (arquivo, não live)
ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -i entrada.mp4 
  -c:v hevc_nvenc -preset p6 -tune hq -rc vbr -cq 23 -b:v 0 
  -c:a copy saida.mkv

# AV1
ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -i entrada.mp4 
  -c:v av1_nvenc -preset p5 -tune hq -rc constqp -qp 28 
  -c:a copy saida.mkv

Redimensionar en la GPU con scale_cuda (sustituto de scale_npp):

ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -i entrada.mp4 
  -vf scale_cuda=1280:720:interp_algo=bilinear 
  -c:v h264_nvenc -preset p4 -b:v 4M -c:a copy saida.mp4

Presets: p1 más rápido / peor calidad, p7 más lento / mejor. p4 es el predeterminado. Tune: hq (archivo), ll / ull (en vivo), uhq (HEVC/AV1, Turing+, más VRAM).

Varias GPUs: -hwaccel_device 1 o CUDA_VISIBLE_DEVICES=1. Lista: nvidia-smi -L.

OBS Studio

En el OBS actual el codificador “NVIDIA NVENC” aparece solo cuando el controlador propietario está activo. No depende del FFmpeg que hayas compilado. El Flatpak de OBS usa su propio runtime: el paquete NVIDIA del Flatpak (org.freedesktop.Platform.GL.nvidia-…) tiene que coincidir con el controlador del host.

En la CLI, el equivalente a “grabar la pantalla con NVENC” sigue siendo FFmpeg; OBS es la interfaz gráfica. SimpleScreenRecorder se ha quedado atrás: si aún lo usas, migra a OBS o al propio FFmpeg.

Hardware, por generación

  • h264_nvenc — Kepler (GTX 600) en adelante.
  • hevc_nvenc — Maxwell 2.ª gen (GTX 900) en adelante; 10-bit queda decente en Pascal+.
  • av1_nvenc — Ada (RTX 40) y Blackwell (RTX 50).

El límite de 3 sesiones simultáneas en GeForce se eliminó en el controlador 456.71 (2020). Si un encode rechaza la sesión, actualiza el controlador antes de culpar a FFmpeg.

Histórico (2017)

El flujo de la época — SDK 6/7, FFmpeg 3.2.1, script en el gist, DEB para Ubuntu 16/18/19 — está archivado en:

No uses esos binarios en Ubuntu 24.04/26.04. El vídeo de YouTube que acompañaba al post original ya no está disponible.

Resumen: nvidia-smi en el aire, ffmpeg -encoders | grep nvenc listando, codificar con -hwaccel cuda -hwaccel_output_format cuda e scale_cuda. Compila solo si el paquete de Ubuntu o jellyfin-ffmpeg no es suficiente.