在英伟达 GPU 上使用 FFMPEG

dar*_*rox 3 linux gpu ffmpeg mp4box ubuntu

我有大约 1400 个.mp4视频文件,我必须重新编码所有内容才能使用mp4boxDASH 中转换它

CPU:英特尔® 酷睿™ i7-6700 四核 Skylake
GPU:GeForce® GTX 1080
内存:64GB
Ubuntu 18.04

运行后:apt-get install ffmpeg,我无法使用-c:v h264_nvenc,出现如下错误:未知编码器“h264_nvenc”

我阅读了网络上的所有指南以在我的服务器上正确安装 nvidia 编解码器,但旧指南不适用于我的服务器。

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

谢谢你。

Den*_*gai 11

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

对于构建:

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

构建平台:Ubuntu 18.04LTS

目标:生成一个 FFmpeg 构建,它可以在 Ubuntu 18.04LTS+ 上利用 NVENC 和所有可用的基于 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-*
Run Code Online (Sandbox Code Playgroud)

创建工作区:

sudo mkdir -p /opt/ffmpeg
mkdir -p ~/ffmpeg_sources
Run Code Online (Sandbox Code Playgroud)

安装 CUDA 10 SDK:

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

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update && sudo apt-get -y upgrade
Run Code Online (Sandbox Code Playgroud)

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

sudo apt-get install nvidia-kernel-source-430 nvidia-driver-430
Run Code Online (Sandbox Code Playgroud)

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

sudo apt install nvidia-headless-430 nvidia-utils-430 libnvidia-common-430 libnvidia-encode-430 libnvidia-decode-430 libnvidia-fbc1-430
Run Code Online (Sandbox Code Playgroud)

我们将设备驱动程序保持为最新版本,以便通过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
Run Code Online (Sandbox Code Playgroud)

您会发现我们正在使用二进制安装程序。这对于那些使用无头系统(没有 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
Run Code Online (Sandbox Code Playgroud)

现在,在 PATH 变量中添加以下内容:

/usr/local/cuda/bin:/opt/ffmpeg/bin
Run Code Online (Sandbox Code Playgroud)

完成后,请记住源文件:

source /etc/environment
Run Code Online (Sandbox Code Playgroud)

然后继续。

关于 NVENC 启用:

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

/usr/local/cuda/bin:/opt/ffmpeg/bin
Run Code Online (Sandbox Code Playgroud)

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

根据需要包括额外的组件:

(一种)。构建和部署 nasm: 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
Run Code Online (Sandbox Code Playgroud)

(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
Run Code Online (Sandbox Code Playgroud)

(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
Run Code Online (Sandbox Code Playgroud)

(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
Run Code Online (Sandbox Code Playgroud)

(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
Run Code Online (Sandbox Code Playgroud)

(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
Run Code Online (Sandbox Code Playgroud)

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

source /etc/environment
Run Code Online (Sandbox Code Playgroud)

然后运行:

cd ~/ffmpeg_sources
git clone https://github.com/FFmpeg/nv-codec-headers
cd nv-codec-headers
make
sudo make install PREFIX="/opt/ffmpeg_build"
Run Code Online (Sandbox Code Playgroud)

然后继续。

(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
Run Code Online (Sandbox Code Playgroud)

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