添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I`m trying to compile ffmpeg in windows with nvidia libraries for hardware acceleration using MinGW/msys. tried to follow the instruction on 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 but there is no npp libs or header files. is there any solution for that? thanks for edvice.

I have already tried it. installed cuda toolkit, found npp libs and headers and copied them to common/lib/x64 and common/inc folders but still not works... Gio Jan 26, 2017 at 11:43

I managed to successfuly cross compile ffmpeg under linux targeting Windows 64 bit with --enable-libnpp included.

My environment is Ubuntu Server 16.10 64bit.
After a fresh installation I installed MinGW using the command:

sudo apt-get install mingw-w64

First I successfully compiled the Linux version with the --enable-libnpp option activated following the instructions on the NVIDIA dev site Compile Ffmpeg with NVIDIA Video Codec SDK.
In order to do that you need to install the CUDA Toolkit. Just follow the instructions and the package installer will create the symbolic links (I have the 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

This should provide Configure the right path to find the correct libraries and headers.
The command line I have used to compile the linux version of ffmpeg is:

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

The problem you got is that when using cross-compilation you need to provide Configure the right path where to find headers and library for the Windows version of the libnpp library.
From the CUDA Toolkit Download page mentioned above I simply downloaded the exe(local) version of the Windows package.
Under the root of my working folder I created a folder called tmp where I copied the subfolders I found under npp_dev inside the package 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

As final step I launched Configure once again using the following parameters:

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

The compilation completed successully. When I copied the ffmpeg.exe file to Windows and tried to execute it I got an errore message saying the executable was missing some npp_*.dll.
From the package cuda_8.0.61_win10.exe I copied all the dlls included into the folder npp\bin to the same directory I put ffmpeg.exe.
After that the application run normally and a simple conversion from a 4K file completed as expected.

on Ubuntu you should use dpkg-query -L cuda-npp-dev-10-0 (or your NPP package name) to figure out which paths are the NPP include and lib directories – cat Jan 14, 2019 at 3:47

Actually I went nuts about ffmpeg is not building with the same problem. I fianally managed to get it worked under Windows 10 x64:

  • Download msys2 from https://www.msys2.org/ and install all packages with 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

  • add pkgconfig to environment variable PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

  • Add additional installed toolchain to path: PATH=$PATH:/opt/bin

  • Start mingw64 version: C:\msys64\msys2_shell.cmd -mingw64

  • Download and install Cuda from nVidia https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exenetwork

  • Extract the downloaded file e.g. cuda_11.2.2_461.33_win10.exe with 7zip locally

  • Copy cuda_nvcc\nvcc\include to your msys2 e.g. C:\msys64\tmp\nvidia_include

  • Copy libnpp\npp_dev\lib\x64 to your C:\msys64\tmp\nvidia_lib\x64

  • Copy libnpp\npp_dev\include to C:\msys64\tmp\nvidia_npp_include

  • git clone https://github.com/FFmpeg/FFmpeg.git to C:\msys64\home\<user>

  • git clone https://github.com/libav/libav to C:\msys64\home\<user>

  • Maybe optional step: git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git to C:\msys64\home\<user>

  • make install

  • Optional because make install should have done this for you: Copy ffnvcodec.pc to C:\msys64\usr\local\lib\pkgconfig

  • Build libav avconv.exe and avprobe.exe are needed for ffmpeg later:

  • cd C:\msys64\home\<user>\libav

  • ./configure

  • make install

  • Finally build 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 install

  • Copy avconv.exe and avprobe.exe to ffmpeg directory

    Done.

    Bugfixing:

  • Missing DLLs: find x64 missing DLLs on your harddisk or in internet.
  • Use dependency walker for analyzing errors
  • Download the newest nVidia drivers and use nSight making sure CUVID is supported for your graphic card.
  • Thanks for putting this together, I went through all stages but was not able to resolve all the nVidia files in section 3, as the new 11.1 offering has moved the files around (I downloaded and installed the local installation not the network one, hope that wasn't the issue!). So the exact directories required were not there, and I think that derailed my attempt. – topspeed Nov 18, 2020 at 14:32 @topspeed today I wanted to redo all the steps on my new computer and I failed too. I corrected the steps above for section 3. All the includes and libs are found in the downloaded file from nVidia. – Rainer Apr 5, 2021 at 20:51 Missing DLLs libwinpthread-1.dll libbz2-1.dll libiconv-2.dll liblzma-5.dll can be found in the \mingw64\bin\ folder copy them to ffmpeg folder after compile – PixelPimp Jan 10, 2022 at 6:45

    This would seem to be caused by a broken configuration script in the FFmpeg code base. There is no library called npp in recent CUDA distributions, instead on Windows platforms you will have

    nppc.lib
    nppi.lib
    npps.lib
    

    and on linux

    libnppc.so
    libnppi.so
    libnpps.so
    

    You will either need to modify the configuration system yourself or file a bug request with the project developers to do it for you.

    There might still be additional problems building the project with MinGW, but that is way beyond the scope of a Stack Overflow question.

    thanks for your answer talonmies, but the only solution i found was that i configured ffmpeg with --disable-libnpp flag... – Gio Feb 2, 2017 at 11:35 Same here. I can't get libnpp detected to save my life. I'll just have to settle with disabling it. – SomeGuy Oct 9, 2017 at 21:42

    If you check config.log, there may have a lot link warnings:
    LINK : warning LNK4044: unrecognized option '/L...'; ignored
    cause
    ERROR: libnpp not found.
    Since /L is not a correct argument for msvc linker, in order to include library path, the argument should as follow:
    ./configure .... --extra-cflags=-I/usr/local/cuda/... --extra-ldflags=-LIBPATH:/usr/local/cuda/...
    This should able to solve the libnpp not found issue. FYI, linker options are listed in the following link (included LIBPATH): Linker Options

    2022 Update

    On this weekend I also managed to build latest ffmpeg with working scale_npp filter. Without any npp missing library error during compilation and building. But with some caveats (see below).

    I followed this guide by NVIDIA with installed NVIDIA GPU Computing Toolkit v11.7 and latest driver display 473.47 for my video card GeForce GT 710 on Windows 10 21H2 x64

    Changes (adaptations) for steps in the guide

    I copied all headers including folders from directory path_to_CUDA_toolkit/include

    I excluded pkg-config from pacman packages, because after recommended installation steps (step 7 in particular) of MSYS2 it conflicts with installed pkgconf package, i.e. use this command instead:

    pacman -S diffutils make yasm
    

    I added directories to Visual Studio C compiler to PATH environment variable in advance (using Windows GUI), in addition to declaring them in the MinGW64 terminal as specified in the guide:

    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
    

    After making (building) ffnvcodec headers, define PKG_CONFIG_PATH (where compiled file ffnvcodec.pc is located) before configure command.

    Use absolute paths for --extra-cflags and --extra-ldflags options of configure command. It's probably the main thing in solving "not found" errors. But don't forget that these paths will be printed in ffmpeg banner with other explicit build options.

    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/"
    

    And that's it. At least -vf scale_npp should work.

    In my case still DO NOT WORK the following things from the guide:

  • cuda built-in resizer and cropper, i.e. -hwaccel_output_format cuda –resize 1280x720 and -hwaccel_output_format cuda –crop 16x16x32x32. I bet that this is due to my old video card is not in GPU Support Matrix. But NVENC and NVDEC works fine for me almost without crutches. And it seems I'm note alone.
    UPD: resizer and cropper work! BUT in the mentioned guide commands are incorrect. I found correct way in another NVIDIA FFmpeg Transcoding Guide. Decoder h264_cuvid was missed, must be so:
  • 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 fails with error. Maybe I used wrong C compiler version or didn't install DirectX SDK from here or installed wrong packages after installing MSYS2 and ignoring 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.
    
  • there is no possibility to use -preset option for h264_nvenc with latest ffmpeg version where presets (enum) were updated. I noticed from ffmpeg report file, this is because using any preset causes "auto" enabling lookahead mode with log raw:
    [h264_nvenc @ 00000158EFC6E500] Lookahead enabled: depth 28, scenecut enabled, B-adapt enabled.
    Even though the options -rc-lookahead and -temporal-aq are not supported by my device (video card). I have to use only one preset p4 (medium) which is by default. And I don't know how to workaround this issue. Value 0 for -rc-lookahead also does not help.
  • specifying -bf 2 only works with option -extra_hw_frames 6 (six in my case - number of extra frames can differ for your card). Or using only -bf 0. But this is due to constraints of my old video card.
  • 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
    

    I hope my notes will help future Google and SO users.

    Thanks for contributing an answer to Stack Overflow!

    • Please be sure to answer the question. Provide details and share your research!

    But avoid

    • Asking for help, clarification, or responding to other answers.
    • Making statements based on opinion; back them up with references or personal experience.

    To learn more, see our tips on writing great answers.