基于GPU进行视频转码,首先要选择一款合适的GPU,搭建一套完整的开发环境,本文以Nvidia GPU环境为例,介绍如何搭建完整的转码环境。再借助于集成了GPU转码能力的FFmpeg音视频处理方案, 完成构建硬件转码的整个环境的部署。
本文主要从以下几个步骤,来介绍Nvidia转码环境的搭建过程
- 确认机器的GPU型号。
- 安装对应版本的驱动程序。
- 解除GPU对视频转码的并发限制。
- 基于FFmpeg的编译。
(1)确认机器的GPU型号
登录机器,通过命令行 lspci | grep -i vga 来查看当前机器的GPU型号。
本示例中,GPU的型号是2504, 可以查询到GPU的详细型号:
Name: GA106 [GeForce RTX 3060 Lite Hash Rate]
(2) 确认驱动下载版本,并安装。
根据已知的GPU型号来选择对应的驱动版本号。
示例中,对应的驱动为NVIDIA-Linux-x86_64-525.89.02.run
(3)安装驱动
安装驱动的过程中,可能遇到的问题以及解决方法。
开始安装驱动 ./NVIDIA-Linux-x86_64-525.89.02.run --no-opengl-files
如果出现以上提示,需要安装对应的kernel-header
yum install kernel-devel kernel-headers -y
yum info kernel-devel kernel-headers
指定kernel header路径,继续执行安装
./NVIDIA-Linux-x86_64-525.89.02.run --no-opengl-files --kernel-source-path=/usr/src/kernels/3.10.0-1160.88.1.el7.x86_64
如果出现以下Error, 说明安装的kernel-header 和实际的kernel版本不一致。
解决方案:
首先,查看内核版本:
cat /proc/version
Linux version 3.10.0-957.27.2.el7.x86_64 (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Mon Jul 29 17:46:05 UTC 2019
其次,查看 kernel-headers 版本信息:
yum info kernel-devel kernel-headers
Name : kernel-devel
Arch : x86_64
Version : 3.10.0
Release : 1160.88.1.el7
Size : 38 M
Repo : installed
From repo : updates
Summary : Development package for building kernel modules to match the
: kernel
URL :
License : GPLv2
Description : This package provides kernel headers and makefiles sufficient to
: build modules against the kernel package.
由此,确认版本不一致。
接下来,按照以下步骤更换默认启动内核。
1.查看当前默认内核
grub2-editenv list
2.查看已有内核
cat /boot/grub2/grub.cfg |grep menuentry
3.更换默认启动内核
grub2-set-default ‘3.10.0-1160.88.1.el7.x86_64) 7 (Core)’
4. 备份并重新生成grub信息
grub2-mkconfig -o /boot/grub2/grub.cfg
5.重启系统
reboot
继续安装驱动
./NVIDIA-Linux-x86_64-525.89.02.run --no-opengl-files --kernel-source-path=/usr/src/kernels/3.10.0-1160.88.1.el7.x86_64
如果驱动安装成功,执行 nvidia-smi会显示当前GPU的状态参数
(4)解除视频转码过程中的并发限制。
默认情况下,3060卡最高限制3路转码并发, 超过3路后,ffmpeg会报错:OpenEncodeSessionEx failed: out of memory。
nvdia提供了解除并发限制的patch,可参考官方提供的patch来解决。
实际测试看,并发能力并不是无限高, 当H264并发50路时,仅成功40路, 另外10路会提示内存不足。
(5)编译FFmpeg,支持N卡的硬编码能力
下载 nv-codec-headers
从官网下载nv-codec-headers代码库
git clone完成后,注意查看本地文件README, 要与驱动 CUDA version保持一致。
make && make install
下载ffmpeg代码进行编译
需要指定编译配置:--enable-cuda、 --enable-cuvid, 其他配置项根据自己的实际情况来设置。
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$CUR_DIR/install/lib/pkgconfig:$PKG_CONFIG_PATH
./configure --prefix=$CUR_DIR/install \
--enable-gpl \
--enable-nonfree \
--disable-avdevice \
--disable-vaapi \
--enable-libx264 \
--enable-libx265 \
--enable-cuda \
--enable-cuvid \
--enable-libfreetype \
--enable-libzmq \
--enable-libfdk-aac \
--extra-cflags='-I /usr/local/include' \
--extra-cflags='-I '$CUR_DIR'/install/include' \
--extra-cflags='-I '$CUR_DIR'/install/x264/include' \
--extra-cflags='-I '$CUR_DIR'/install/x265/include' \
--extra-cflags='-I '$CUR_DIR'/install/include/freetype2' \
--extra-ldflags='-L '$CUR_DIR'/install/lib' \
--extra-ldflags='-L '$CUR_DIR'/install/x264/lib' \
--extra-ldflags='-L '$CUR_DIR'/install/x265/lib' \
--extra-ldflags='-L usr/local/lib' \
--extra-libs=" -lx264 -lx265 -lfdk-aac -lstdc++ -lbz2 -lz -ldl -lm -lrt -lpthread"
编译完成后,确认是否已集成对应的编码器。
至此, 基于FFmpeg的Nvidia硬件编码环境已搭建成功,进行视频硬编码了。