ffmpeg ERROR: libnpp not found in windows

ffmpeg ERROR: libnpp not found in windows

我正在尝试使用 MinGW/msys 使用 nvidia 库在 windows 中编译 ffmpeg 以实现硬件加速。尝试按照 nvidias website (section: Getting Started with FFmpeg/libav using NVIDIA GPUs). configured with --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 but stopped at "ERROR: libnpp not found." where common folder is downloaded from NVIDIA Video Codec SDK 上的说明进行操作,但没有 npp 库或头文件。有什么解决办法吗?谢谢指教

这似乎是由 FFmpeg 代码库中损坏的配置脚本引起的。在最近的 CUDA 发行版中没有名为 npp 的库,在 Windows 平台上您将拥有

nppc.lib
nppi.lib
npps.lib

以及 linux

libnppc.so
libnppi.so
libnpps.so

您要么需要自己修改配置系统,要么向项目开发人员提交错误请求,让他们为您完成。

使用 MinGW 构建项目可能仍然存在其他问题,但这超出了 Stack Overflow 问题的范围。

我设法在 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

这应该提供 配置 找到正确库的正确路径和 headers。
我用来编译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/

您遇到的问题是,在使用 cross-compilation 时,您需要提供 配置 找到 headers 的正确路径和 [= libnpp 库的 81=] 版本。
从上面提到的 CUDA 工具包下载页面,我只是下载了 exe(local) 版本的 Windows 包。
在我的工作文件夹的根目录下,我创建了一个名为 tmp 的文件夹,我在其中复制了我在包 npp_dev 下找到的子文件夹 cuda_8.0.61_win10.exe:

cuda_8.0.61_win10.exe\npp_dev\lib -> tmp/lib  
cuda_8.0.61_win10.exe\npp_dev\include -> tmp/include

作为最后一步,我使用以下参数再次启动 Configure

./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 我将所有包含的 dll 复制到文件夹 npp\bin 到我放 ffmpeg.exe.
的同一个目录 之后应用程序 运行 正常,并按预期完成了从 4K 文件的简单转换。

如果勾选config.log,可能会有很多link个警告:
LINK : warning LNK4044: unrecognized option '/L...'; ignored
原因
ERROR: libnpp not found.
由于 /L 不是 msvc linker 的正确参数,为了包含库路径,参数应如下所示:
./configure .... --extra-cflags=-I/usr/local/cuda/... --extra-ldflags=-LIBPATH:/usr/local/cuda/...
这应该能够解决 libnpp not found 的问题。 仅供参考,linker 选项列在以下 link 中(包括 LIBPATH): Linker Options

实际上,我对 ffmpeg 没有构建同样的问题感到疯狂。我最终设法让它在 Windows 10 x64:

下工作
  1. https://www.msys2.org/ 下载 msys2 并使用 Pacman 安装所有软件包

  2. pacman -Su

  3. pacman -S make

  4. pacman -S diffutils

  5. pacman -S yasm

  6. pacman -S mingw-w64-x86_64-gcc

  7. pacman -S mingw-w64-x86_64-toolchain

  8. 将 pkgconfig 添加到环境变量 PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

  9. 将额外安装的工具链添加到路径:PATH=$PATH:/opt/bin

  10. 启动mingw64版本:C:\msys64\msys2_shell.cmd -mingw64

  11. 从 nVidia 下载并安装 Cuda https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exenetwork

  12. 解压缩下载的文件,例如cuda_11.2.2_461.33_win10.exe 在本地使用 7zip

  13. 复制 cuda_nvcc\nvcc\include 到您的 msys2 例如C:\msys64\tmp\nvidia_include

  14. 复制libnpp\npp_dev\lib\x64到你的C:\msys64\tmp\nvidia_lib\x64

  15. 复制libnpp\npp_dev\includeC:\msys64\tmp\nvidia_npp_include

  16. git clone https://github.com/FFmpeg/FFmpeg.gitC:\msys64\home\<user>

  17. git clone https://github.com/libav/libavC:\msys64\home\<user>

  18. 可能是可选步骤:git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.gitC:\msys64\home\<user>

  19. make

  20. make install

  21. 可选,因为 make install 应该已经为您完成了:将 ffnvcodec.pc 复制到 C:\msys64\usr\local\lib\pkgconfig

  22. Build libav avconv.exeavprobe.exe 之后需要ffmpeg:

  23. cd C:\msys64\home\<user>\libav

  24. ./configure

  25. make

  26. make install

  27. 最终构建 ffmpeg:

  28. cd C:\msys64\home\<user>\ffmpeg

  29. ./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

  30. make

  31. make install

  32. 复制avconv.exeavprobe.exe到ffmpeg目录

完成。

错误修复:

  • 丢失的 DLL:在您的硬盘或互联网上查找 x64 丢失的 DLL。
  • 使用 dependency walker 分析错误
  • 下载最新的 nVidia 驱动程序并使用 nSight 确保您的显卡支持 CUVID。

