将 FFMPEG 与 Nvidia GPU 结合使用

将 FFMPEG 与 Nvidia GPU 结合使用

我有大约 1400.mp4视频文件,我必须重新编码所有内容才能使用mp4盒将其转化为短跑

CPU:Intel® Core™ i7-6700 四核 Skylake
GPU:GeForce® GTX 1080
内存:64GB
Ubuntu 18.04

运行apt-get install ffmpeg后,我无法使用-c:v h264_nvenc,我收到如下错误:未知编码器‘h264_nvenc’

我阅读了网络上的每一个指南,以便在我的服务器上正确安装 nvidia 编解码器,但是旧指南并不适用于我的服务器。

您能帮我找到一种新的、正确的安装方法吗?

谢谢。

答案1

在您的案例中,您需要从源代码构建 FFmpeg。使用下面显示的示例。有关您可以使用当前一代支持 NVENC 的 NVIDIA GPU 实现的受支持和可用的硬件加速功能,请参阅回答。

对于构建:

FFmpeg 使用 NVENC 和 Ubuntu 18.04LTS 上所有可用的基于 CUDA 的过滤器构建:

构建平台:Ubuntu 18.04LTS

目标:生成一个 FFmpeg 版本,该版本可以利用 NVENC 和 Ubuntu 18.04LTS+ 上所有可用的基于 CUDA 的过滤器。该版本将以 为前缀/opt

确保平台是最新的:

sudo apt update && sudo apt -y upgrade && sudo apt -y dist-upgrade

首先安装基线依赖项(包括 OpenCL 标头+)

sudo apt-get -y install autoconf automake build-essential libass-dev \
libtool libssl-dev \
pkg-config texinfo zlib1g-dev cmake mercurial libbz2-dev rtmpdump librtmp-dev libunistring2 libunistring-dev opencl-headers ocl-icd-*

创建工作区:

sudo mkdir -p /opt/ffmpeg
mkdir -p ~/ffmpeg_sources

安装 CUDA 10 SDK:

确保您拥有最新的驱动程序:

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update && sudo apt-get -y upgrade

在 Ubuntu 18.04LTS 桌面上,这对于当前的设备驱动程序来说应该足够了:

sudo apt-get install nvidia-kernel-source-430 nvidia-driver-430

在 Ubuntu 18.04LTS 服务器系统上,这将执行:

sudo apt install nvidia-headless-430 nvidia-utils-430 libnvidia-common-430 libnvidia-encode-430 libnvidia-decode-430 libnvidia-fbc1-430

我们保持设备驱动程序为最新版本,以便通过ffnvcodec驱动程序版本检查。最好先确认最新的驱动程序版本。请通过检查此处的存储库来确认:https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa

首先获取 SDK 二进制安装程序:

cd ~/ffmpeg_sources
wget -c -v -nc https://developer.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.168_418.67_linux.run
chmod +x ./cuda_10.1.168_418.67_linux.run
./cuda_10.1.168_418.67_linux.run

您会发现我们正在使用二进制安装程序。这对于使用无头系统(没有 X)的用户最有用,因为它将安装 CUDA 而不会引入不必要的依赖项。

您也可以使用 NVIDIA 为 Ubuntu 提供的官方 CUDA 存储库,但我不推荐它,因为它引入了许多不必要的软件包。

确认 CUDA 库的库配置文件也存在且设置正确:

/etc/ld.so.conf.d/cuda.conf

内容应该是:

/usr/local/cuda/lib64

完成后,加载新配置:

sudo ldconfig -vvvv

现在,设置 CUDA 的环境变量:

编辑/etc/environment文件并附加以下内容:

CUDA_HOME=/usr/local/cuda

现在,将以下内容附加到 PATH 变量中:

/usr/local/cuda/bin:/opt/ffmpeg/bin

完成后,记得获取文件:

source /etc/environment

然后继续。

关于 NVENC 启用:

请注意对第三方标头的包含进行了更改影响新版本,此问题已通过以下方式修复:

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

构建一个可用的 FFmpeg 二进制文件,以 /opt/ffmpeg 为前缀:

根据需要添加额外的组件:

(a). 构建并部署nasm: 纳什是 x264 和 FFmpeg 使用的 x86 优化汇编程序。强烈推荐,否则您的最终构建可能会非常慢。

请注意,我们现在已经从 Yasm 切换到 nasm,因为这是 x265、x264 等当前采用的汇编程序。

cd ~/ffmpeg_sources
wget https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.gz
tar xzvf nasm-2.14.02.tar.gz
cd nasm-2.14.02
./configure --prefix="/opt/ffmpeg_build" --bindir="/opt/ffmpeg/bin" 
make -j$(nproc) VERBOSE=1
sudo make -j$(nproc) install
make -j$(nproc) distclean

(b). 静态构建并部署 libx264:此库提供 H.264 视频编码器。请参阅H.264 编码指南了解更多信息和使用示例。这需要使用 来配置 ffmpeg --enable-gpl --enable-libx264

