环境
- 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的什么,但如下尝试是成功的:
- 编译时仅安装cuda-toolkit(没有安装驱动),可以正常编译
- 编译完成卸载cuda-toolkit,安装cuda-runtime(包含了驱动),可以正常运行。
- 官方安装指导看这里
- 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倍速
附:踩坑总结
- 重视最低版本的要求。
- 虽然不被官方建议,但使用cuda自带的驱动是最省事的安装方式。
附:安装Nvidia驱动
- 使用rpmfusion-nonfree安装
sudo dnf install akmod-nvidia sudo dnf install xorg-x11-drv-nvidia-cuda reboot
- 或者使用CUDA Package安装
- 或者从官网下载安装