2022 年更新

在这个周末,我还成功地构建了最新的 ffmpeg,并使用了 scale_npp 过滤器。在编译和构建过程中没有任何 npp missing library 错误。但有一些注意事项(见下文)。

我跟随 NVIDIA this guide 安装了 NVIDIA GPU Computing Toolkit v11.7 和最新 driver 显示器 473.47 我的显卡 GeForce GT 710 Windows 10 21H2 x64

指南中步骤的更改(改编)

我从目录 path_to_CUDA_toolkit/include

复制了所有 headers 包括文件夹

我从 pacman 包中排除了 pkg-config,因为在推荐的 MSYS2 安装步骤(特别是 step 7 之后)它与安装的 pkgconf 包冲突,即改用这个命令:

pacman -S diffutils make yasm

我预先将目录添加到Visual Studio C编译器到PATH环境变量(使用Windows GUI ),除了按照指南中的规定在 MinGW64 终端中声明它们:

export PATH="/c/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/":$PATH
export PATH="/d/NVIDIA GPU Computing Toolkit/CUDA/v11.7/bin/":$PATH

制作(构建)ffnvcodecheaders后,在配置命令之前定义PKG_CONFIG_PATH(编译文件ffnvcodec.pc所在的位置)。

对 configure 命令的 --extra-cflags--extra-ldflags 选项使用绝对路径这可能是解决“找不到”错误的主要方法。但不要忘记这些路径将与其他显式构建选项一起打印在 ffmpeg 横幅中 .

PKG_CONFIG_PATH="/d/_makeit/nv-codec-headers/" ./configure --enable-nonfree --disable-shared --enable-cuda-nvcc --enable-libnpp --toolchain=msvc --extra-cflags="-I/d/_makeit/ffmpeg/nv_sdk/" --extra-ldflags="-LIBPATH:/d/_makeit/ffmpeg/nv_sdk/"

就是这样。至少 -vf scale_npp 应该有效。

在我的情况下,指南中的以下内容仍然无法使用:

  • cuda built-in resizercropper,即 -hwaccel_output_format cuda –resize 1280x720-hwaccel_output_format cuda –crop 16x16x32x32。我敢打赌这是因为我的旧视频卡不在 GPU Support Matrix. But NVENC and NVDEC works fine for me almost without crutches. And it seems I'm note alone.
    UPD: resizercropper work! 但在提到的指南命令不正确。我在另一个 NVIDIA FFmpeg Transcoding Guide 中找到了正确的方法。解码器 h264_cuvid 被遗漏,一定是这样:
ffmpeg.exe -y -vsync passthrough -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -resize 1280x720 -i input.mp4 -c:a copy -c:v h264_nvenc -b:v 5M output.mp4

ffmpeg.exe -y -vsync passthrough -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -crop 16x16x32x32 -i input.mp4 -c:a copy -c:v h264_nvenc -b:v 5M output.mp4
  • -vf scale_cuda 失败并出现错误。也许我使用了错误的 C 编译器版本,或者没有从 here 安装 DirectX SDK,或者在安装 MSYS2 并忽略 pkg-config
  • 后安装了错误的包
[Parsed_scale_cuda_0 @ 000001A461479DC0] cu->cuModuleLoadData(cu_module, data) failed -> CUDA_ERROR_UNSUPPORTED_PTX_VERSION: the provided PTX was compiled with an unsupported toolchain.
  • 无法对 h264_nvenc 使用 -preset 选项,其中 latest ffmpeg 版本更新了预设(枚举)。我从 ffmpeg 报告文件中注意到,这是因为使用任何预设都会导致“自动”启用带有原始日志的先行模式:
    [h264_nvenc @ 00000158EFC6E500] Lookahead enabled: depth 28, scenecut enabled, B-adapt enabled.
    即使我的设备(视频卡)不支持选项 -rc-lookahead-temporal-aq。我必须只使用一个默认的预设 p4(中等)。 而且我不知道如何解决这个问题。 -rc-lookahead 的值 0 也没有帮助。
  • 指定 -bf 2 仅适用于选项 -extra_hw_frames 6 (在我的情况下为六个 - 额外帧的数量可能因您的卡而异)。或者只使用 -bf 0。但这是由于我的旧显卡的限制。
ffmpeg.exe -v verbose -y -vsync passthrough -hwaccel cuda -hwaccel_output_format cuda -extra_hw_frames 6 -i input-1080p.mkv -map 0:v -map 0:a -c:a copy -c:v h264_nvenc -b:v 1M -bf 2 -bufsize 1M -maxrate 2M -qmin 0 -g 250 -b_ref_mode middle -i_qfactor 0.75 -b_qfactor 1.1 output.mp4

我希望我的笔记对未来的 Google 和 SO 用户有所帮助。