{"id":112,"date":"2017-04-10T10:54:00","date_gmt":"2017-04-10T13:54:00","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/2017\/04\/compile-ffmpeg-nvenc-ubuntu\/"},"modified":"2026-09-08T11:12:43","modified_gmt":"2026-09-08T14:12:43","slug":"compile-ffmpeg-nvenc-ubuntu","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/en\/2017\/04\/compile-ffmpeg-nvenc-ubuntu\/","title":{"rendered":"Compilar FFMPEG com NVENC no Ubuntu"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" alt=\"Mascote do LinuxPro encaixando uma placa NVIDIA para usar o NVENC com FFmpeg\" src=\"\/wp-content\/uploads\/2026\/09\/compile-ffmpeg-nvenc-v2.webp\" width=\"1486\" height=\"856\" \/><\/p>\n<div style=\"background:#fff8e1;border-left:4px solid #8b1a1a;padding:.8em 1em;margin:1em 0\"><strong>Nota (2026):<\/strong> o texto original era Ubuntu 16.04, FFmpeg 3.2.1 e NVIDIA Video Codec SDK 6.0.1\/7.0.1. O v\u00eddeo do Canal Oficina do Tux (<code data-no-translation=\"\">xdltF4HvfjE<\/code>) saiu do ar. Os DEBs do reposit\u00f3rio oficinadotux (16\/18\/19) e o gist de compila\u00e7\u00e3o de 2017 ficam s\u00f3 como hist\u00f3rico no fim. Hoje o caminho \u00e9 driver propriet\u00e1rio + FFmpeg com <code data-no-translation=\"\">ffnvcodec<\/code> (headers 13.1.15, driver Linux \u2265 610) \u2014 e, na maioria das vezes, <em>without<\/em> baixar o SDK propriet\u00e1rio.<\/div>\n<p>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 \u00e9 o empacotamento. Em 2017 voc\u00ea compilava o FFmpeg contra o SDK. Em 2026 o FFmpeg fala com o driver via <a href=\"https:\/\/code.ffmpeg.org\/FFmpeg\/nv-codec-headers\">nv-codec-headers<\/a> (MIT). Primeiro confira se o bin\u00e1rio que voc\u00ea j\u00e1 tem j\u00e1 lista os encoders; s\u00f3 compile se faltar.<\/p>\n<p><!-- more --><\/p>\n<h2>O que mudou desde 2017<\/h2>\n<ul>\n<li>Ubuntu 24.04 LTS traz FFmpeg <strong>6.1.1<\/strong>; o 26.04 LTS traz <strong>8.0.1<\/strong> (universe).<\/li>\n<li>O Video Codec SDK atual \u00e9 o <strong>13.1<\/strong>. Os headers p\u00fablicos est\u00e3o em <code data-no-translation=\"\">nv-codec-headers<\/code> 13.1.15 \u2014 driver m\u00ednimo 610.<\/li>\n<li>Presets antigos (<code data-no-translation=\"\">llhq<\/code>, <code data-no-translation=\"\">slow<\/code> como nome de preset NVENC) deram lugar a <code data-no-translation=\"\">p1<\/code>\u2026<code data-no-translation=\"\">p7<\/code>.<\/li>\n<li>Al\u00e9m de <code data-no-translation=\"\">h264_nvenc<\/code> and <code data-no-translation=\"\">hevc_nvenc<\/code> existe <code data-no-translation=\"\">av1_nvenc<\/code> (Ada \/ RTX 40 e mais novo).<\/li>\n<li>NPP no FFmpeg est\u00e1 deprecado com CUDA &gt; 12.8. A NVIDIA pede <code data-no-translation=\"\">scale_cuda<\/code>, n\u00e3o <code data-no-translation=\"\">scale_npp<\/code>. Evite <code data-no-translation=\"\">--enable-libnpp<\/code>.<\/li>\n<li>O OBS no Linux fala com o NVENC pelo driver. Compilar FFmpeg <em>n\u00e3o<\/em> \u00e9 mais pr\u00e9-requisito para gravar\/transmitir no OBS.<\/li>\n<\/ul>\n<h2>Conferir GPU e driver<\/h2>\n<p>Sem driver propriet\u00e1rio n\u00e3o h\u00e1 NVENC. Nouveau n\u00e3o conta. Detalhe de como a GPU trabalha: <a href=\"\/en\/2026\/09\/como-funcionam-placas-de-video\/\">Como funcionam as placas de v\u00eddeo<\/a>.<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">nvidia-smi\n# Driver Version e o nome da GPU. Para headers 13.1: driver \u2265 610.\n\nffmpeg -hide_banner -encoders | grep nvenc\nffmpeg -hide_banner -decoders | grep cuvid\nffmpeg -hide_banner -hwaccels | grep -E 'cuda|nvdec'<\/code><\/pre>\n<p>Se aparecer <code data-no-translation=\"\">h264_nvenc<\/code> \/ <code data-no-translation=\"\">hevc_nvenc<\/code> (e <code data-no-translation=\"\">av1_nvenc<\/code> na Ada+), o FFmpeg do sistema j\u00e1 serve. Instale tamb\u00e9m as libs de encode\/decode do driver:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\"># Ubuntu\nsudo apt install libnvidia-decode libnvidia-encode\n\n# Debian (nomes com sufixo 1)\nsudo apt install libnvcuvid1 libnvidia-encode1<\/code><\/pre>\n<p>Quem ainda n\u00e3o tem o driver:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">ubuntu-drivers devices\nsudo ubuntu-drivers install\n# ou um ramo espec\u00edfico, ex.: sudo apt install nvidia-driver-570\nsudo reboot<\/code><\/pre>\n<h2>Atalho: o ffmpeg do Ubuntu<\/h2>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">sudo apt update\nsudo apt install ffmpeg\nffmpeg -version\nffmpeg -hide_banner -encoders | grep nvenc<\/code><\/pre>\n<p>Debian\/Ubuntu compilam o FFmpeg com <code data-no-translation=\"\">libffmpeg-nvenc-dev<\/code> (s\u00f3 headers MIT). NVENC\/NVDEC entram por autodetect; as libs NVIDIA s\u00e3o depend\u00eancia <em>sugerida<\/em>, n\u00e3o obrigat\u00f3ria do pacote. Por isso o bin\u00e1rio lista os encoders mesmo numa m\u00e1quina sem GPU \u2014 e falha em runtime se o driver n\u00e3o estiver l\u00e1.<\/p>\n<p>If <code data-no-translation=\"\">grep nvenc<\/code> voltar vazio, voc\u00ea pegou um build sem ffnvcodec (snap, bin\u00e1rio est\u00e1tico velho, PPA estranho). A\u00ed use o jellyfin-ffmpeg ou compile.<\/p>\n<h2>Atalho 2: jellyfin-ffmpeg<\/h2>\n<p>The <a href=\"https:\/\/github.com\/jellyfin\/jellyfin-ffmpeg\">jellyfin-ffmpeg<\/a> \u00e9 FFmpeg 7.1.x \/ 8.1.x j\u00e1 ligado em NVENC, QSV e VA-API. D\u00e1 para instalar o pacote sozinho, sem o servidor Jellyfin. Em 2026: <code data-no-translation=\"\">jellyfin-ffmpeg7<\/code> (7.1.4) e <code data-no-translation=\"\">jellyfin-ffmpeg8<\/code> (8.1.1).<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">curl -fsSL https:\/\/repo.jellyfin.org\/install-debuntu.sh | sudo bash\nsudo apt install jellyfin-ffmpeg7 libnvidia-decode libnvidia-encode\n\n\/usr\/lib\/jellyfin-ffmpeg\/ffmpeg -hide_banner -encoders | grep nvenc<\/code><\/pre>\n<p>O bin\u00e1rio mora em <code data-no-translation=\"\">\/usr\/lib\/jellyfin-ffmpeg\/ffmpeg<\/code>, n\u00e3o substitui o <code data-no-translation=\"\">\/usr\/bin\/ffmpeg<\/code> do Ubuntu. Use o caminho completo (ou um alias) quando quiser NVENC garantido.<\/p>\n<h2>Compilar: receita oficial NVIDIA 13.1<\/h2>\n<p>Documenta\u00e7\u00e3o: <a href=\"https:\/\/docs.nvidia.com\/video-technologies\/video-codec-sdk\/13.1\/ffmpeg-with-nvidia-gpu\/index.html\">Using FFmpeg with NVIDIA GPU Hardware Acceleration<\/a> (SDK 13.1). Reposit\u00f3rios oficiais do FFmpeg agora est\u00e3o em <code data-no-translation=\"\">code.ffmpeg.org<\/code>.<\/p>\n<p>\u00datil quando voc\u00ea quer FFmpeg 8 no 24.04, filtros CUDA, ou um prefixo isolado sem tocar no pacote do sistema.<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">sudo apt update\nsudo apt -y install git build-essential pkg-config nasm clang \n  libx264-dev libx265-dev libopus-dev libvpx-dev libmp3lame-dev \n  libass-dev libfreetype6-dev libgnutls28-dev\n\nmkdir -p ~\/src && cd ~\/src\n\ngit clone https:\/\/code.ffmpeg.org\/FFmpeg\/nv-codec-headers.git\ncd nv-codec-headers\n# driver &lt; 610: git checkout n12.2.72.0\nsudo make install\ncd ..\n\ngit clone https:\/\/code.ffmpeg.org\/FFmpeg\/FFmpeg.git\ncd FFmpeg\n# master quebra de vez em quando; pin numa release:\n# git checkout n8.0.1\n\n.\/configure --prefix=\"$PWD\/build\" \n  --enable-gpl --enable-nonfree \n  --disable-static --enable-shared \n  --nvcc=clang \n  --enable-libx264 --enable-libx265 --enable-libopus \n  --enable-libvpx --enable-libmp3lame --enable-libass --enable-gnutls\n\nmake -j\"$(nproc)\"\nmake install\n\nexport PATH=\"$PWD\/build\/bin:$PATH\"\nexport LD_LIBRARY_PATH=\"$PWD\/build\/lib:${LD_LIBRARY_PATH:-}\"\n\nffmpeg -hide_banner -encoders | grep nvenc\nffmpeg -hide_banner -filters  | grep cuda<\/code><\/pre>\n<p>A flag <code data-no-translation=\"\">--enable-nonfree<\/code> entra porque o FFmpeg trata NVENC como nonfree na hora de redistribuir o bin\u00e1rio. Os headers s\u00e3o MIT; o blob propriet\u00e1rio \u00e9 o driver. N\u00e3o habilite <code data-no-translation=\"\">--enable-libnpp<\/code>. CUDA runtime n\u00e3o \u00e9 obrigat\u00f3rio \u2014 o FFmpeg usa a driver API.<\/p>\n<p>Para persistir o prefixo local, acrescente no <code data-no-translation=\"\">~\/.bashrc<\/code>:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">export PATH=\"$HOME\/src\/FFmpeg\/build\/bin:$PATH\"\nexport LD_LIBRARY_PATH=\"$HOME\/src\/FFmpeg\/build\/lib:${LD_LIBRARY_PATH:-}\"<\/code><\/pre>\n<p>N\u00e3o instale em <code data-no-translation=\"\">\/usr<\/code> por cima do pacote <code data-no-translation=\"\">ffmpeg<\/code>. O prefixo <code data-no-translation=\"\">build\/<\/code> evita brigar com o apt.<\/p>\n<h2>Usar os encoders<\/h2>\n<p>Pipeline inteiro na GPU (decode CUDA \u2192 encode NVENC), sem volta pela RAM:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda \n  -i entrada.mp4 \n  -c:v h264_nvenc -preset p4 -b:v 5M -fps_mode passthrough \n  -c:a copy \n  saida.mp4<\/code><\/pre>\n<p>HEVC (Maxwell 2\u00aa gen+) e AV1 (Ada \/ RTX 40+):<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\"># HEVC qualidade (arquivo, n\u00e3o live)\nffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -i entrada.mp4 \n  -c:v hevc_nvenc -preset p6 -tune hq -rc vbr -cq 23 -b:v 0 \n  -c:a copy saida.mkv\n\n# AV1\nffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -i entrada.mp4 \n  -c:v av1_nvenc -preset p5 -tune hq -rc constqp -qp 28 \n  -c:a copy saida.mkv<\/code><\/pre>\n<p>Redimensionar na GPU com <code data-no-translation=\"\">scale_cuda<\/code> (substituto do <code data-no-translation=\"\">scale_npp<\/code>):<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -i entrada.mp4 \n  -vf scale_cuda=1280:720:interp_algo=bilinear \n  -c:v h264_nvenc -preset p4 -b:v 4M -c:a copy saida.mp4<\/code><\/pre>\n<p>Presets: <code data-no-translation=\"\">p1<\/code> mais r\u00e1pido \/ pior qualidade, <code data-no-translation=\"\">p7<\/code> mais lento \/ melhor. <code data-no-translation=\"\">p4<\/code> \u00e9 o default. Tune: <code data-no-translation=\"\">hq<\/code> (arquivo), <code data-no-translation=\"\">ll<\/code> \/ <code data-no-translation=\"\">ull<\/code> (live), <code data-no-translation=\"\">uhq<\/code> (HEVC\/AV1, Turing+, mais VRAM).<\/p>\n<p>V\u00e1rias GPUs: <code data-no-translation=\"\">-hwaccel_device 1<\/code> or <code data-no-translation=\"\">CUDA_VISIBLE_DEVICES=1<\/code>. Lista: <code data-no-translation=\"\">nvidia-smi -L<\/code>.<\/p>\n<h2>OBS Studio<\/h2>\n<p>No OBS atual o encoder \u201cNVIDIA NVENC\u201d aparece sozinho quando o driver propriet\u00e1rio est\u00e1 no ar. N\u00e3o depende do FFmpeg que voc\u00ea compilou. Flatpak do OBS usa o runtime dele: o pacote NVIDIA do Flatpak (<code data-no-translation=\"\">org.freedesktop.Platform.GL.nvidia-\u2026<\/code>) precisa bater com o driver do host.<\/p>\n<p>Na CLI, o equivalente de \u201cgravar a tela com NVENC\u201d continua sendo o FFmpeg; o OBS \u00e9 a UI. SimpleScreenRecorder ficou para tr\u00e1s \u2014 se ainda usa, migre para OBS ou para o pr\u00f3prio FFmpeg.<\/p>\n<h2>Hardware, por gera\u00e7\u00e3o<\/h2>\n<ul>\n<li><code data-no-translation=\"\">h264_nvenc<\/code> \u2014 Kepler (GTX 600) em diante.<\/li>\n<li><code data-no-translation=\"\">hevc_nvenc<\/code> \u2014 Maxwell 2\u00aa gen (GTX 900) em diante; 10-bit fica decente no Pascal+.<\/li>\n<li><code data-no-translation=\"\">av1_nvenc<\/code> \u2014 Ada (RTX 40) e Blackwell (RTX 50).<\/li>\n<\/ul>\n<p>A trava de 3 sess\u00f5es simult\u00e2neas nas GeForce caiu no driver 456.71 (2020). Se um encode recusar sess\u00e3o, atualize o driver antes de culpar o FFmpeg.<\/p>\n<h2>Hist\u00f3rico (2017)<\/h2>\n<p>O fluxo da \u00e9poca \u2014 SDK 6\/7, FFmpeg 3.2.1, script no gist, DEB para Ubuntu 16\/18\/19 \u2014 est\u00e1 arquivado em:<\/p>\n<ul>\n<li><a href=\"https:\/\/gist.github.com\/jniltinho\/9273dc133796062c13ca739d17862125\">gist de compila\u00e7\u00e3o (FFmpeg 3.2.1 + SDK 7.0.1)<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/jniltinho\/oficinadotux\">oficinadotux<\/a> (bin\u00e1rios 16\/18\/19)<\/li>\n<li><a href=\"https:\/\/gitlab.com\/jniltinho\/docker-ffmpeg\">gitlab.com\/jniltinho\/docker-ffmpeg<\/a><\/li>\n<\/ul>\n<p>N\u00e3o use esses bin\u00e1rios em Ubuntu 24.04\/26.04. O v\u00eddeo do YouTube que acompanhava o post original n\u00e3o est\u00e1 mais dispon\u00edvel.<\/p>\n<p>Resumo: <code data-no-translation=\"\">nvidia-smi<\/code> no ar, <code data-no-translation=\"\">ffmpeg -encoders | grep nvenc<\/code> listando, encode com <code data-no-translation=\"\">-hwaccel cuda -hwaccel_output_format cuda<\/code> and <code data-no-translation=\"\">scale_cuda<\/code>. Compilar s\u00f3 se o pacote do Ubuntu ou o jellyfin-ffmpeg n\u00e3o bastar.<\/p>","protected":false},"excerpt":{"rendered":"<p>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 \u00e9 o empacotamento. Em 2017 voc\u00ea compilava o FFmpeg contra o SDK. Em 2026 o FFmpeg fala &#8230; <a title=\"Compilar FFMPEG com NVENC no Ubuntu\" class=\"read-more\" href=\"https:\/\/www.linuxpro.com.br\/en\/2017\/04\/compile-ffmpeg-nvenc-ubuntu\/\" aria-label=\"Read more about Compilar FFMPEG com NVENC no Ubuntu\">Read more<\/a><\/p>","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[33,2,3],"tags":[36,37,134,38,4,205,152,34,35],"class_list":["post-112","post","type-post","status-publish","format-standard","hentry","category-howtos","category-linux","category-ubuntu","tag-compile","tag-ffmpeg","tag-gpu","tag-gravar","tag-linux","tag-nvenc","tag-nvidia","tag-obs","tag-www"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/112","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/comments?post=112"}],"version-history":[{"count":7,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/112\/revisions"}],"predecessor-version":[{"id":1405,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/112\/revisions\/1405"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/media?parent=112"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/categories?post=112"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/tags?post=112"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}