为OpenCV启用NVIDIA GPU加速视频解码
将CPU从高负载中解放出来
如今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编译指南:
按照该指南,你需要首先安装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
至此第一步结束。