我正在尝试使用 MinGW/msys 使用 nvidia 库在 Windows 中编译 ffmpeg 以进行硬件加速。尝试按照nvidias 网站上的说明进行操作(部分:使用 NVIDIA GPU 开始使用 FFmpeg/libav)。配置了--enable-nonfree --disable-shared --enable-nvenc --enable-cuda --enable-cuvid --enable-libnpp --extra-cflags=-Ilocal/include --extra-cflags=-I ../common/inc --extra-ldflags=-L../common/lib/x64 --prefix=ffmpeg但停在“错误:找不到 libnpp”。其中 common 文件夹是从NVIDIA Video Codec SDK下载的,但没有 npp 库或头文件。有什么解决办法吗?感谢您的建议。
4 回答
我设法在 Linux 下成功交叉编译ffmpeg,目标是 Windows 64 位,包括--enable-libnpp。
我的环境是 Ubuntu Server 16.10 64bit。
全新安装后,我使用以下命令安装了 MinGW:
sudo apt-get install mingw-w64
首先,我按照 NVIDIA 开发网站Compile Ffmpeg with NVIDIA Video Codec SDK上的说明成功编译了 Linux 版本,并激活了--enable-libnpp选项。
为此,您需要安装CUDA Toolkit。只需按照说明进行操作,包安装程序就会创建符号链接(我有 CUDA Toolkit 8.0):
/usr/local/cuda/include/ -> /usr/local/cuda-8.0/targets/x86_64-linux/include
/usr/local/cuda/lib64/ -> /usr/local/cuda-8.0/targets/x86_64 -linux/lib
这应该提供配置正确的路径以找到正确的库和头文件。
我用来编译 linux 版本的 ffmpeg 的命令行是:
./configure --enable-nonfree --disable-shared --enable-nvenc --enable-cuda --enable-cuvid --enable-libnpp --extra-cflags=-I/usr/local/cuda/include/ --extra-ldflags=-L/usr/local/cuda/lib64/
您遇到的问题是,在使用交叉编译时,您需要为Windows 版本的libnpp库提供Configure the right path where to find headers and library。
从上面提到的 CUDA Toolkit 下载页面,我只是下载了 Windows 包的exe(本地)版本。
在我的工作文件夹的根目录下,我创建了一个名为tmp的文件夹,我在其中复制了我在包 cuda_8.0.61_win10.exe 内的 npp_dev 下找到的子文件夹:
cuda_8.0.61_win10.exe\npp_dev\lib -> tmp/lib
cuda_8.0.61_win10.exe\npp_dev\include -> tmp/include
作为最后一步,我使用以下参数再次启动了配置:
./configure --arch=x86_64 --target-os=mingw32 --cross-prefix=x86_64-w64-mingw32- --pkg-config=pkg-config --enable-nonfree --disable-shared --enable-nvenc --enable-cuda --enable-cuvid --enable-libnpp --extra-cflags=-I/usr/local/include --extra-cflags=-I/usr/local/cuda/include/ --extra-ldflags=-L/usr/local/cuda/lib64/ --extra-cflags=-I../tmp/include/ --extra-ldflags=-L../tmp/lib/x64/
编译成功完成。当我将ffmpeg.exe文件复制到 Windows 并尝试执行它时,我收到一条错误消息,指出可执行文件缺少一些 npp_*.dll。
从包cuda_8.0.61_win10.exe我将包含在文件夹npp\bin中的所有 dll 复制到我放置ffmpeg.exe的同一目录中。
之后,应用程序运行正常,从 4K 文件的简单转换按预期完成。
实际上,我对 ffmpeg 没有建立同样的问题感到疯狂。我最终设法让它在 Windows 10 x64 下工作:
从https://www.msys2.org/下载 msys2并使用 Pacman 安装所有软件包
pacman -Su
pacman -S make
pacman -S diffutils
pacman -S yasm
pacman -S mingw-w64-x86_64-gcc
pacman -S mingw-w64-x86_64-toolchain
将 pkgconfig 添加到环境变量
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
将额外安装的工具链添加到路径:
PATH=$PATH:/opt/bin
启动mingw64版本:
C:\msys64\msys2_shell.cmd -mingw64
从 nVidia https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exenetwork下载并安装 Cuda
提取下载的文件,例如
cuda_11.2.2_461.33_win10.exe
在本地使用 7zip复制
cuda_nvcc\nvcc\include
到您的 msys2 例如C:\msys64\tmp\nvidia_include
复制
libnpp\npp_dev\lib\x64
到您的C:\msys64\tmp\nvidia_lib\x64
复制
libnpp\npp_dev\include
到C:\msys64\tmp\nvidia_npp_include
git clone https://github.com/FFmpeg/FFmpeg.git
至C:\msys64\home\<user>
git clone https://github.com/libav/libav
至C:\msys64\home\<user>
也许可选步骤:
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
到C:\msys64\home\<user>
make
make install
可选,因为 make install 应该为您完成此操作:将 ffnvcodec.pc 复制到
C:\msys64\usr\local\lib\pkgconfig
构建 libav
avconv.exe
和avprobe.exe
ffmpeg 以后需要:cd C:\msys64\home\<user>\libav
./configure
make
make install
最后构建ffmpeg:
cd C:\msys64\home\<user>\ffmpeg
./configure --enable-nonfree --disable-shared --enable-nvenc --enable-cuda --enable-cuvid --enable-libnpp --extra-cflags=-I/tmp/nvidia_npp_include --extra-cflags=-I/tmp/nvidia_include --extra-ldflags=-L/tmp/nvidia_lib/x64
make
make install
复制
avconv.exe
并avprobe.exe
到 ffmpeg 目录
完毕。
错误修正:
- 丢失的 DLL:在您的硬盘或互联网上查找 x64 丢失的 DLL。
- 使用依赖walker分析错误
- 下载最新的 nVidia 驱动程序并使用 nSight,确保您的显卡支持 CUVID。
这似乎是由 FFmpeg 代码库中的配置脚本损坏引起的。在最近的 CUDA 发行版中没有名为 npp 的库,而是在 Windows 平台上你将拥有
nppc.lib
nppi.lib
npps.lib
在Linux上
libnppc.so
libnppi.so
libnpps.so
您要么需要自己修改配置系统,要么向项目开发人员提交错误请求来为您完成。
使用 MinGW 构建项目可能仍然存在其他问题,但这超出了 Stack Overflow 问题的范围。
如果检查 config.log,可能会有很多链接警告:
LINK : warning LNK4044: unrecognized option '/L...'; ignored
cause
ERROR: libnpp not found
。
由于 /L 不是 msvc 链接器的正确参数,为了包含库路径,参数应如下:
./configure .... --extra-cflags=-I/usr/local/cuda/... --extra-ldflags=-LIBPATH:/usr/local/cuda/...
这应该能够解决 libnpp 未找到问题。仅供参考,链接器选项列在以下链接中(包括LIBPATH):
链接器选项