如何编译ffmpeg支持Nvidia显卡GPU加速

如何编译ffmpeg支持Nvidia显卡GPU加速

如何编译ffmpeg支持Nvidia显卡GPU加速

先来展示编译后的版本及参数信息如下:

$ ffmpeg -version
ffmpeg version n4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 9.3.0 (GCC)
configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --incdir=/usr/include/ffmpeg --enable-nonfree --enable-opengl --enable-cuda-nvcc --enable-cuvid --enable-nvenc --enable-libnpp --nvcc=/usr/local/cuda/bin/nvcc --nvccflags='-gencode arch=compute_35,code=sm_35 -O2' --extra-ldflags='-L/usr/local/cuda/lib64 ' --extra-libs='-lpthread -lm ' --extra-cflags=' -I/usr/local/cuda/include -fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -g' --optflags='-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -g' --disable-htmlpages --enable-pic --disable-stripping --enable-shared --disable-static --enable-gpl --disable-openssl --enable-libcdio --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libcelt --enable-libcdio --enable-libdc1394 --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libzimg --enable-libzvbi --enable-vaapi --enable-vdpau --enable-libx264 --enable-libx265 --enable-libxvid
libavutil      56. 51.100 / 56. 51.100
libavcodec     58. 91.100 / 58. 91.100
libavformat    58. 45.100 / 58. 45.100
libavdevice    58. 10.100 / 58. 10.100
libavfilter     7. 85.100 /  7. 85.100
libswscale      5.  7.100 /  5.  7.100
libswresample   3.  7.100 /  3.  7.100
libpostproc    55.  7.100 / 55.  7.100

安装Nvidia的CUDA工具包

编译ffmpeg其实并不复杂,只需要安装好所有依赖库,再设定好支持选项和安装路径信息即可,总会有人对我说“说着简单做起来难”,对于第一次尝试编译FFmpeg的朋友这肯定有些不知所措,因此就找到了这里,接下来我们就来介绍下主要的过程:

为了支持Nvidia显卡GPU加速,编译前需要下载cuda_toolkitNvidia的CUDA工具包,下载地址(需要登录),你也可以不登录,使用下面的网络源信息。

选择好自己的操作系统、架构、发行版本、版本号和安装类型(建议选择网络安装(network),节省很多不必要的软件包下载时间),按照提示命令进行安装操作即可。
下面是我的openSUSE 15.3 配置的源:

sudo zypper addrepo https://developer.download.nvidia.com/compute/cuda/repos/opensuse15/x86_64/cuda-opensuse15.repo
sudo zypper refresh
sudo zypper install -y cuda

如果你是CentOS-8系统,可以选择的网络源:

sudo dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo
sudo dnf clean all
sudo dnf -y module install nvidia-driver:latest-dkms
sudo dnf -y install cuda

## 下载到本地安装包
wget https://developer.download.nvidia.com/compute/cuda/11.4.1/local_installers/cuda-repo-rhel8-11-4-local-11.4.1_470.57.02-1.x86_64.rpm
sudo rpm -i cuda-repo-rhel8-11-4-local-11.4.1_470.57.02-1.x86_64.rpm
sudo dnf clean all
sudo dnf -y module install nvidia-driver:latest-dkms
sudo dnf -y install cuda

如果是Ubuntu20.04系统,配置网络源如下:

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /"
sudo apt-get update
sudo apt-get -y install cuda

当然也有Fedora的配置网络源:

sudo dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/fedora34/x86_64/cuda-fedora34.repo
sudo dnf clean all
sudo dnf -y module install nvidia-driver:latest-dkms
sudo dnf -y install cuda

当然Windows的下载安装包如下:

# 离线安装包,2.5GB 左右
https://developer.download.nvidia.com/compute/cuda/11.4.1/local_installers/cuda_11.4.1_471.41_win10.exe

