Nvidia 硬件加速的 FFMPEG

Compile

背景

Arch Linux 源里虽然提供了 GPU 加速的 FFMPEG,但它依赖于 CUDA 12,然而容器环境下宿主机驱动版本是不可控的,因此会有手动编译的需求。

这里记录一下 Conda 环境中编译时会遇到的坑。

官方这里有份有关硬件加速的简明介绍。

环境依赖

conda 下安装对应版本的 CUDA,我这里安装的 CUDA 11 以及:

  • libass
  • lame
  • opus
  • libfreetype
  • x264
  • x265
  • libvpx
  • zlib

此外还有 ffnvcodec,需要注意的是, 这里存在一个坑,FFMPEG 对于 CUDA 11 要求 ffnvcodec 版本大于等于 11.1.5.3,然而 Conda 源里 11+ 版本号最高为 11.1.5.2,而且 Arch 源里也没有😅,因此需要到官网根据你驱动的版本选择对应的release下载并 make install

另外 Conda 里也没有 fdk-aac,可以通过 pacman 安装然后复制到 Conda 的 lib 里,并修改 pkgconfig 文件中的路径。

设置环境变量包含你虚拟环境的 lib,FFMPEG 使用 pkg-config 查找 lib. 我这里是.pixi/envs/default/lib/pkgconfig

set -x PKG_CONFIG_PATH /root/codes/ffmpeg/.pixi/envs/default/lib/pkgconfig:/usr/local/lib/pkgconfig 

编译

./configure \
    --prefix=/usr/local/ffmpeg \
    --arch=x86_64 --target-os=linux \
    --enable-nonfree \
    --enable-ffnvcodec \
    --enable-cuda-llvm \
    --extra-cflags=-I/root/codes/ffmpeg/.pixi/envs/default/targets/x86_64-linux/include \
    --extra-ldflags=-L/root/codes/ffmpeg/.pixi/envs/default/targets/x86_64-linux/lib \
    --disable-static \
    --enable-shared \
    --enable-gpl \
    --enable-libass \
    --enable-libfreetype \
    --enable-libmp3lame \
    --enable-libopus \
    --enable-libfdk_aac \
    --enable-libvpx \
    --enable-libx264 \
    --enable-libx265 \
    --enable-cuvid \
    --enable-nvdec \
    --enable-nvenc \
    --enable-vaapi

网上普遍的 enable-cuda-nvcc 以及 enable-libnpp 基本已经被替代,也就是过时了。

编译

make -j8
make install

文件会被输出到 /usr/local/ffmpeg/{bin,lib,include}中,记得添加到 PATHLD_LIBRARY_PATH 环境变量或将文件移动到对应位置。 程序是动态链接到,如果需要在同环境的其他容器中使用可以通过 ldd ./ffmpeg 查找对应的 lib 文件。 这里提供一个简单的脚本:

ldd ./ffmpeg | rg '=>' |  awk '{print $3}' | rg '/root/codes/ffmpeg’ | xargs -I {} cp {} .lib/

测试一下硬件转码

ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -c:v h264_nvenc -preset slow output