Docker容器中编译安装VideoProcessingFramework硬解码框架教程

东方琪
2023-12-01

本文为在Ubuntu中的docker容器环境下编译VideoProcessingFramework硬解码框架的教程,记录一些在编译过程中踩过的坑。所有操作均在docker容器环境下进行。


1、版本环境

  • Video_Codec_SDK_12.0.16

  • ffmpeg-5.1

  • cuda 11.3

  • python 3.7

  • driver-470

2、创建docker容器

创建容器时要注意,要添加ENV NVIDIA_DRIVER_CAPABILITIES="video,compute,utility" ,不然在运行代码时会报错RuntimeError:/home/VideoProcessingFramework/PyNvCodec/TC/src/NvDecoder.cpp。

3、安装编译能使用GPU的ffmpeg

如果当前环境下已经安装了ffmpeg,最好是卸载后重新安装较新版本,因为videoprocessingframework对ffmpeg的动态库的版本有要求。安装过程可以参考这篇文章:https://blog.csdn.net/txf1931783593/article/details/128250457 ,忽略其中安装ffmpeg依赖库的过程,可以等到编译时报错再进行安装相关依赖库。

3.1 安装nv-codec-hearers

//Clone 
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git

//进入文件夹
cd nv-codec-headers 

//切换到指定版本,-b 新分支命名
//可使用 git tag 查看可选的版本,我选择的是n11.0.10.2
git checkout n11.0.10.2 -b nv-codec-headers

// 查看该分支版本支持的驱动版本是否满足自己驱动的版本要求(若不满足则再次切换其他版本)
cat README

//满足版本要求后Install 
make
sudo make install

## 通过pkg-config 验证ffnvcodec,如果找不到,把ffnvcodec.pc路径添加到PKG_CONFIG_PATH
pkg-config --modversion ffnvcodec

3.2 下载NVIDIA Video Codec SDK并解压备用

3.3 安装ffmepg编码库

//Clone 
git clone https://code.videolan.org/videolan/x264.git

//Install 
cd x264
./configure --disable-asm --enable-shared --enable-pic

make
sudo make install

//也可通过以下命令直接安装
sudo apt-get install x264 libx264-dev

3.4 安装ffmpeg

安装ffmpeg:

//Clone ffmpeg (/usr/local/ffmpeg)
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg/

cd ffmpeg

//setting 安装在build_x64_release_shared目录下
./configure  --prefix=$(pwd)/build_x64_release_shared  --disable-static --disable-stripping --disable-doc \
             --enable-shared  --enable-nonfree --enable-cuda --enable-cuda-sdk --enable-gpl --enable-libx264 \ 
             --enable-cuvid --enable-nonfree --enable-cuda-nvcc --enable-libnpp \ 
             --extra-cflags=-I/usr/local/cuda-11.3/include  --extra-ldflags=-L/usr/local/cuda-11.3/lib64

export LD_LIBRARY_PATH=/usr/local/ffmpeg/build_x64_release_shared/
source ~/.bashrc

//install
make clean
make -j -s && make install

建立软连接:

//我是链接到这个位置
ln -s /usr/local/ffmpeg/build_x64_release_shared/bin/ffmpeg /opt/conda/bin/ffmpeg
ln -s /usr/local/ffmpeg/build_x64_release_shared/bin/ffprobe /opt/conda/bin/ffprobe 

添加安装目录的动态链接库:

//加入到配置文件
vim ~/.bashrc
//在文件最后新增一行,保存
export LD_LIBRARY_PATH=/usr/local/ffmpeg/build_x64_release_shared/lib:$LD_LIBRARY_PATH
// 立即生效
source ~/.bashrc

添加库链接:

echo "/usr/local/ffmpeg/build_x64_release_shared/lib" >> /etc/ld.so.conf
ldconfig

检查硬件加速:

//检查硬件加速,有输出即正常
ffmpeg -hwaccels
//检查编码器和解码器
ffmpeg -codecs | grep cuvid
含有 h264_cuvid和h264_nvenc即可硬件加速

4、编译videoprocessingframework

涉及到的路径根据自己的情况更改。

git clone git@github.com:NVIDIA/VideoProcessingFramework.git

cd VideoProcessingFramework

mkdir -p build
mkdir -p install  #vpf bin生成的位置 可以自定义
cd build

cmake .. \
-DVIDEO_CODEC_SDK_DIR="/usr/local/Video_Codec_SDK_12.0.16" \
-DGENERATE_PYTHON_BINDINGS:BOOL="1" \
-DFFMPEG_DIR:PATH="/usr/local/ffmpeg/build_x64_release_shared" \
-DCMAKE_INSTALL_PREFIX:PATH="/usr/local/videoprocessingframework/install" \
-DAVUTIL_INCLUDE_DIR="/usr/local/ffmpeg/build_x64_release_shared/include/" \
-DAVCODEC_INCLUDE_DIR="/usr/local/ffmpeg/build_x64_release_shared/include/" \
-DAVFORMAT_INCLUDE_DIR="/usr/local/ffmpeg/build_x64_release_shared/include/" \
-DAVUTIL_LIBRARY="/usr/local/ffmpeg/build_x64_release_shared/lib/libavutil.so" \
-DAVCODEC_LIBRARY="/usr/local/ffmpeg/build_x64_release_shared/lib/libavcodec.so" \
-DAVFORMAT_LIBRARY="/usr/local/ffmpeg/build_x64_release_shared/lib/libavformat.so" \
-DSWRESAMPLE_LIBRARY="/usr/local/ffmpeg/build_x64_release_shared/lib/libswresample.so" \
-DPYTHON_INCLUDE_DIR="/opt/conda/include/python3.7m/" \
-DPYTHON_LIBRARY="/opt/conda/lib/libpython3.7m.so "

make && make install

验证是否安装成功:

cd /usr/local/videoprocessingframework/samples
python SampleDecode.py

如果打印一下信息则表示安装成功:

This sample decodes input video to raw NV12 file on given GPU. Usage: SampleDecode.py $gpu_id $input_file $output_file. Provide gpu ID, path to input and output files

5、遇到的一些问题

(1)ModuleNotFoundError: No module named 'PyNvCodec'。

将编译生成的.so文件拷贝到使用的Python包路径(例如cp PyNvCodec.cpython-37m-x86_64-linux-gnu.so /opt/conda/lib/python3.7/site-packages/)

(2)cmake时一直提示找不到ffmpeg libs (例如 libavfilter, libswscale , libavformat 等库)。

cmake通过 pkg-config 命令来查找是否有对应的package 模块, pkg-config是通过 *.pc 的文件来判断。 例如如果pkg-config找到了 libswscale2.11.pc,则就说明我们有 libswscale 2.11 库。默认的pkg-config 只会寻找 /usr/share/pkgconfig/*.pc和/usr/lib/pkgconfig/*.pc, /usr/lib64/pkgconfig/*.pc 。而我的ffmpeg libs在/usr/local/ffmpeg/build_x64_release_shared/lib/pkgconfig。

解决方法:

export PKG_CONFIG_PATH=/usr/local/ffmpeg/build_x64_release_shared/lib/pkgconfig

如果还是不行,尝试直接安装

sudo apt-get install libavfilter-dev

 类似资料: