{"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\/es\/2017\/04\/compile-ffmpeg-nvenc-ubuntu\/","title":{"rendered":"Compilar FFMPEG con NVENC en 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> el texto original era Ubuntu 16.04, FFmpeg 3.2.1 y NVIDIA Video Codec SDK 6.0.1\/7.0.1. El v\u00eddeo del Canal Oficina do Tux (<code data-no-translation=\"\">xdltF4HvfjE<\/code>) dej\u00f3 de estar disponible. Los DEB del repositorio oficinadotux (16\/18\/19) y el gist de compilaci\u00f3n de 2017 quedan solo como hist\u00f3rico al final. Hoy el camino es driver propietario + FFmpeg con <code data-no-translation=\"\">ffnvcodec<\/code> (headers 13.1.15, driver Linux \u2265 610) \u2014 y, en la mayor\u00eda de los casos, <em>sin<\/em> descargar el SDK propietario.<\/div>\n<p>NVENC sigue siendo el mismo bloque de hardware de NVIDIA: quita H.264\/HEVC\/AV1 de la CPU y lo env\u00eda al ASIC de la GPU. Lo que cambi\u00f3 es el empaquetado. En 2017 compilabas FFmpeg contra el SDK. En 2026 FFmpeg habla con el driver mediante <a href=\"https:\/\/code.ffmpeg.org\/FFmpeg\/nv-codec-headers\">nv-codec-headers<\/a> (MIT). Primero comprueba si el binario que ya tienes ya lista los encoders; solo compila si faltan.<\/p>\n<p><!-- more --><\/p>\n<h2>Lo que cambi\u00f3 desde 2017<\/h2>\n<ul>\n<li>Ubuntu 24.04 LTS incluye FFmpeg <strong>6.1.1<\/strong>; el 26.04 LTS incluye <strong>8.0.1<\/strong> (universe).<\/li>\n<li>El Video Codec SDK actual es el <strong>13.1<\/strong>. Las cabeceras p\u00fablicas est\u00e1n en <code data-no-translation=\"\">nv-codec-headers<\/code> 13.1.15: controlador m\u00ednimo 610.<\/li>\n<li>Presets antiguos (<code data-no-translation=\"\">llhq<\/code>, <code data-no-translation=\"\">slow<\/code> como nombre de preajuste NVENC) dieron lugar a <code data-no-translation=\"\">p1<\/code>\u2026<code data-no-translation=\"\">p7<\/code>.<\/li>\n<li>Adem\u00e1s de <code data-no-translation=\"\">h264_nvenc<\/code> e <code data-no-translation=\"\">hevc_nvenc<\/code> existe <code data-no-translation=\"\">av1_nvenc<\/code> (Ada \/ RTX 40 y m\u00e1s nuevo).<\/li>\n<li>NPP en FFmpeg est\u00e1 obsoleto con CUDA &gt; 12.8. NVIDIA pide <code data-no-translation=\"\">scale_cuda<\/code>, no <code data-no-translation=\"\">scale_npp<\/code>. Evite <code data-no-translation=\"\">--enable-libnpp<\/code>.<\/li>\n<li class=\"translation-block\">OBS en Linux habla con NVENC a trav\u00e9s del driver. Compilar FFmpeg <em>ya no<\/em> es un requisito previo para grabar\/transmitir en OBS.<\/li>\n<\/ul>\n<h2>Comprobar GPU y driver<\/h2>\n<p>Sin controlador propietario no hay NVENC. Nouveau no cuenta. Detalle de c\u00f3mo trabaja la GPU: <a href=\"\/es\/2026\/09\/como-funcionam-placas-de-video\/\">C\u00f3mo funcionan las tarjetas 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>Si aparece <code data-no-translation=\"\">h264_nvenc<\/code> \/ <code data-no-translation=\"\">hevc_nvenc<\/code> (y <code data-no-translation=\"\">av1_nvenc<\/code> en Ada+), el FFmpeg del sistema ya sirve. Instale tambi\u00e9n las libs de encode\/decode del controlador:<\/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>Quien a\u00fan no tiene el controlador:<\/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>Atajo: el ffmpeg de 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 compilan FFmpeg con <code data-no-translation=\"\">libffmpeg-nvenc-dev<\/code> (solo cabeceras MIT). NVENC\/NVDEC entran por autodetecci\u00f3n; las libs de NVIDIA son una dependencia <em>sugerida<\/em>, no obligatoria del paquete. Por eso el binario lista los encoders incluso en una m\u00e1quina sin GPU \u2014 y falla en tiempo de ejecuci\u00f3n si el driver no est\u00e1.<\/p>\n<p>Si <code data-no-translation=\"\">grep nvenc<\/code> devuelve vac\u00edo, has pillado un build sin ffnvcodec (snap, binario est\u00e1tico antiguo, PPA raro). En ese caso usa jellyfin-ffmpeg o compila.<\/p>\n<h2>Atajo 2: jellyfin-ffmpeg<\/h2>\n<p>O <a href=\"https:\/\/github.com\/jellyfin\/jellyfin-ffmpeg\">jellyfin-ffmpeg<\/a> 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: <code data-no-translation=\"\">jellyfin-ffmpeg7<\/code> (7.1.4) y <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>El binario est\u00e1 en <code data-no-translation=\"\">\/usr\/lib\/jellyfin-ffmpeg\/ffmpeg<\/code>, no sustituye al <code data-no-translation=\"\">\/usr\/bin\/ffmpeg<\/code> de Ubuntu. Usa la ruta completa (o un alias) cuando quieras NVENC garantizado.<\/p>\n<h2>Compilar: receta oficial de NVIDIA 13.1<\/h2>\n<p>Documentaci\u00f3n: <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). Los repositorios oficiales de FFmpeg ahora est\u00e1n en <code data-no-translation=\"\">code.ffmpeg.org<\/code>.<\/p>\n<p>\u00datil cuando quieres FFmpeg 8 en el 24.04, filtros CUDA, o un prefijo aislado sin tocar el paquete del 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>La flag <code data-no-translation=\"\">--enable-nonfree<\/code> 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 <code data-no-translation=\"\">--enable-libnpp<\/code>. El runtime de CUDA no es obligatorio: FFmpeg usa la driver API.<\/p>\n<p>Para persistir el prefijo local, a\u00f1ada en <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>No instale en <code data-no-translation=\"\">\/usr<\/code> encima del paquete <code data-no-translation=\"\">ffmpeg<\/code>. El prefijo <code data-no-translation=\"\">build\/<\/code> evita pelearse con apt.<\/p>\n<h2>Usar los codificadores<\/h2>\n<p>Pipeline entero en la GPU (decode CUDA \u2192 encode NVENC), sin vuelta por la 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+) y 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 en la GPU con <code data-no-translation=\"\">scale_cuda<\/code> (sustituto de <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> m\u00e1s r\u00e1pido \/ peor calidad, <code data-no-translation=\"\">p7<\/code> m\u00e1s lento \/ mejor. <code data-no-translation=\"\">p4<\/code> es el predeterminado. Tune: <code data-no-translation=\"\">hq<\/code> (archivo), <code data-no-translation=\"\">ll<\/code> \/ <code data-no-translation=\"\">ull<\/code> (en vivo), <code data-no-translation=\"\">uhq<\/code> (HEVC\/AV1, Turing+, m\u00e1s VRAM).<\/p>\n<p>Varias GPUs: <code data-no-translation=\"\">-hwaccel_device 1<\/code> o <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>En el OBS actual el codificador \u201cNVIDIA NVENC\u201d aparece solo cuando el controlador propietario est\u00e1 activo. No depende del FFmpeg que hayas compilado. El Flatpak de OBS usa su propio runtime: el paquete NVIDIA del Flatpak (<code data-no-translation=\"\">org.freedesktop.Platform.GL.nvidia-\u2026<\/code>) tiene que coincidir con el controlador del host.<\/p>\n<p>En la CLI, el equivalente a \u201cgrabar la pantalla con NVENC\u201d sigue siendo FFmpeg; OBS es la interfaz gr\u00e1fica. SimpleScreenRecorder se ha quedado atr\u00e1s: si a\u00fan lo usas, migra a OBS o al propio FFmpeg.<\/p>\n<h2>Hardware, por generaci\u00f3n<\/h2>\n<ul>\n<li><code data-no-translation=\"\">h264_nvenc<\/code> \u2014 Kepler (GTX 600) en adelante.<\/li>\n<li><code data-no-translation=\"\">hevc_nvenc<\/code> \u2014 Maxwell 2.\u00aa gen (GTX 900) en adelante; 10-bit queda decente en Pascal+.<\/li>\n<li><code data-no-translation=\"\">av1_nvenc<\/code> \u2014 Ada (RTX 40) y Blackwell (RTX 50).<\/li>\n<\/ul>\n<p>El l\u00edmite de 3 sesiones simult\u00e1neas en GeForce se elimin\u00f3 en el controlador 456.71 (2020). Si un encode rechaza la sesi\u00f3n, actualiza el controlador antes de culpar a FFmpeg.<\/p>\n<h2>Hist\u00f3rico (2017)<\/h2>\n<p>El flujo de la \u00e9poca \u2014 SDK 6\/7, FFmpeg 3.2.1, script en el gist, DEB para Ubuntu 16\/18\/19 \u2014 est\u00e1 archivado en:<\/p>\n<ul>\n<li><a href=\"https:\/\/gist.github.com\/jniltinho\/9273dc133796062c13ca739d17862125\">gist de compilaci\u00f3n (FFmpeg 3.2.1 + SDK 7.0.1)<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/jniltinho\/oficinadotux\">oficinadotux<\/a> (binarios 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>No uses esos binarios en Ubuntu 24.04\/26.04. El v\u00eddeo de YouTube que acompa\u00f1aba al post original ya no est\u00e1 disponible.<\/p>\n<p>Resumen: <code data-no-translation=\"\">nvidia-smi<\/code> en el aire, <code data-no-translation=\"\">ffmpeg -encoders | grep nvenc<\/code> listando, codificar con <code data-no-translation=\"\">-hwaccel cuda -hwaccel_output_format cuda<\/code> e <code data-no-translation=\"\">scale_cuda<\/code>. Compila solo si el paquete de Ubuntu o jellyfin-ffmpeg no es suficiente.<\/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 con NVENC en Ubuntu\" class=\"read-more\" href=\"https:\/\/www.linuxpro.com.br\/es\/2017\/04\/compile-ffmpeg-nvenc-ubuntu\/\" aria-label=\"Leer m\u00e1s sobre Compilar FFMPEG com NVENC no Ubuntu\">Leer m\u00e1s<\/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\/es\/wp-json\/wp\/v2\/posts\/112","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/comments?post=112"}],"version-history":[{"count":7,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/112\/revisions"}],"predecessor-version":[{"id":1405,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/112\/revisions\/1405"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/media?parent=112"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/categories?post=112"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/tags?post=112"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}