环境

  • Fedora release 33
  • Nvidia GeForce RTX 2060

跟Nvidia相关的准备

ffmpeg-with-nvidia-gpu有详细的安装说明,要编译含有Nvidia编解码器的FFmpeg,需要安装:

  • CUDA toolkit

    • 通过官网提供的CUDA Package安装是最省事的。全部安装空间很大。对cuda不太懂,官网下载的11-1版本的Package包含如下meta packages:

      • cuda: Installs all CUDA Toolkit and Driver packages. Handles upgrading to the next version of the cuda package when it's released.
      • cuda-11-1: Installs all CUDA Toolkit and Driver packages. Remains at version 11.1 until an additional version of CUDA is installed.
      • cuda-toolkit-11-1:Installs all CUDA Toolkit packages required to develop CUDA applications. Does not include the driver.
      • cuda-tools-11-1 Installs all CUDA command line and visual tools.
      • cuda-runtime-11-1 Installs all CUDA Toolkit packages required to run CUDA applications, as well as the Driver packages.
      • cuda-compiler-11-1 Installs all CUDA compiler packages.
      • cuda-libraries-11-1 Installs all runtime CUDA Library packages.
      • cuda-libraries-dev-11-1 Installs all development CUDA Library packages.
      • cuda-drivers Installs all Driver packages. Handles upgrading to the next version of the Driver packages when they're released.
    • 完全安装cuda很占空间,不是非常确定编译和运行ffmpeg时具体依赖cuda的什么,但如下尝试是成功的:

  • nv-codec-header

    • nv-codec-header
    • FFmpeg维护的用作同Nvidia编解码器API协同的头文件
    • nvcodecheader会对应一个版本的Nvidia Video Codec SDK,SDK所要求的最低驱动版本必须满足。用户编译不会直接使用SDK,而是需要nvcodecheader

确定版本关系

  • 参考nvcodeheader文档当前最新的nvcodecheader适配的是Video Codec SDK 11.0.10,需要的显卡驱动最低版本是455.28
  • 参考Video Codec SDK文档当前最新的CUDA toolkit版本是 11, 适配的Cuda toolkit版本是11。
  • 参考Cuda toolkit download,没有Fedora33的版本,使用Fedora32的替代,可下载的最新版本是Cuda toolkit 11.1.1,匹配的驱动版本是455.32。

综上,nvcodeheader当前的最新版跟cuda tookit fedora32最新版适配。编译完成后再安装455.32版本的驱动。经验建议不要侥幸尝试低版本的驱动。

安装cuda toolkit

还没有Fedora33的Package,用32的替代一下

  • 参考Cuda toolkit download
  • 安装CUDA Package Repository
    sudo dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/fedora32/x86_64/cuda-fedora32.repo
  • 安装CUDA toolkit
    sudo dnf -y install cuda-toolkit-11-1
  • 将bin文件夹加入PATH
    PATH="/usr/local/cuda/bin:$PATH"

安装nv-codec-header

这实际上是编译安装FFmpeg的部分了,归并到下面

编译FFmpeg

主要参考文档Compile FFmpeg on CentOS

准备工作

创建文件夹用作编译期间使用(主要为了规整)

ffmpeg/
|-- ffmpeg_sources/
|-- ffmpeg_build/    
|-- bin/             

将ffmpeg_build和bin的路径声明为环境变量方便使用

~/.bashrc:
FFMPEG_BUILD="path/to/ffmpeg_build"
FFMPEG_BIN="path/to/bin"

编译NASM

cd ~/ffmpeg_sources
curl -O -L https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.bz2
tar xjvf nasm-2.14.02.tar.bz2
cd nasm-2.14.02
./autogen.sh
./configure --prefix="$FFMPEG_BUILD" --bindir="$FFMPEG_BIN"
make
make install

编译 Yasm

cd ~/ffmpeg_sources
curl -O -L https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar xzvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure --prefix="$FFMPEG_BUILD" --bindir="$FFMPEG_BIN"
make
make install

编译x264

cd ~/ffmpeg_sources
git clone --depth 1 https://code.videolan.org/videolan/x264.git
cd x264
PKG_CONFIG_PATH="$FFMPEG_BUILD/lib/pkgconfig" ./configure --prefix="$FFMPEG_BUILD" --bindir="$FFMPEG_BIN" --enable-static
make
make install

编译x265

参考中的下载地址失效,换了git库

cd ~/ffmpeg_sources
git clone https://bitbucket.org/multicoreware/x265_git
cd ~/ffmpeg_sources/x265/build/linux
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$FFMPEG_BUILD" -DENABLE_SHARED:bool=off ../../source
make
make install

libfdk_aac

cd ~/ffmpeg_sources
git clone --depth 1 https://github.com/mstorsjo/fdk-aac
cd fdk-aac
autoreconf -fiv
./configure --prefix="$FFMPEG_BUILD" --disable-shared
make
make install

libmp3lame