# 网络安装报,50MB左右
https://developer.download.nvidia.com/compute/cuda/11.4.1/network_installers/cuda_11.4.1_win10_network.exe

如果上面没有适合你的操作系统源,可以访问这个链接: https://developer.download.nvidia.com/compute/cuda/repos/ ,寻找适合自己操作系统和系统架构的网络源,省去了登录过程。

当安装好后,可以进行FFmpeg的编译了。

这里我要说一下是,我的openSUSE 15.2按照说明安装了cuda工具包后,也自动给我安装了提供的显卡驱动包,这个显卡驱动包不适合我当前GTX 1060显卡(导致重启后无法进入桌面系统),因此我在重启后的虚拟控制台下使用root用户重新的安装了Nvidia官网最新的驱动包,再次重启正常进入桌面。

编译FFmpeg

接下来操作步骤如下:

mkdir ~/ffmpeg_src
cd ~/ffmpeg_src
# 安装 ffnvcodec
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers && sudo make install && cd –

# 获取ffmpeg 源码
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg/
cd ffmpeg/

sudo zypper in -y libgsm-devel libmp3lame-devel libgnutlsxx-devel ladspa-devel libass-devel libbluray-devel libcelt-devl libdc1394-devel openjpeg-devel openjpeg2-devel libopus-devel speex-devel  libtwolame-devel libvidstab-devel libvorbis-devel libvpx-devel libwebp-devel libx265-devel libxvidcore-devel zimg-devel zvbi-devel libcdio-devel cdparanoia-devel libcdio-paranoia-devel libva-devel libvdpau-devel

# 选择一个特定版本代码库:例如 tag为 n4.3.1版本

git checkout n4.3.1

# 配置支持的选项 FFmpeg4.xx版本编译用
./configure --prefix=/prod/ffmpeg --libdir=/prod/ffmpeg/lib64 --shlibdir=/prod/ffmpeg/lib64 --incdir=/prod/ffmpeg/include --enable-nonfree  --enable-opengl --enable-cuda-nvcc --enable-cuvid --enable-nvenc --enable-libnpp \
    --nvcc="/usr/local/cuda/bin/nvcc" \
    --nvccflags="-gencode arch=compute_35,code=sm_35 -O2" \
    --extra-ldflags="-L/usr/local/cuda/lib64 " \
    --extra-libs="-lpthread -lm " \
    --extra-cflags=' -I/usr/local/cuda/include -fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -g' \
    --optflags='-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -g' \
    --disable-htmlpages --enable-pic --disable-stripping --enable-shared --disable-static --enable-gpl --disable-openssl \
    --enable-libcdio --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libcelt \
    --enable-libcdio --enable-libdc1394 --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libopenjpeg \
    --enable-libopus --enable-libpulse --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab \
    --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libzimg --enable-libzvbi --enable-vaapi --enable-vdpau --enable-libx264 --enable-libx265 --enable-libxvid


make -j$(nproc)
make install

这里需要您自己为你的系统提前安装好gcc 9.3.0编译器,这里省略了gcc9的编译安装过程,你可以直接执行sudo zypper in gcc9来安装系统提供的安装包。
其次这些启动的支持库都需要您额外的安装他们的开发库,在openSUSE中,例如--enable-libtheora我们可以这样查找库:

$ zypper se theora
正在加载软件源数据...
正在读取已安装的软件包...

S  | 名称                      | 摘要                                          | 类型
---+---------------------------+-----------------------------------------------+---------
i+ | libtheora-devel           | Theora video compression codec                | 软件包

$ sudo zypper in -y libtheora-devel

查找到带devel的软件包,安装它就可以了,在执行./configure的配置过程报错提示缺少什么就安装什么就可以了。

如果您想要安装到但前用户的/prod/ffmpeg/目录下,那么配置信息如下:

