searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

NVIDIA硬件视频编码环境的搭建流程

2023-09-20 01:58:05
39
0

基于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硬件编码环境已搭建成功,进行视频硬编码了。

 

0条评论
0 / 1000
g****n
4文章数
0粉丝数
g****n
4 文章 | 0 粉丝
原创

NVIDIA硬件视频编码环境的搭建流程

2023-09-20 01:58:05
39
0

基于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硬件编码环境已搭建成功,进行视频硬编码了。

 

文章来自个人专栏
音视频技术
4 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0