FFmpeg NVIDIA windows环境配置过程
前言
本人近期在研究雄迈网络摄像头的拉流解码和人脸识别,在使用opencv-tensorflow实现了人脸识别后,发现其CPU的占用率在15%以上,考虑到后续的扩展希望将拉流的工作转移至FFmpeg-gpu来实现。本文目的是对新version的ffmpeg在windows操作系统条件下,使用msys配置环境。
官方文档
NVIDIA官方FFmpeg文档
FFmpeg-wiki官方文档
有兴趣的同学可以去学习,由于每个版本的升级变化,每次配置的方式都是不同的,所以留下来会有很多的问题需要处理。
前序安装
- Visual Studio Professional 2017(含所有的SDK);
- CUDA;
- CMAKE;
- msys2;
- Git;
- Vulkan;
- Video_Codec_SDK;
相关库文件下载
FFmpeg 4.3.1 release
VideoLAN/ x264
nv-codec-headers
注意可以使用最新版本
编译步骤
1. CMAKE-Video_Codec_SDK
根据Video_Codec_SDK官方文档说明,需要使用CMAKE进行配置,其中source指向/Video_Codec_SDK_11.0.10/Samples(文件夹位置自行调整),build指向/Video_Codec_SDK_11.0.10/build。
本人首次配置时,出现了VULKAN-PATH的报错,后下载Vulkan,path环境变量指向安装路径\Program Files\VulkanSDK\1.2.154.1\Bin(文件夹位置自行调整),问题解决。之后就是配置生成过程,在VS中ALL_BUILD&INSTALL即可。
2. 配置msys2
安装msys2后,找到x64 native tools command prompt for vs 2017。打开确认[vcvarsall.bat] Environment initialized for: ‘x64’。根据msys2安装目录,输入\msys64\msys2_shell.cmd -mingw64 -use-full-path(文件夹位置自行调整)
启动msys2后,开始执行以下操作:
pacman -Syu
pacman -Su
pacman -S diffutils make pkg-config nasm
完成操作后,需进行以下确认:
which yasm
which nasm
which make
这里值得注意的是,NVIDIA官方文档给出的pacman安装步骤中,要执行yasm的安装,实际是无法下载安装包的。这里在pacman -Syu这一步就执行了yasm的安装,如果执行which yasm出现问题,自行下载yasm安装包,配置环境变量即可。例如:
export PATH="/msys/var/cache/pacman/pkg/yasm-1.3.0-2-x86_64/usr/bin":$PATH
#(文件夹位置自行调整)
3. 配置X264
找到cl.exe文件在Visual Studio中的位置,例如:/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/
然后在msys2中,输入:
export PATH="/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/":$PATH
#(文件夹位置自行调整)
验证配置情况,输入:
which cl
which link
在确认无误后,cd进X264文件夹进行脚本配置:
CC=cl ./configure --enable-static --prefix=/x264config --disable-cli
#(/x264config文件夹位置自行调整)
结果无误后,顺序执行
make
make install
打开x264config\lib\pkgconfig文件夹,将x264.pc文件拷贝至\msys64\usr\lib\pkgconfig
4.配置nv-codec-headers
在msys2中,cd进入nv-codec-headers文件夹,输入:
make install PREFIX=/usr
打开nv-codec-headers文件夹,将ffnvcodec.pc文件拷贝至\msys64\usr\lib\pkgconfig
5.配置lib&include文件
按下列步骤执行:
mkdir /usr/local/include/
mkdir /usr/local/lib64
cp -R /C/Program\ Files/NVIDIA\ GPU\ Computing\ Toolkit/CUDA/v10.1/include/* /usr/local/include/
cp -R /C/Program\ Files/NVIDIA\ GPU\ Computing\ Toolkit/CUDA/v10.1/lib/x64/* /usr/local/lib64/
cp -R /x264config/include/* /usr/local/include/
cp -R /x264config/lib/* /usr/local/lib64/
X264文件夹自行调整
6.配置FFmpeg
cd进FFmpeg文件夹,执行下列代码:
./configure --enable-gpl --enable-shared --enable-libx264 --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --prefix=/d/FFmpeg --extra-cflags=-I/usr/local/include --extra-ldflags=-libpath:/usr/local/lib64 --toolchain=msvc
问题1:cl.exe问题
如果出现类似问题,请关闭msys2,在x64 native tools command prompt for vs 2017中输入\msys64\msys2_shell.cmd -mingw64。在msys2中重新配置
export PATH="/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/":$PATH
并检查cl&link的配置路径是刚才配置的路径
which cl
which link
问题2:–enable-libnpp报错
配置nv-codec-headers出现问题,需执行步骤4,并重新拷贝ffnvcodec.pc文件
问题3:有libx264警报
打开x264config\lib\pkgconfig文件夹,将x264.pc文件拷贝至\msys64\usr\lib\pkgconfig
执行./configure需要很长的时间,可进入FFmpeg/ffbuild文件中,观察config.log的执行状态。
完成上述配置后,顺序执行
make
make install
make过程同样会遇到问题
问题1:libx264配置出现问题,编译报错文件是ffmpeg_g.exe。
可以查看这个链接进行解决:https://stackoverflow.com/questions/62077528/compiling-static-libs-of-ffmpeg-with-x264-in-msys2-for-visual-studio-but-libx26
问题2:.c文件编译出现格式error
重新执行pacman进行安装。
pacman -Syu
pacman -Su
pacman -S diffutils make pkg-config nasm
验证结果
cmd进入D:\ffmpeg。执行下列代码进行验证:
ffmpeg -filters | findstr scale_npp
结果:
ffmpeg version 4.3.git-2b70201 Copyright (c) 2000-2020 the FFmpeg developers
built with 用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.16.27043 版
configuration: --enable-gpl --enable-libx264 --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --prefix=/d/FFmpeg --extra-cflags=-I/usr/local/include --extra-ldflags='-libpath:/usr/local/lib64' --toolchain=msvc
libavutil 56. 60.100 / 56. 60.100
libavcodec 58.111.101 / 58.111.101
libavformat 58. 62.100 / 58. 62.100
libavdevice 58. 11.102 / 58. 11.102
libavfilter 7. 88.100 / 7. 88.100
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
libpostproc 55. 8.100 / 55. 8.100
... scale_npp V->V NVIDIA Performance Primitives video scaling and format conversion
输入:
ffmpeg -encoders | findstr x264
结果:
ffmpeg version 4.3.git-2b70201 Copyright (c) 2000-2020 the FFmpeg developers
built with 用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.16.27043 版
configuration: --enable-gpl --enable-libx264 --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --prefix=/d/FFmpeg --extra-cflags=-I/usr/local/include --extra-ldflags='-libpath:/usr/local/lib64' --toolchain=msvc
libavutil 56. 60.100 / 56. 60.100
libavcodec 58.111.101 / 58.111.101
libavformat 58. 62.100 / 58. 62.100
libavdevice 58. 11.102 / 58. 11.102
libavfilter 7. 88.100 / 7. 88.100
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
libpostproc 55. 8.100 / 55. 8.100
V..... libx264 libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (codec h264)
V..... libx264rgb libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 RGB (codec h264)
输入:
ffmpeg -encoders | findstr nvenc
结果:
ffmpeg version 4.3.git-2b70201 Copyright (c) 2000-2020 the FFmpeg developers
built with 用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.16.27043 版
configuration: --enable-gpl --enable-libx264 --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --prefix=/d/FFmpeg --extra-cflags=-I/usr/local/include --extra-ldflags='-libpath:/usr/local/lib64' --toolchain=msvc
libavutil 56. 60.100 / 56. 60.100
libavcodec 58.111.101 / 58.111.101
libavformat 58. 62.100 / 58. 62.100
libavdevice 58. 11.102 / 58. 11.102
libavfilter 7. 88.100 / 7. 88.100
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
libpostproc 55. 8.100 / 55. 8.100
V..... h264_nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc_h264 NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc_hevc NVIDIA NVENC hevc encoder (codec hevc)
V..... hevc_nvenc NVIDIA NVENC hevc encoder (codec hevc)
看到这里,我们的FFmpeg NVIDIA环境就配置成功了。