本文为在Ubuntu中的docker容器环境下编译VideoProcessingFramework硬解码框架的教程,记录一些在编译过程中踩过的坑。所有操作均在docker容器环境下进行。
Video_Codec_SDK_12.0.16
ffmpeg-5.1
cuda 11.3
python 3.7
driver-470
创建容器时要注意,要添加ENV NVIDIA_DRIVER_CAPABILITIES="video,compute,utility" ,不然在运行代码时会报错RuntimeError:/home/VideoProcessingFramework/PyNvCodec/TC/src/NvDecoder.cpp。
如果当前环境下已经安装了ffmpeg,最好是卸载后重新安装较新版本,因为videoprocessingframework对ffmpeg的动态库的版本有要求。安装过程可以参考这篇文章:https://blog.csdn.net/txf1931783593/article/details/128250457 ,忽略其中安装ffmpeg依赖库的过程,可以等到编译时报错再进行安装相关依赖库。
//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
//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
安装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即可硬件加速
涉及到的路径根据自己的情况更改。
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
(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