为OpenCV启用NVIDIA GPU加速视频解码

将CPU从高负载中解放出来

为OpenCV启用NVIDIA GPU加速视频解码

如今CPU的多媒体运算能力今非昔比,但是在某些特定场景下,还是需要将视频解码这样的“重活”分担给GPU去做。这篇文章记载了为OpenCV启用GPU加速解码的过程。

硬件与环境

  • GPU: Nvidia RTX 3070
  • OS: Ubuntu 18.04
  • CUDA: 11.4
  • OpenCV: 4.5.4

在正式开始之前,请确保安装了合适的驱动程序与CUDA。

实现硬件加速的整个过程大致可以分为三个阶段。

第一,编译启用CUDA支持的FFMPEG

OpenCV本身没有视频解码能力,它依赖第三方库来实现这一功能。在Linux下最常用的为FFMPEG。所以,首先要为FFMPEG启用GPU加速。

NVIDIA在官网提供了FFMPEG编译指南:

Using FFmpeg with NVIDIA GPU Hardware Acceleration :: NVIDIA Video Codec SDK Documentation

按照该指南,你需要首先安装FFMPEG解码头文件。

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers && sudo make install && cd –

然后获取FFMPEG源代码。注意OpenCV对FFMPEG有版本要求。我当前测试通过的版本为4.3.3。下方是官方给出的示例,我推荐自行获取指定版本的源码。

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg/

正式编译前,安装必要的依赖项。

sudo apt-get install build-essential yasm cmake libtool libc6 libc6-dev unzip wget libnuma1 libnuma-dev libx264-dev libx265-dev

然后开始配置编译选项。这里的选项是我根据Nvidia与FFMPEG的指南合并得到的。

./configure --enable-nonfree  --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-cflags=-fPIC  --extra-ldflags=-L/usr/local/cuda/lib64 --disable-static --enable-shared --enable-cuda --enable-cuvid --enable-nvenc  --enable-nonfree --enable-libnpp  --enable-gpl --enable-libx264  --enable-libx265  --enable-shared  --enable-libfreetype

配置完成后,开始编译。

make -j 8

编译完成后,安装到系统目录。

sudo make install

手动执行下ldconfig。

sudo ldconfig

至此第一步结束。