cd ~/ffmpeg_sources
git clone http://git.videolan.org/git/x264.git 
cd x264/
PATH="/opt/ffmpeg/bin:$PATH" ./configure --prefix="/opt/ffmpeg_build" --enable-static --enable-shared
PATH="/opt/ffmpeg/bin:$PATH" make -j$(nproc) VERBOSE=1
sudo make -j$(nproc) install VERBOSE=1
make -j$(nproc) distclean

(c). 构建并配置 libx265:此库提供 H.265/HEVC 视频编码器。请参阅H.265 编码指南了解更多信息和使用示例。

cd ~/ffmpeg_sources
git clone https://bitbucket.org/multicoreware/x265_git.git
cd ~/ffmpeg_sources/x265/build/linux
PATH="/opt/ffmpeg/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="/opt/ffmpeg_build" -DENABLE_SHARED:bool=off ../../source
make -j$(nproc) VERBOSE=1
sudo make -j$(nproc) install VERBOSE=1
make -j$(nproc) clean VERBOSE=1

(d). 构建并部署 libfdk-aac 库:这提供了 AAC 音频编码器。请参阅AAC 音频编码指南了解更多信息和使用示例。这需要配置 ffmpeg --enable-libfdk-aac(并且--enable-nonfree如果您还包括--enable-gpl)。

cd ~/ffmpeg_sources
wget -O fdk-aac.tar.gz https://github.com/mstorsjo/fdk-aac/tarball/master
tar xzvf fdk-aac.tar.gz
cd mstorsjo-fdk-aac*
autoreconf -fiv
./configure --prefix="/opt/ffmpeg_build" --disable-shared
make -j$(nproc)
sudo make -j$(nproc) install
make -j$(nproc) distclean

(e). 构建并配置 libvpx:

cd ~/ffmpeg_sources
git clone https://github.com/webmproject/libvpx
cd libvpx
./configure --prefix="/opt/ffmpeg_build" --enable-runtime-cpu-detect --enable-vp9 --enable-vp8 \
--enable-postproc --enable-vp9-postproc --enable-multi-res-encoding --enable-webm-io --enable-better-hw-compatibility --enable-vp9-highbitdepth --enable-onthefly-bitpacking --enable-realtime-only --cpu=native --as=nasm 
time make -j$(nproc)
sudo time make -j$(nproc) install
time make clean -j$(nproc)
time make distclean

(f). 构建 LibVorbis:

cd ~/ffmpeg_sources
git clone https://github.com/xiph/vorbis.git
cd vorbis
autoreconf -ivf
./configure --enable-static --prefix="/opt/ffmpeg_build"
time make -j$(nproc)
sudo make -j$(nproc) install
time make clean -j$(nproc)
time make distclean

现在将新的库路径添加/opt/ffmpeg_build/lib到您的 ldconfig:

sudo su
echo /opt/ffmpeg_build/lib > /etc/ld.so.conf.d/ffmpeg.conf

然后运行:

sudo ldconfig -vvvv

然后继续。

(g). 构建 FFmpeg:

cd ~/ffmpeg_sources
git clone https://github.com/FFmpeg/FFmpeg -b master
cd FFmpeg
PATH="/opt/ffmpeg/bin:$PATH" PKG_CONFIG_PATH="/opt/ffmpeg_build/lib/pkgconfig" ./configure \
  --pkg-config-flags="--static" \
  --prefix="/opt/ffmpeg" \
  --bindir="/opt/ffmpeg/bin" \
  --extra-cflags="-I/opt/ffmpeg_build/include" \
  --extra-ldflags="-L/opt/ffmpeg_build/lib" \
  --enable-cuda-nvcc \
  --enable-cuvid \
  --enable-libnpp \
  --extra-cflags="-I/usr/local/cuda/include/" \
  --extra-ldflags=-L/usr/local/cuda/lib64/ \
  --enable-nvenc \
  --enable-libass \
  --disable-debug \
  --enable-libvorbis \
  --enable-libvpx \
  --enable-opencl \
  --enable-gpl \
  --cpu=native \
  --enable-libfdk-aac \
  --enable-libx264 \
  --enable-libx265 \
  --enable-openssl \
  --enable-librtmp \
  --extra-libs="-lpthread -lm -lz" \
  --enable-nonfree 
PATH="/opt/ffmpeg/bin:$PATH" make -j$(nproc) 
make -j$(nproc) install 
make -j$(nproc) distclean 
hash -r

由于我们添加/opt/ffmpeg/bin到了系统路径,因此您可以直接调用FFmpeg。

答案2

在 (f). 构建 LibVorbis:

https://git.xiph.org/vorbis.git改成https://github.com/xiph/vorbis.git

并添加基线依赖项:

libogg-dev,需要 LibVorbis

答案3

在 (c) 中:构建和配置 libx265
替换hg clone https://bitbucket.org/multicoreware/x265git clone https://bitbucket.org/multicoreware/x265_git.git适合我。

在安装 NVEnc 时,你可以 git clone 其他版本以适合你的 cuda 版本。例如https://github.com/FFmpeg/nv-codec-headers/tree/sdk/9.0

相关内容