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}
中,记得添加到 PATH
与 LD_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