FFmpeg 实战:基于 Ubuntu 操作系统裸机部署具有 NVIDIA GPU 硬件加速编码能力的 FFmpeg

准备

  1. 正常运行 Ubuntu 操作系统的计算机一台。具体为:

    1. 已在主板的 PCIe x16 插槽上安装了 NVIDIA Tesla V100 计算卡。

      注意事项:

      安装形式不限,SXM2 转接 PCIe x16 或原生 PCIe x16 形式均可。
      
    2. 已设置主板 BIOS 中开启以下选项:

      1. 已启用 “Above 4G Decoding” 项。以提高 GPU 性能。

      2. 已将目标 PCIe 插槽的 CPU 总线分配为了 x16 速度的带宽。以提高 GPU 性能。

    3. 已安装 x86架构的、64位的、24.04 版本的Ubuntu Desktop 或 Ubuntu Server 操作系统。

  2. 已安装并配置好 NVIDIA GPU 驱动程序和 NVIDIA CUDA Toolkit 。

    参见:人工智能实战:基于 Ubuntu 操作系统和 Llama.cpp 应用程序,使用 Tesla V100 GPU 推理通义千问 3.6 27B 大模型

开始

了解生成具有 NVIDIA GPU 硬件加速编码能力 FFmpeg 的必要条件

想要编译出的 FFmpeg 具有完全的硬件加速编码能力,需要具备以下软硬件条件:

必要项 概述 推荐版本下载地址 预期结果 备注
GPU 硬件 必须安装好 NVIDIA Tesla V100 GPU。 - - -
GPU 驱动程序 适用于 NVIDIA Tesla V100 GPU 的驱动程序。 已含于 NVIDIA CUDA Toolkit 组件中,无需单独下载安装。 键入并执行 nvidia-smi 命令后能够正常输出 GPU 信息。 阅读人工智能实战:基于 Ubuntu 操作系统和 Llama.cpp 应用程序,使用 Tesla V100 GPU 推理通义千问 3.6 27B 大模型一文可知,NVIDIA CUDA Toolkit 12.9 Update 2 中自带的 NVIDIA GPU Driver 版本为 575.57.08。
NVIDIA CUDA Tookit 必须安装 CUDA Toolkit 且其版本必须与 NVIDIA Tesla V100 GPU 驱动程序兼容适配。 CUDA Toolkit 12.9 Update 2 Downloads 键入并执行 nvcc -V 命令后能够正常输出 NVIDIA NVCC 组件的版本信息。 -
NVIDIA Video Codec SDK Header Files 必须安装 NVIDIA Video Codec SDK 且其版本必须与 NVIDIA Tesla V100 GPU 驱动程序兼容适配。 NVIDIA Video Codec SDK 12.2 GitHub 源码主页 - 1. 务必注意阅读 NVIDIA Video Codec SDK 源码中的 README 文件,其中有写各个版本所支持的 NVIDIA GPU 驱动程序。
 若版本用错了,后面转码时会报形如“Driver does not support the required nvenc API version. Required: XX.X Found: XX.X”的错。
2. 参见:
  1. NVIDIA Video Codec SDK 产品主页
  2. 适用于 12.9 Update 2 版本 NVIDIA CUDA Toolkit 内 GPU 驱动程序的 NVIDIA Video Codec SDK