./configure --prefix=/prod/ffmpeg --libdir=/prod/ffmpeg/lib64 --shlibdir=/prod/ffmpeg/lib64 --incdir=/prod/ffmpeg/include --enable-nonfree  --enable-opengl --enable-cuda-nvcc --enable-cuvid --enable-nvenc --enable-libnpp \
    --nvcc="/usr/local/cuda/bin/nvcc" \
    --nvccflags="-gencode arch=compute_35,code=sm_35 -O2" \
    --extra-ldflags="-L/usr/local/cuda/lib64 " \
    --extra-libs="-lpthread -lm " \
    --extra-cflags=' -I/usr/local/cuda/include -fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -g' \
    --optflags='-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -g' \
    --disable-htmlpages --enable-pic --disable-stripping --enable-shared --disable-static --enable-gpl --disable-openssl \
    --enable-libcdio --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libcelt \
    --enable-libcdio --enable-libdc1394 --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libopenjpeg \
    --enable-libopus --enable-libpulse --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab \
    --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libzimg --enable-libzvbi --enable-vaapi --enable-vdpau --enable-libx264 --enable-libx265 --enable-libxvid

如果编译FFmpeg3.xx版本时,编译配置信息如下:

./configure --prefix=/prod/ffmpeg --libdir=/prod/ffmpeg/lib64 --shlibdir=/prod/ffmpeg/lib64 --incdir=/prod/ffmpeg/include --enable-nonfree  --enable-opengl --enable-cuda-sdk --enable-cuvid --enable-nvenc --enable-libnpp \
    --nvcc="/usr/local/cuda/bin/nvcc" \
    --nvccflags="-gencode arch=compute_35,code=sm_35 -O2" \
    --extra-ldflags="-L/usr/local/cuda/lib64 " \
    --extra-libs="-lpthread -lm " \
    --extra-cflags=' -I/usr/local/cuda/include -fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -g' \
    --optflags='-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -g' \
    --disable-htmlpages --enable-pic --disable-stripping --enable-shared --disable-static --enable-gpl --disable-openssl \
    --enable-libcdio --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libcelt \
    --enable-libcdio --enable-libdc1394 --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libopenjpeg \
    --enable-libopus --enable-libpulse --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab \
    --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libzimg --enable-libzvbi --enable-vaapi --enable-vdpau --enable-libx264 --enable-libx265 --enable-libxvid

同时在安装时需要使用sudo make install

执行到这里就完成了FFmpeg的编译和安装了。

验证ffmpeg支持GPU

使用nvidia-smi命令查看GPU使用信息:

$ nvidia-smi    
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.27.04    Driver Version: 460.27.04    CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce GTX 106...  Off  | 00000000:01:00.0  On |                  N/A |
| 43%   35C    P0    26W / 120W |    577MiB /  6070MiB |      3%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A       598      G   ...e/Steam/ubuntu12_32/steam       31MiB |
|    0   N/A  N/A       610      G   ./steamwebhelper                    1MiB |
|    0   N/A  N/A       633      G   ...token=3008997391804195517       52MiB |
|    0   N/A  N/A      2861      G   /usr/bin/X                        311MiB |
|    0   N/A  N/A      2672      C   ffmpeg                            219MiB |
|    0   N/A  N/A      3035      G   /usr/bin/kwin_x11                  51MiB |
|    0   N/A  N/A      3037      G   /usr/bin/plasmashell               70MiB |
|    0   N/A  N/A     17744      G   ...oken=11895183376203545340       43MiB |
|    0   N/A  N/A     19266      G   ...AAAAAAAA== --shared-files        7MiB |
+-----------------------------------------------------------------------------+

启用GPU加速视频转码处理方法如下,我们以将一个1080p的视频转为720p视频为例:

$ time ffmpeg -y -c:v h264 -i input.mp4 -c:a copy -vf scale=1280:720 -c:v h264 -b:v 5M  output-1.mp4
$ time ffmpeg -y -hwaccel cuvid -c:v h264_cuvid -i  input.mp4 -c:a copy -vf scale_npp=1280:720 -c:v h264_nvenc -b:v 5M  output-2.mp4