cd ~/ffmpeg_sources
curl -O -L https://downloads.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz
tar xzvf lame-3.100.tar.gz
cd lame-3.100
./configure --prefix="$FFMPEG_BUILD" --bindir="$FFMPEG_BIN" --disable-shared --enable-nasm
make
make install

libopus

cd ~/ffmpeg_sources
curl -O -L https://archive.mozilla.org/pub/opus/opus-1.3.1.tar.gz
tar xzvf opus-1.3.1.tar.gz
cd opus-1.3.1
./configure --prefix="$FFMPEG_BUILD" --disable-shared
make
make install

libvpx

使用了github的镜像源

cd ~/ffmpeg_sources
git clone --depth 1 https://github.com/webmproject/libvpx.git
cd libvpx
./configure --prefix="$FFMPEG_BUILD" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm
make
make install

nv-codec-header

cd ~/ffmpeg_sources
git clone https://github.com/FFmpeg/nv-codec-headers
cd nv-codec-headers
make
sudo make install PREFIX="$FFMPEG_BUILD"

Compile FFmpeg

curl -O -L https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
tar xjvf ffmpeg-snapshot.tar.bz2
PATH="/usr/local/cuda/bin:$HOME/bin:$PATH" PKG_CONFIG_PATH="$FFMPEG_BUILD/lib/pkgconfig"
./configure \
    --prefix="$HOME/ffmpeg_build" \
    --pkg-config-flags="--static" \
    --extra-cflags="-I$HOME/ffmpeg_build/include" \
    --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
    --extra-libs=-lpthread \
    --extra-libs=-lm \
    --bindir="$HOME/bin" \
    --enable-gpl \ # libx264,libx265
    --enable-libfdk_aac \ # libfdc_aac (如果没有enable-gpl 则还需要enable-nonfree
    --enable-libfreetype \
    --enable-libmp3lame \ # libmp3lame
    --enable-libopus \ # libopus
    --enable-libvpx \ # libvpx
    --enable-libx264 \ # libx264
    --enable-libx265 \ # libx265
    --enable-nonfree \ # nvidia1 nvidia2
    --enable-cuda \ # nvidia2
    --enable-cudaid \ # nvidia2
    --enable-cuda-nvcc \ # nvidia1 文档中使用--enable-cuda-sdk,已经弃用,使用这个参数会直接转换为nvcc
    --enable-nvenc \ # ffmpeg-envidia nvidia2,如果nvidia驱动已安装,则这个会被默认启用
    --enable-libnpp \ # nvidia1 nvidia2
    --extra-cflags="-I/usr/local/cuda/include" \ # nvidia1 nvidia2
    --extra-ldflags="-L/usr/local/cuda/lib64" \ # nvidia1 nvidia2
make
make install

将#及之后的备注删除之后运行,对配置项也不懂

  • 标注ffmpeg-nvidia的 是参考自https://trac.ffmpeg.org/wiki/HWAccelIntro 的设置
  • 标注nvidia1 的 是参考自https://docs.nvidia.com/video-technologies/video-codec-sdk/ffmpeg-with-nvidia-gpu/ 的设置
  • 标注nvidia2 的 是参考自https://developer.nvidia.com/blog/nvidia-ffmpeg-transcoding-guide/ 的设置
  • 未标注的 是参考自https://trac.ffmpeg.org/wiki/CompilationGuide/Centos 的设置

configure报错: ERROR: failed checking for nvcc... Unsupported gpu architecture 'compute_30'。将configure文件中的 Compute_30改为Compute_52,即可解决:

if enabled cuda_nvcc; then
nvcc_default="nvcc"
nvccflags_default="-gencode arch=compute_52,code=sm_52 -O2"
else
    nvcc_default="clang"
    nvccflags_default="--cuda-gpu-arch=sm_52 -O2"
    NVCC_C=""
fi

善后

卸载cuda toolkit

sudo dnf remove cuda-toolkit-11-1

确认一下没有任何cuda-fedora32库里的存留`dnf list installed | grep "cuda-fedora32*"

安装cuda runtime

sudo dnf install cuda-runtime-11-1
reboot

测试

下载rpmfusion中的ffmpeg作为对比

ffmpeg -i input.mkv -c:a copy -c:v h264 -b:v 5M output.mp4
结果:大约1.8-2.4 的倍速

ffmpeg -vsync 0 -hwaccel cuvid -c:v h264_cuvid -i input.mkv -c:a copy -c:v h264_nvenc -b:v 5M output.mp4
结果:Unknown decoder '264_cuvid'

自编译版本

ffmpeg -i input.mkv -c:a copy -c:v h264 -b:v 5M output.mp4
结果:2的倍速

ffmpeg -vsync 0 -hwaccel cuvid -c:v h264_cuvid -i input.mkv -c:a copy -c:v h264_nvenc -b:v 5M output.mp4
结果:30倍速

附:踩坑总结

  1. 重视最低版本的要求。
  2. 虽然不被官方建议,但使用cuda自带的驱动是最省事的安装方式。

附:安装Nvidia驱动