【问题标题】:ffmpeg ERROR: libnpp not found in windowsffmpeg 错误:在 Windows 中找不到 libnpp
【发布时间】:2017-06-11 17:28:27
【问题描述】:

我正在尝试在 windows 中使用 nvidia 库编译 ffmpeg,以使用 MinGW/msys 进行硬件加速。尝试按照nvidias website 上的说明进行操作(部分:使用 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。” strong> 其中 common 文件夹是从 NVIDIA Video Codec SDK 下载的,但没有 npp 库或头文件。有什么解决办法吗?感谢您的建议。

【问题讨论】:

  • 去下载 CUDA 工具包。 NPP 作为其中的一部分分发
  • 或者只是不使用 NPP 支持构建
  • 我已经试过了。安装了 cuda 工具包,找到了 npp 库和头文件并将它们复制到 common/lib/x64 和 common/inc 文件夹,但仍然无法正常工作......

标签: windows ffmpeg cuda nvenc


【解决方案1】:

我成功地在包含 --enable-libnpp 的 linux 下针对 Windows 64 位成功交叉编译 ffmpeg

我的环境是 Ubuntu Server 16.10 64bit。
全新安装后,我使用以下命令安装了 MinGW:

sudo apt-get install mingw-w64

首先,我按照 NVIDIA 开发网站Compile Ffmpeg with NVIDIA Video Codec SDK 上的说明激活了 --enable-libnpp 选项,成功编译了 Linux 版本。
为此,您需要安装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 库找到标头和库.
从上面提到的 CUDA Toolkit 下载页面,我只是下载了 Windows 包的 exe(local) 版本。
在我的工作文件夹的根目录下,我创建了一个名为 tmp 的文件夹,我在其中复制了我在 cuda_8.0.61_win10.exe 包内的 npp_dev 下找到的子文件夹em>:

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 文件的简单转换。

【讨论】:

  • 在 Ubuntu 上,您应该使用 dpkg-query -L cuda-npp-dev-10-0(或您的 NPP 包名称)来确定 NPP 包含和 lib 目录的路径
【解决方案2】:

实际上,我对 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 https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exenetwork下载并安装 Cuda

  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. ffmpeg 以后需要构建 libav avconv.exeavprobe.exe

  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。
  • 使用依赖遍历器分析错误
  • 下载最新的 nVidia 驱动程序并使用 nSight 确保您的显卡支持 CUVID。

【讨论】:

  • 感谢您将这些放在一起,我经历了所有阶段,但无法解析第 3 节中的所有 nVidia 文件,因为新的 11.1 产品已移动文件(我下载并安装了本地安装不是网络之一,希望这不是问题!)。所以所需的确切目录不存在,我认为这使我的尝试脱轨。
  • @topspeed 今天我想在我的新电脑上重做所有步骤,但我也失败了。我更正了第 3 节的上述步骤。所有包含和库都可以在从 nVidia 下载的文件中找到。
  • Missing DLLs libwinpthread-1.dll libbz2-1.dll libiconv-2.dll liblzma-5.dll可以在\mingw64\bin\文件夹中找到,编译后复制到ffmpeg文件夹中跨度>
【解决方案3】:

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

nppc.lib
nppi.lib
npps.lib

在 Linux 上

libnppc.so
libnppi.so
libnpps.so

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

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

【讨论】:

  • 感谢您的回答,但我发现的唯一解决方案是我使用 --disable-libnpp 标志配置了 ffmpeg...
  • 这里也一样。我无法检测到 libnpp 来挽救我的生命。我只需要禁用它。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 2016-04-05
    • 2019-09-02
    • 2012-10-27
    • 2020-07-10
    • 2020-11-08
    • 2020-09-01
    相关资源
    最近更新 更多