Compilar FFMPEG com NVENC no Ubuntu

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

Nota (2026): o texto original era Ubuntu 16.04, FFmpeg 3.2.1 e NVIDIA Video Codec SDK 6.0.1/7.0.1. O vídeo do Canal Oficina do Tux (xdltF4HvfjE) saiu do ar. Os DEBs do repositório oficinadotux (16/18/19) e o gist de compilação de 2017 ficam só como histórico no fim. Hoje o caminho é driver proprietário + FFmpeg com ffnvcodec (headers 13.1.15, driver Linux ≥ 610) — e, na maioria das vezes, without baixar o SDK proprietário.

NVENC continua o mesmo bloco de hardware da NVIDIA: tira H.264/HEVC/AV1 da CPU e manda para o ASIC da GPU. O que mudou é o empacotamento. Em 2017 você compilava o FFmpeg contra o SDK. Em 2026 o FFmpeg fala com o driver via nv-codec-headers (MIT). Primeiro confira se o binário que você já tem já lista os encoders; só compile se faltar.

O que mudou desde 2017

  • Ubuntu 24.04 LTS traz FFmpeg 6.1.1; o 26.04 LTS traz 8.0.1 (universe).
  • O Video Codec SDK atual é o 13.1. Os headers públicos estão em nv-codec-headers 13.1.15 — driver mínimo 610.
  • Presets antigos (llhq, slow como nome de preset NVENC) deram lugar a p1p7.
  • Além de h264_nvenc and hevc_nvenc existe av1_nvenc (Ada / RTX 40 e mais novo).
  • NPP no FFmpeg está deprecado com CUDA > 12.8. A NVIDIA pede scale_cuda, não scale_npp. Evite --enable-libnpp.
  • O OBS no Linux fala com o NVENC pelo driver. Compilar FFmpeg não é mais pré-requisito para gravar/transmitir no OBS.

Conferir GPU e driver

Sem driver proprietário não há NVENC. Nouveau não conta. Detalhe de como a GPU trabalha: Como funcionam as placas 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'

Se aparecer h264_nvenc / hevc_nvenc (e av1_nvenc na Ada+), o FFmpeg do sistema já serve. Instale também as libs de encode/decode do driver:

# Ubuntu
sudo apt install libnvidia-decode libnvidia-encode

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

Quem ainda não tem o driver:

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

Atalho: o ffmpeg do Ubuntu

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

Debian/Ubuntu compilam o FFmpeg com libffmpeg-nvenc-dev (só headers MIT). NVENC/NVDEC entram por autodetect; as libs NVIDIA são dependência sugerida, não obrigatória do pacote. Por isso o binário lista os encoders mesmo numa máquina sem GPU — e falha em runtime se o driver não estiver lá.

If grep nvenc voltar vazio, você pegou um build sem ffnvcodec (snap, binário estático velho, PPA estranho). Aí use o jellyfin-ffmpeg ou compile.

Atalho 2: jellyfin-ffmpeg

The jellyfin-ffmpeg é FFmpeg 7.1.x / 8.1.x já ligado em NVENC, QSV e VA-API. Dá para instalar o pacote sozinho, sem o servidor Jellyfin. Em 2026: jellyfin-ffmpeg7 (7.1.4) e 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

O binário mora em /usr/lib/jellyfin-ffmpeg/ffmpeg, não substitui o /usr/bin/ffmpeg do Ubuntu. Use o caminho completo (ou um alias) quando quiser NVENC garantido.

Compilar: receita oficial NVIDIA 13.1

Documentação: Using FFmpeg with NVIDIA GPU Hardware Acceleration (SDK 13.1). Repositórios oficiais do FFmpeg agora estão em code.ffmpeg.org.

Útil quando você quer FFmpeg 8 no 24.04, filtros CUDA, ou um prefixo isolado sem tocar no pacote do 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

A flag --enable-nonfree entra porque o FFmpeg trata NVENC como nonfree na hora de redistribuir o binário. Os headers são MIT; o blob proprietário é o driver. Não habilite --enable-libnpp. CUDA runtime não é obrigatório — o FFmpeg usa a driver API.

Para persistir o prefixo local, acrescente no ~/.bashrc:

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

Não instale em /usr por cima do pacote ffmpeg. O prefixo build/ evita brigar com o apt.

Usar os encoders

Pipeline inteiro na GPU (decode CUDA → encode NVENC), sem volta pela 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+) e 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 na GPU com scale_cuda (substituto do 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 mais rápido / pior qualidade, p7 mais lento / melhor. p4 é o default. Tune: hq (arquivo), ll / ull (live), uhq (HEVC/AV1, Turing+, mais VRAM).

Várias GPUs: -hwaccel_device 1 or CUDA_VISIBLE_DEVICES=1. Lista: nvidia-smi -L.

OBS Studio

No OBS atual o encoder “NVIDIA NVENC” aparece sozinho quando o driver proprietário está no ar. Não depende do FFmpeg que você compilou. Flatpak do OBS usa o runtime dele: o pacote NVIDIA do Flatpak (org.freedesktop.Platform.GL.nvidia-…) precisa bater com o driver do host.

Na CLI, o equivalente de “gravar a tela com NVENC” continua sendo o FFmpeg; o OBS é a UI. SimpleScreenRecorder ficou para trás — se ainda usa, migre para OBS ou para o próprio FFmpeg.

Hardware, por geração

  • h264_nvenc — Kepler (GTX 600) em diante.
  • hevc_nvenc — Maxwell 2ª gen (GTX 900) em diante; 10-bit fica decente no Pascal+.
  • av1_nvenc — Ada (RTX 40) e Blackwell (RTX 50).

A trava de 3 sessões simultâneas nas GeForce caiu no driver 456.71 (2020). Se um encode recusar sessão, atualize o driver antes de culpar o FFmpeg.

Histórico (2017)

O fluxo da época — SDK 6/7, FFmpeg 3.2.1, script no gist, DEB para Ubuntu 16/18/19 — está arquivado em:

Não use esses binários em Ubuntu 24.04/26.04. O vídeo do YouTube que acompanhava o post original não está mais disponível.

Resumo: nvidia-smi no ar, ffmpeg -encoders | grep nvenc listando, encode com -hwaccel cuda -hwaccel_output_format cuda and scale_cuda. Compilar só se o pacote do Ubuntu ou o jellyfin-ffmpeg não bastar.