安装依赖组件

  1. 打开终端窗口,键入并执行以下命令,以安装编译所必需的组件:

    sudo apt-get install autoconf automake autotools-dev bison build-essential bzr cmake libaom-dev libboost-dev \
        libbluray-dev libc6-dev libfdk-aac-dev libgmp-dev libmp3lame-dev libgnutls28-dev libnuma-dev libopencore-amrnb-dev \
        libopencore-amrwb-dev libvo-amrwbenc-dev libopenmpt-dev libopus-dev libass-dev libprotobuf-dev libxml2-dev libftgl-dev \
        libglew-dev libsdl2-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsnappy-dev libshine-dev libsoxr-dev libspeex-dev \
        libtheora-dev libtool libtwolame-dev libx264-dev libx265-dev libxvidcore-dev nasm pkg-config unzip yasm -y
    
  2. 由于后续会在编译 FFmpeg 时启用 AviSynth 的相关功能,而软件源仓库中又没有现成可直接安装的库,故需要从源码编译安装。

  3. 打开终端窗口,键入并执行以下命令,以将最新版本的 AviSynth 源代码下载并保存到本机任意位置:

    sudo git clone https://down.mxw.xx.kg/https://github.com/AviSynth/AviSynthPlus.git
    
  4. 使用 cd 命令切换到源码根目录下,键入并执行以下命令,以编译并安装:

    sudo mkdir avisynth-build && cd avisynth-build \
        && sudo cmake ../ -DHEADERS_ONLY:bool=on && sudo make install
    

下载 NVIDIA Video Codec SDK 源码

打开终端窗口,键入并执行以下命令,以将兼容适配于 NVIDIA CUDA Toolkit 12.9 Update 2 中自带 NVIDIA GPU Driver 版本的(版本号为 575.57.08) 的、版本为 12.2 的 NVIDIA Video Codec SDK 源代码下载并保存到本机任意位置:

sudo git clone https://down.mxw.xx.kg/https://github.com/FFmpeg/nv-codec-headers.git -b 'sdk/12.2'

编译和安装 NVIDIA Video Codec SDK

打开终端窗口,使用 cd 命令切换到源码根目录下,键入并执行以下命令,以编译并安装:

sudo make install

成功安装的示例输出结果如下所示:

sed 's#@@PREFIX@@#/usr/local#' ffnvcodec.pc.in > ffnvcodec.pc
install -m 0755 -d '/usr/local/include/ffnvcodec'
install -m 0644 include/ffnvcodec/*.h '/usr/local/include/ffnvcodec'
install -m 0755 -d '/usr/local/lib/pkgconfig'
install -m 0644 ffnvcodec.pc '/usr/local/lib/pkgconfig'

由上可知:

NVIDIA Video Codec SDK 的相关头文件已安装到当前操作系统的头文件库中。

下载 FFmpeg 源码

打开终端窗口,键入并执行以下命令,以将最新版本的 ffmpeg 源代码下载并保存到本机任意位置:

sudo git clone https://down.mxw.xx.kg/https://github.com/FFmpeg/FFmpeg.git ffmpeg

编译和安装 FFmpeg

  1. 打开终端窗口,使用 cd 命令切换到源码根目录下,视实际情况,键入并执行以下命令,以编译并安装:

    sudo sh configure --enable-shared --enable-static --enable-gpl --enable-nonfree --nvcc=clang --prefix="[ffmpeg的目标安装位置。一般设为 /usr/local/ffmpeg 即可]" \
        --enable-avfilter --enable-avisynth --enable-gmp --enable-gnutls --enable-iconv --enable-libaom --enable-libass --enable-libbluray --enable-libfdk-aac \
        --enable-libfontconfig --enable-libmp3lame --enable-libnpp --enable-libopus --enable-libvorbis --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenmpt \
        --enable-libshine --enable-libsnappy --enable-libspeex --enable-libsoxr --enable-libtheora --enable-libvo-amrwbenc --enable-libwebp --enable-libtwolame --enable-libxvid \
        --enable-libxml2 --enable-zlib --enable-lzma --enable-pthreads --enable-sdl2 --enable-swscale --enable-version3 --enable-libx264 --enable-libx265 \
        --disable-x86asm \
        --extra-cflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' \
        --nvccflags="-gencode arch=compute_70,code=sm_70 -O2" \
        && sudo make -j$(nproc) && sudo make install
    

    示例命令如下所示:

    sudo sh configure --enable-shared --enable-static --enable-gpl --enable-nonfree --nvcc=clang --prefix="/usr/local/ffmpeg" \
        --enable-avfilter --enable-avisynth --enable-gmp --enable-gnutls --enable-iconv --enable-libaom --enable-libass --enable-libbluray --enable-libfdk-aac \
        --enable-libfontconfig --enable-libmp3lame --enable-libnpp --enable-libopus --enable-libvorbis --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenmpt \
        --enable-libshine --enable-libsnappy --enable-libspeex --enable-libsoxr --enable-libtheora --enable-libvo-amrwbenc --enable-libwebp --enable-libtwolame --enable-libxvid \
        --enable-libxml2 --enable-zlib --enable-lzma --enable-pthreads --enable-sdl2 --enable-swscale --enable-version3 --enable-libx264 --enable-libx265 \
        --disable-x86asm \
        --extra-cflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' \
        --nvccflags="-gencode arch=compute_70,code=sm_70 -O2" \
        && sudo make -j$(nproc) && sudo make install
    

    注意事项:

    1. 截至截稿时,NVIDIA 官方 Video Codec SDK 的部署教程版本为 13.1,部署时应遵照此教程。而不是网上搜索出来的、使用 13.0 或更早版本教程写出来的博客和经验贴。如果按照它们的方式部署,会一直卡在“nvcc not found”的错误上。因为新版早就不再且不必使用诸如 ``–enable-cuda-nvcc–enable-cuda-sdk–enable-cuvid–enable-libnpp、--enable-nvenc--extra-cflags='-I/usr/local/cuda/include'--extra-ldflags='-L/usr/local/cuda/lib64'--nvccflags='-gencode arch=compute_70,code=sm_70 -O2'等参数了。
    2. 上述命令中的 --nvccflags="-gencode arch=compute_70,code=sm_70 -O2" 参数实则不必加。但为了体现 Tesla V100 GPU 的 CUDA 硬件单元版本,提升可读性,就加上了。
    3. [老旧的 13.0 版 NVIDIA Video Codec SDK 官方部署教程](Using FFmpeg with NVIDIA GPU Hardware Acceleration)。
    4. [最新的 13.0 版 NVIDIA Video Codec SDK 官方部署教程](Using FFmpeg with NVIDIA GPU Hardware Acceleration)。
    5. configure 期间的日志文件输出,位于源码目录下 ffbuild 中的 config.log 文件内。
    1. 使用 cd 命令切换到 FFmpeg 安装目录下的 bin 目录中,键入并执行以下命令,以查看编译好的 FFmpeg 二进制可执行文件所引用的动态链接库的缺失情况:

      ldd ffmpeg
      

      示例结果输出如下所示:

      linux-vdso.so.1 (0x00007ffe9572c000)
      libavdevice.so.63 => not found
      libavfilter.so.12 => not found
      libavformat.so.63 => not found
      libavcodec.so.63 => not found
      libswresample.so.7 => not found
      libswscale.so.10 => not found
      libavutil.so.61 => not found
      libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe9c4f3e000)
      libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fe9c4f22000)
      libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fe9c4f02000)
      libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe9c4cd9000)
      /lib64/ld-linux-x86-64.so.2 (0x00007fe9c50a6000)
      

      由上可知:
      此 ffmpeg 二进制可执行文件找不到 libavdevice.so.63、libavfilter.so.12、libavformat.so.63、libavcodec.so.63、libswresample.so.7、libswscale.so.10 和 libavutil.so.61 动态链接库的引用。

    2. 键入并执行以下命令,以在 FFmpeg 的安装位置下查找这些文件的所在位置:

      sudo find . -name 'libavdevice.so.63'
      

      示例输出结果如下所示:

      ./lib/libavdevice.so.63
      

      由上可知:
      这些动态链接库都在当前目录下的 lib 中。

    3. 使用 vi 命令编辑位于 /etc 目录下名为 ld.so.conf 的动态链接库加载配置文件,并在文件末尾另起一行,将此 lib 的绝对路径加入到配置中,然后保存并退出:

      示例配置如下所示:

      include /etc/ld.so.conf.d/*.conf
      /usr/local/ffmpeg/lib
      
    4. 键入并执行以下命令,以刷新加载缓存:

      sudo ldconfig
      
    5. 再次使用 ldd 命令查看 ffmpeg 二进制可执行文件的动态链接库加载情况。

      示例输出结果如下所示:

      linux-vdso.so.1 (0x00007ffe1d1bd000)
      libavdevice.so.63 => /usr/local/ffmpeg/lib/libavdevice.so.63 (0x00007fa902d64000)
      libavfilter.so.12 => /usr/local/ffmpeg/lib/libavfilter.so.12 (0x00007fa902922000)
      libavformat.so.63 => /usr/local/ffmpeg/lib/libavformat.so.63 (0x00007fa902638000)
      libavcodec.so.63 => /usr/local/ffmpeg/lib/libavcodec.so.63 (0x00007fa9012ae000)
      libswresample.so.7 => /usr/local/ffmpeg/lib/libswresample.so.7 (0x00007fa901295000)
      libswscale.so.10 => /usr/local/ffmpeg/lib/libswscale.so.10 (0x00007fa90117b000)
      libavutil.so.61 => /usr/local/ffmpeg/lib/libavutil.so.61 (0x00007fa900f95000)
      libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa900eae000)
      libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fa900e92000)
      libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa900e72000)
      libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa900c49000)
      libdrm.so.2 => /lib/x86_64-linux-gnu/libdrm.so.2 (0x00007fa900c33000)
      libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fa900c07000)
      libasound.so.2 => /lib/x86_64-linux-gnu/libasound.so.2 (0x00007fa900b04000)
      libsndio.so.7 => /lib/x86_64-linux-gnu/libsndio.so.7 (0x00007fa900af0000)
      libXv.so.1 => /lib/x86_64-linux-gnu/libXv.so.1 (0x00007fa900ae9000)
      libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007fa9009a9000)
      libXext.so.6 => /lib/x86_64-linux-gnu/libXext.so.6 (0x00007fa900994000)
      libass.so.9 => /lib/x86_64-linux-gnu/libass.so.9 (0x00007fa90095c000)
      libfontconfig.so.1 => /lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007fa900912000)
      libxml2.so.2 => /lib/x86_64-linux-gnu/libxml2.so.2 (0x00007fa900730000)
      libopenmpt.so.0 => /lib/x86_64-linux-gnu/libopenmpt.so.0 (0x00007fa90056f000)
      libbluray.so.2 => /lib/x86_64-linux-gnu/libbluray.so.2 (0x00007fa900518000)
      libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fa900496000)
      libgnutls.so.30 => /lib/x86_64-linux-gnu/libgnutls.so.30 (0x00007fa9002a7000)
      libwebpmux.so.3 => /lib/x86_64-linux-gnu/libwebpmux.so.3 (0x00007fa90029a000)
      libwebp.so.7 => /lib/x86_64-linux-gnu/libwebp.so.7 (0x00007fa90022d000)
      liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007fa900202000)
      libopencore-amrwb.so.0 => /lib/x86_64-linux-gnu/libopencore-amrwb.so.0 (0x00007fa9001ec000)
      libsnappy.so.1 => /lib/x86_64-linux-gnu/libsnappy.so.1 (0x00007fa9001e2000)
      libaom.so.3 => /lib/x86_64-linux-gnu/libaom.so.3 (0x00007fa8ffc6f000)
      libfdk-aac.so.2 => /lib/x86_64-linux-gnu/libfdk-aac.so.2 (0x00007fa8ffb3e000)
      libmp3lame.so.0 => /lib/x86_64-linux-gnu/libmp3lame.so.0 (0x00007fa8ffac9000)
      libopencore-amrnb.so.0 => /lib/x86_64-linux-gnu/libopencore-amrnb.so.0 (0x00007fa8ffa9e000)
      libopus.so.0 => /lib/x86_64-linux-gnu/libopus.so.0 (0x00007fa8ffa40000)
      libshine.so.3 => /lib/x86_64-linux-gnu/libshine.so.3 (0x00007fa8ff800000)
      libspeex.so.1 => /lib/x86_64-linux-gnu/libspeex.so.1 (0x00007fa8ffa20000)
      libtheoraenc.so.1 => /lib/x86_64-linux-gnu/libtheoraenc.so.1 (0x00007fa8ff7c8000)
      libtheoradec.so.1 => /lib/x86_64-linux-gnu/libtheoradec.so.1 (0x00007fa8ff7aa000)
      libtwolame.so.0 => /lib/x86_64-linux-gnu/libtwolame.so.0 (0x00007fa8ff785000)
      libvo-amrwbenc.so.0 => /lib/x86_64-linux-gnu/libvo-amrwbenc.so.0 (0x00007fa8ff769000)
      libvorbis.so.0 => /lib/x86_64-linux-gnu/libvorbis.so.0 (0x00007fa8ff73c000)
      libvorbisenc.so.2 => /lib/x86_64-linux-gnu/libvorbisenc.so.2 (0x00007fa8ff691000)
      libx264.so.163 => /lib/x86_64-linux-gnu/libx264.so.163 (0x00007fa8ff3d0000)
      libx265.so.199 => /lib/x86_64-linux-gnu/libx265.so.199 (0x00007fa8fe46b000)
      libxvidcore.so.4 => /lib/x86_64-linux-gnu/libxvidcore.so.4 (0x00007fa8fe358000)
      libsoxr.so.0 => /lib/x86_64-linux-gnu/libsoxr.so.0 (0x00007fa8fe2f1000)
      /lib64/ld-linux-x86-64.so.2 (0x00007fa902dff000)
      libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x00007fa8ffa16000)
      libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fa8ffa0e000)
      libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007fa8fe2d9000)
      libfribidi.so.0 => /lib/x86_64-linux-gnu/libfribidi.so.0 (0x00007fa8fe2bd000)
      libharfbuzz.so.0 => /lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007fa8fe1ee000)
      libfreetype.so.6 => /lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007fa8fe126000)
      libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007fa8fe0f5000)
      libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007fa8fe0ec000)
      libicuuc.so.70 => /lib/x86_64-linux-gnu/libicuuc.so.70 (0x00007fa8fdef1000)
      libmpg123.so.0 => /lib/x86_64-linux-gnu/libmpg123.so.0 (0x00007fa8fde95000)
      libvorbisfile.so.3 => /lib/x86_64-linux-gnu/libvorbisfile.so.3 (0x00007fa8fde8a000)
      libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa8fdc5c000)
      libudfread.so.0 => /lib/x86_64-linux-gnu/libudfread.so.0 (0x00007fa8fdc51000)
      libp11-kit.so.0 => /lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007fa8fdb16000)
      libidn2.so.0 => /lib/x86_64-linux-gnu/libidn2.so.0 (0x00007fa8fdaf5000)
      libunistring.so.2 => /lib/x86_64-linux-gnu/libunistring.so.2 (0x00007fa8fd94b000)
      libtasn1.so.6 => /lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007fa8fd933000)
      libnettle.so.8 => /lib/x86_64-linux-gnu/libnettle.so.8 (0x00007fa8fd8eb000)
      libhogweed.so.6 => /lib/x86_64-linux-gnu/libhogweed.so.6 (0x00007fa8fd8a3000)
      libogg.so.0 => /lib/x86_64-linux-gnu/libogg.so.0 (0x00007fa8fd898000)
      libcairo.so.2 => /lib/x86_64-linux-gnu/libcairo.so.2 (0x00007fa8fd770000)
      libnuma.so.1 => /lib/x86_64-linux-gnu/libnuma.so.1 (0x00007fa8fd763000)
      libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa8fd75c000)
      libgomp.so.1 => /lib/x86_64-linux-gnu/libgomp.so.1 (0x00007fa8fd712000)
      libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007fa8fd705000)
      libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007fa8fd5ca000)
      libgraphite2.so.3 => /lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007fa8fd5a2000)
      libpng16.so.16 => /lib/x86_64-linux-gnu/libpng16.so.16 (0x00007fa8fd565000)
      libbrotlidec.so.1 => /lib/x86_64-linux-gnu/libbrotlidec.so.1 (0x00007fa8fd557000)
      libicudata.so.70 => /lib/x86_64-linux-gnu/libicudata.so.70 (0x00007fa8fb939000)
      libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007fa8fb92c000)
      libpixman-1.so.0 => /lib/x86_64-linux-gnu/libpixman-1.so.0 (0x00007fa8fb881000)
      libxcb-shm.so.0 => /lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007fa8fb87a000)
      libxcb-render.so.0 => /lib/x86_64-linux-gnu/libxcb-render.so.0 (0x00007fa8fb86b000)
      libXrender.so.1 => /lib/x86_64-linux-gnu/libXrender.so.1 (0x00007fa8fb85e000)
      libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fa8fb7e8000)
      libbrotlicommon.so.1 => /lib/x86_64-linux-gnu/libbrotlicommon.so.1 (0x00007fa8fb7c5000)
      

      由上可知:
      所有依赖的动态链接库都引用到了。

    6. 视实际情况,键入并执行以下命令,以为 FFmpeg 的相关二进制可执行文件创建软连接:

      sudo ln -s [ffmpeg二进制可执行文件的位置] /usr/bin/ffmpeg \
          && sudo ln -s [ffprobe二进制可执行文件的位置] /usr/bin/ffprobe \
          && sudo ln -s [ffplay二进制可执行文件的位置] /usr/bin/ffplay
      

      示例命令如下所示:

      sudo ln -s /usr/local/ffmpeg/bin/ffmpeg /usr/bin/ffmpeg \
          && sudo ln -s /usr/local/ffmpeg/bin/ffprobe /usr/bin/ffprobe \
          && sudo ln -s /usr/local/ffmpeg/bin/ffplay /usr/bin/ffplay
      
    7. 键入并执行以下命令,已验证 FFmpeg 版本:

      ffmpeg -version
      

      示例结果输出如下所示:

      ffmpeg version N-125485-ga41f543113 Copyright (c) 2000-2026 the FFmpeg developers
      built with gcc 11 (Ubuntu 11.4.0-1ubuntu1~22.04.3)
      configuration: --enable-shared --enable-static --enable-gpl --enable-nonfree --nvcc=clang --prefix=/usr/local/ffmpeg --enable-avfilter --enable-avisynth --enable-gmp --enable-gnutls --enable-iconv --enable-libaom --enable-libass --enable-libbluray --enable-libfdk-aac --enable-libfontconfig --enable-libmp3lame --enable-libnpp --enable-libopus --enable-libvorbis --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenmpt --enable-libshine --enable-libsnappy --enable-libspeex --enable-libsoxr --enable-libtheora --enable-libvo-amrwbenc --enable-libwebp --enable-libtwolame --enable-libxvid --enable-libxml2 --enable-zlib --enable-lzma --enable-pthreads --enable-sdl2 --enable-swscale --enable-version3 --enable-libx264 --enable-libx265 --disable-x86asm --extra-cflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' --nvccflags='-gencode arch=compute_70,code=sm_70 -O2'
      libavutil      61.  2.100 / 61.  2.100
      libavcodec     63.  5.100 / 63.  5.100
      libavformat    63.  3.100 / 63.  3.100
      libavdevice    63.  2.100 / 63.  2.100
      libavfilter    12.  2.100 / 12.  2.100
      libswscale     10.  2.100 / 10.  2.100
      libswresample   7.  2.100 /  7.  2.100
      
      Exiting with exit code 0
      

      由上可知:
      Ffmpeg 已成功安装。

    8. 分别键入并执行以下命令,以分别查看支持的所有 H.264、H.265(HEVC)编码器和解码器:

      ffmpeg -encoders | grep "h264"
      ffmpeg -decoders | grep "h264"
      

      示例结果输出分别如下所示:

      ********************************** H.264 编码器 *****************************************
      V....D libx264              libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (codec h264)
      V....D libx264rgb           libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 RGB (codec h264)
      V....D h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)
      V..... h264_v4l2m2m         V4L2 mem2mem H.264 encoder wrapper (codec h264)
      
      ********************************** H.264 解码器 *****************************************
      VFS..D h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
      V..... h264_v4l2m2m         V4L2 mem2mem H.264 decoder wrapper (codec h264)
      V..... h264_cuvid           Nvidia CUVID H264 decoder (codec h264)
      
      -----------------------------------------------------------------------------------------
      
      ********************************** H.265 (HEVC) 编码器 **********************************
      V....D libx265              libx265 H.265 / HEVC (codec hevc)
      V....D hevc_nvenc           NVIDIA NVENC hevc encoder (codec hevc)
      V..... hevc_v4l2m2m         V4L2 mem2mem HEVC encoder wrapper (codec hevc)
      
      ********************************** H.265 (HEVC) 解码器 **********************************
      VFS..D hevc                 HEVC (High Efficiency Video Coding)
      V..... hevc_v4l2m2m         V4L2 mem2mem HEVC decoder wrapper (codec hevc)
      V..... hevc_cuvid           Nvidia CUVID HEVC decoder (codec hevc)
      

      由上可知:

      H.264 和 H.265(HEVC)的编解码器都能够正常启用。

    效果展示

    1. 以下示例命令,是使用 NVIDIA GPU 的 NVENC 视频编码硬件单元,在尽可能小地损失原视频画质的情况下,将一个大小为 23.11GB 的影片转码压缩至 8.79 GB 大小:

      ./ffmpeg -hwaccel cuda -i "/home/stevejrong/demo_videos/Aliens_Romulus_2024.mkv" \
        -map 0:v -map 0:1 -map 0:2 -map 0:8 \
        -c:v hevc_nvenc -preset p7 -tune hq -b:v 8400k -rc vbr -rc-lookahead 32 -pix_fmt p010le \
        -c:a:0 eac3 -b:a:0 448k \
        -c:a:1 eac3 -b:a:1 768k \
        -c:s copy \
        -metadata:s:s:0 title="中英双语" \
        -avoid_negative_ts 1 \
        /home/stevejrong/demo_videos/Aliens_Romulus_2024_compressed.mkv
      

      转码过程中,可键入并执行以下命令,以循环显示 NVIDIA GPU 的负载情况:

      watch -n 2 -d nvidia-smi
      

      示例结果输出如下所示:

      Tue Jul  7 17:11:28 2026
      +-----------------------------------------------------------------------------------------+
      | NVIDIA-SMI 575.57.08              Driver Version: 575.57.08      CUDA Version: 12.9     |
      |-----------------------------------------+------------------------+----------------------+
      | GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
      | Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
      |                                         |                        |               MIG M. |
      |=========================================+========================+======================|
      |   0  Tesla V100-SXM2-16GB           Off |   00000000:02:00.0 Off |                    0 |
      | N/A   44C    P0             53W /  300W |    1743MiB /  16384MiB |     31%      Default |
      |                                         |                        |                  N/A |
      +-----------------------------------------+------------------------+----------------------+
      
      +-----------------------------------------------------------------------------------------+
      | Processes:                                                                              |
      |  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
      |        ID   ID                                                               Usage      |
      |=========================================================================================|
      |    0   N/A  N/A          401976      C   ./ffmpeg                               1739MiB |
      +-----------------------------------------------------------------------------------------+
      

      由上可知:
      ffmpeg 进程正常调用 NVIDIA GPU 进行编码工作。

      同时可键入并执行以下命令,以循环打印输出 NVIDIA GPU 各硬件单元的使用率信息:

      nvidia-smi dmon
      
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