自编译支持CUDA硬解的OPENCV和FFMPEG

本文详细描述了如何在鲲鹏主机上安装OpenCV、FFMPEG和NvidiaCodecSDK,以及如何针对TeslaT4GPU进行CUDA编译,以便在RTSP流上实现视频解码和处理的代码示例。
摘要由CSDN通过智能技术生成

1 整体思路

查阅opencv的官方文档,可看到有个cudacodec扩展,用他可方便的进行编解码。唯一麻烦的是需要自行编译opencv。
同时,为了考虑后续方便,顺手编译了FFMPEG,并将其与OPENCV绑定。
在之前的博文“鲲鹏主机+昇腾Atlas 300I Pro+龙蜥8.6 全国产化主机使用NPU推理YoloV5环境安装全过程”中已经干过一次了,类似的来搞一把。

2 准备环境

2.1 安装CMake

同之前的博文,CMake官网下载后安装

./cmake-3.29.0-rc4-linux-aarch64.sh --skip-license --prefix=/usr

2.2 安装nv-codec-headers(可选)

如果不需要FFMPEG,可以无视这步。
注意他对CUDA版本和驱动版本的依赖。所以需要根据本机版本选择合适的分支。
官网传送门

以笔者本机为例,可见驱动版本为510.39.01,CUDA版本为11.6:

$ nvidia-smi 
Mon Apr 15 01:30:12 2024       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.39.01    Driver Version: 510.39.01    CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| 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  Tesla T4            On   | 00000000:01:00.0 Off |                    0 |
| N/A   54C    P0    28W /  70W |    303MiB / 15360MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A   1492699      C   /usr/local/bin/ollama             301MiB |
+-----------------------------------------------------------------------------+

那么选择11.1版本是合适的。同时Video Codec SDK的版本为11.1.5。

在这里插入图片描述
安装比较简单,常规的make && make install 即可。

2.3 安装Nvidia Codec SDK

官网传送门在此

注意他对CUDA版本和驱动版本的依赖,以及nv-codec-headers 对他版本的依赖。因此不能无脑下最新的,需要由此寻找合适的历史版本。
下载完的压缩包中的Read_Me.pdf中有详细的版本要求介绍,也可以根据nv-codec-headers里要求的版本型号进行处理。(应当是一致的)

在这里插入图片描述
解压后,将Interface目录下的头文件,拷贝到你的CUDA安装目录即可,默认路径为/usr/local/cuda/include。千万不要去理那些动态库,那个是配套他的测试DEMO编译用的,可以不用管。

2.4 签出opencv和opencv-contrib

统一使用最近的4.9.0的tag

export GIT_SSL_NO_VERIFY=true
git clone https://github.com/opencv/opencv.git
cd opencv
git checkout 4.9.0
cd ..
git clone https://github.com/opencv/opencv_contrib.git
git checkout 4.9.0
cd ..

3 编译安装

3.1 FFMPEG

可以直接用Video Codec SDK里面配套的FFMPEG 4.4,避免不必要的麻烦

cd Video_Codec_SDK_11.1.5/Samples/External/FFmpeg/src
unzip ffmpeg-4.4.zip
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${PKG_CONFIG_PATH}
./configure --enable-shared --enable-pic --enable-cuda --enable-cuvid --enable-nvenc --enable-nvdec --enable-nonfree --enable-libnpp --extra-cflags=-I/usr/local/cuda/include/ --extra-ldflags=-L/usr/local/cuda/lib64/
make && make install

测试转码,如果没啥报错且文件可用,就表示OK了。

ffmpeg -c:v h264_cuvid -i old.mp4 -c:v h264_nvenc new.mp4

3.2 编译OPENCV

在编译之前,需要先查阅Nvidia官网获得你的cuda_arch_bin版本。以笔者本机为例。Tesla T4的数值为7.5
在这里插入图片描述

cd opencv
mkdir build
cd build
cmake -D WITH_FFMPEG=ON \
-D FFMPEG_INCLUDE_DIRS=/usr/local/include \
-D FFMPEG_LIBRARIES="/usr/local/lib/libavcodec.so;/usr/local/lib/libavformat.so;/usr/local/lib/libavutil.so;/usr/local/lib/libswscale.so;/usr/local/lib/libswresample.so" \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
-D WITH_CUDA=ON -D WITH_CUDACODEC=ON \
-D CUDA_ARCH_BIN=7.5 \
-D BUILD_opencv_python3=yes -D BUILD_opencv_python2=no \
-D PYTHON3_EXECUTABLE=/root/miniconda3/bin/python3.11 \
-D PYTHON3_INCLUDE_DIR=/root/miniconda3/include/python3.11/ \
-D PYTHON3_LIBRARY=/root/miniconda3/lib/libpython3.11.so \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/root/miniconda3/lib/python3.11/site-packages/numpy/core/include/ -D PYTHON3_PACKAGES_PATH=/root/miniconda3/lib/python3.11/site-packages \
-D PYTHON3_DEFAULT_EXECUTABLE=/root/miniconda3/bin/python3.11 \
..
make 
make install

如果需要图形化交互,还需要准备一些系统库

yum install gtk2-devel 

4 代码示例

import cv2

if __name__ == '__main__':
	rtsp_url = 'rtsp://admin:123456@192.168.1.100/'
	decoder = cv2.cudacodec.createVideoReader(rtsp_url)
	#不设置的化默认是BGRA,为了方便后续处理,指定为BGR
	decoder.set(cv2.cudacodec.COLOR_FORMAT_BGR)
	count = 0
	while True:
		ret,gpu_frame = decoder.nextFrame()
		if ret :
			frame = gpu_frame.download()
			if count == 0 :
				cv2.imwrite('test_img.bmp', frame)
			frame_queue.append(np.array(frame[:, :, ::-1]))
			count += 1
  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用FFmpeg编译h265带硬解是一项比较复杂的过程,需要了解一些有关编译的知识和操作方法。首先需要准备好编译环境,包括相应的工具链和库文件。其次需要下载FFmpeg的源代码并进行配置和编译。在配置时需要加入相应的选项,以启用h265的硬件解码功能。具体的操作方法如下: 1.准备编译环境 首先需要安装相应的编译工具和库文件,比如GCC、make、x264、yasm等。以Ubuntu系统为例,可以通过以下命令来安装: sudo apt-get install build-essential git-core checkinstall yasm texi2html libvorbis-dev libx11-dev libvpx-dev \ libxext-dev libxfixes-dev zlib1g-dev pkg-config nasm libmp3lame-dev libopus-dev 2.下载并配置FFmpeg源代码 可以从FFmpeg官网或者Github上下载最新版源代码,并解压到本地。然后在命令行中进入FFmpeg源代码所在的目录,执行以下命令进行配置和编译: ./configure --enable-gpl --enable-libx265 --enable-nonfree --enable-libfdk-aac --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libfreetype --enable-libfontconfig --enable-libass 3.编译并安装 执行完以上命令后,在同级目录会生成一个Makefile文件,可以使用make命令进行编译编译完成后,可以使用checkinstall命令来将生成的二进制文件打包安装。 sudo checkinstall --pkgname=ffmpeg --pkgversion="$(date +%Y%m%d%H%M)git" --backup=no --deldoc=yes --fstrans=no --default 以上就是使用FFmpeg编译h265带硬解的基本过程,需要注意的是,由于硬解需要依赖具体的硬件设备,因此在不同的平台上可能会存在一些细节上的差异。如果遇到问题,可以参考FFmpeg的官方文档或者社区中的相关讨论进行解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值