其中:
- -hwaccel cuvid : 启用cuvidGPU硬件解码器加速,可以使用ffmpeg -hwaccels查看支持的加速器方法列表。
- -c:v h264_cuvid : 使用GPU硬件加速H264解码器,查看解码器高级选项:ffmpeg -h decoder=h264_cuvid
- -vf scale_npp=1280:720: 使用scale_nppGPU加速缩放过滤器转换为720p分辨率视频。
- -c:v h264_nvenc : 使用GPU硬件加速H264编码器,查看编码器高级选项:ffmpeg -h encoder=h264_nvenc
- -b:v 5M : 设置视频输出比特率为5Mbps,直播时比特率会影响视频的流畅度,比特率越大对带宽的要求越高。

执行结果:

ffmpeg -y -c:v h264 -i input.mp4 -c:a copy -vf scale=1280:720 -c:v h264 -b:v   619.80s user 2.87s system 997% cpu 1:02.45 total
ffmpeg -y -hwaccel cuvid -c:v h264_cuvid -i input.mp4 -c:a copy -vf  -c:v   5  2.89s user 2.21s system 36% cpu 14.154 total

-rw-r--r-- 1 test users 118M 12月 27 12:33 input.mp4
-rw-r--r-- 1 test users  81M 12月 27 12:34 output-1.mp4
-rw-r--r-- 1 test users  77M 12月 27 12:35 output-2.mp4

可以看到GPU加速可以前后的效果差异,一个118MB的视频,使用GPU处理用时14.154秒,而CPU(6c/12t)处理用时62.45秒。

下面列举了一些ffmpeg格式转换的示例

# 视频调整为720p分辨率,获取scale_npp高级选项: ffmpeg -h filter=scale_npp
ffmpeg -vsync 0 –hwaccel cuvid -c:v h264_cuvid -i input.mp4 -c:a copy –vf scale_npp=1280:720:interp_algo=super -c:v h264_nvenc -b:v 5M output_720.mp4

# 视频格式转换-使用DNxHD编解码器将mp4转为mov(适用于达芬奇视频处理软件), 音频采样率转为48KH
ffmpeg -i input.mp4 -c:v dnxhr -vf "scale=1920:1080,fps=film,format=yuv422p" -profile:v dnxhr_hq -c:a pcm_s24le -ar 48000 output.mov

# 使用h264编码器将mov格式转换为mp4格式
ffmpeg -hwaccel cuvid -i  C0070.mov -vcodec h264_nvenc -b:v 15M -acodec libmp3lame -b:a 192k output.mp4

cudacuvid有什么区别

  • CUDA(NVENC / NVDEC): NVENCNVDEC是NVIDIA的硬件加速编码和解码API。他们曾经被称为CUVID。它们可用于Windows和Linux上的编码和解码。FFmpeg将NVENC/NVDEC称为CUDA
  • CUVID : NVIDIA提供了对CUDA的扩展,称为CUVID,它仅访问硬件解码器LAV CUVID唯一不幸的方面是它仅限于NVIDIA GPUNVIDIA Video Decoder在CUDA 9.2中已弃用;现在可以在NVIDIA Video Codec SDK中使用。

可以这样理解,CUVID是指Nvidia的GPU硬件解码器,而CUDA是包含了编码器NVENC和解码器NVDEC。在最新版本FFmpeg4.3.1中,编译支持cuvidcuda后,你可以看到ffmpeg -hwaccels显示的硬件加速方法变成了cuda了(FFmpeg3.xx版本中名称还是cuvid),硬件编码器的名字是以_nvenc结尾,硬件解码器的名字是以_cuvid结尾,可执行ffmpeg -codecs显示编解码器列表。

转载本文时请注明出处及本文链接地址如何编译ffmpeg支持Nvidia显卡GPU加速

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注