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

将CPU从高负载中解放出来

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

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

硬件与环境

  • GPU: Nvidia RTX 20/30系列
  • OS: Ubuntu 20.04
  • CUDA: 11.3
  • 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 -b sdk/11.0 --depth 1 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 -b n4.3.3 --depth 1 https://git.ffmpeg.org/ffmpeg.git ffmpeg/

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

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

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

./configure \
    --prefix=/usr/local \ # 指定安装位置
    --extra-cflags=-I/usr/local/cuda/include \
    --extra-ldflags=-L/usr/local/cuda/lib64 \
    --extra-libs=-lpthread \
    --disable-static --enable-shared --enable-pic \ # 编译动态库
    --disable-ffplay \ # 服务器端可以省略显示功能
    --disable-doc \ # 省略文档
    --enable-cuda --enable-cuvid --enable-nvenc \ # 启用NVIDIA加速
    --enable-libx264 --enable-libx265 \ # 启用H264/265支持
    --enable-gpl --enable-nonfree

配置完成后,开始编译。

make -j 8

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

sudo make install

手动执行下ldconfig。

sudo ldconfig

至此第一步结束。

第二步,编译启用CUDA支持的OpenCV