对于ffmpeg,其在Linux和Mac下编译起来都是比较轻松的。但对于Windows来说,就比较复杂了,需要一个模拟在Linux下的环境来操作才能实现。虽然Windows上已经有了它自己的多媒体处理框架——MediaFoundation,但是FFMPEG的强大总会让我们使用到它,尤其是它还整合了NVENC,使我们在Windows平台下使用硬件加速编码更方便。接下来,我们来看一下如何在Windows下编译出ffmpeg库,并让它支持NVENC。
Visual Studio 环境
由于我们要使用VS里面的msvc编译器来进行编译,因此,这里需要大家先自行安装好Visual Studio环境。
MSYS2 安装
首先,我们要安装MSYS2。下载链接如下,请根据自己的系统来进行下载,32位或64位。
MSYS2下载链接: https://www.msys2.org/
安装完后,我们就打开其目录下的msys2_shell.cmd,接下来我们将安装一些必要的依赖和应用。
安装必要的依赖和应用
打开shell后敲入以下命令:
安装make: pacman -S make
安装yasm: pacman -S yasm
安装diffutils pacman -S diffutils
安装pkg-config pacman -S pkg-config
安装git pacman -S git
编译器,我们就我们就用之前说的msvc即可,不必再安装gcc。
下载nvidia必要的库和头文件
既然要支持nvidia的硬件加速,我们就得下载cuda,并将头文件和库移植到ffmpeg中,cuda的下载地址如下:
cuda: https://developer.nvidia.com/cuda-downloads
下载完cuda之后,我们还需要下载nvenc的相关库,下载地址如下:
nvenc: https://developer.nvidia.com/nvidia-video-codec-sdk/download
将他们两都下载完之后,在home目录(如果刚打开shell你没有cd到其它路径的话,你现在所处的位置就是home目录)新建一个文件夹,叫做nv_sdk。然后将cuda安装目录下的include和lib目录全部拷到这个新建的文件夹中(在我的电脑中,我的cuda安装目录是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2)。
接着,我们继续在home目录下新建一个叫做nvenc的文件夹,然后把我们下载下来的nvenc库里的include和lib(lib要注意选择正确的系统和位数)拷贝到nvenc文件夹里。(这一步我的做法是在nvenc文件夹里面再建两个文件夹,分别是include和lib,然后把下载下来的nvenc的头文件全部拷贝到我新建的include里,把我们需要的库文件全部拷贝到我新建的lib里)具体如下:


git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
接着,我们可以在我们的home目录下,得到一个叫做nv-codec-headers的文件夹,cd进去,执行以下命令:
make install PREFIX=/usr
重新打开
我们将shell关闭,然后从开始菜单中打开vs路径下的cmd,如图

配置环境变量
在对ffmpeg进行configure中,会用到cuda安装目录下的bin目录的一些程序,用来检查什么的。在对ffmpeg进行编译中,会用到vs下的msvc编译器。因此,我们需要进行环境变量的配置。对于我的电脑来说,我配置的PATH如下:
export PATH="/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2/bin":$PATH
export PATH="/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.24.28314/bin/Hostx64/x64":$PATH
你们可以根据我这两个路径作为参照,找到自己电脑上相对应的路径。需要注意的是,这一个操作仅在当前shell有效。如果将窗口关闭重新打开,需要将命令重新输入一次。
下载最新版的ffmpeg:
执行以下命令:
git clone https://git.ffmpeg.org/ffmpeg.git
这一步可能会出现下载过慢的情况,我个人推荐自行到github上下载,然后复制到你的home目录中。
Configure
当你做完上面的步骤后,你就可以进行configure了。这里我给我自己的configure参数配置,这个configure支持nvidia硬件加速和nvenc,你们也可以根据自己的需要,自行修改,或者在上面往上加。
PKG_CONFIG_PATH="/usr/lib/pkgconfig" ./configure --enable-nonfree --enable-nvenc --enable-shared --enable-cuda-nvcc --enable-cuda-llvm --enable-libnpp --toolchain=msvc --enable-gpl --prefix=./build --extra-cflags='-I/home/29533/nv_sdk/include -I/home/29533/build/include -I/home/29533/nvenc/include' --extra-ldflags='-LIBPATH:/home/29533/nv_sdk/lib/x64 -LIBPATH:/home/29533/build/lib -LIBPATH:/home/29533/nvenc/lib'
Make
配置成功后,我们就可以进行编译了,make && make install 即可,如果嫌慢的话,可以make -j 一下,加大编译的并行量。最终编译成功后,我们可以看到会多出一个buid文件夹,里面的bin目录就有我们的ffmpeg.exe文件和相应的库文件了,将库文件拷贝好,即可用于开发。
常见问题
在Windows下编译ffmpeg并不是一件容易事,碰到各种各样的问题也是常有的。当然,如果有现成的,请直接用吧,不要花费时间在这上面。
问题一. 怎么支持x264,fdk-aac这些库
现在版本的ffmpeg不再包含有这些库,都得自行去下载、编译和安装,编译安装完后在ffmpeg 的configure中增加相应的模块,同时指定其头文件路径于库文件路径即可。具体可以去百度或者谷歌具体某个库的编译方法。如果该库支持cmake的话,也可以配置生成vs工程再进行编译。
问题二. configure 出错
请仔细检查自己有没有按照上述所说的步骤去做:
- 检查configure参数语法有无错误
- msys2.exe是否在vs的环境下运行。
- 环境变量是否有正确配置
- 额外头文件和库文件路径是否有正确指定,一般都是指定到某个include文件夹或者某个lib文件夹。
问题三. configure 出错,且已经确保问题二的步骤都正确执行了
在ffmpeg根目录下有一个ffbuid文件夹,里面有个config.log文件,它是你执行configure后所做的日志记录。打开它,拉到末尾,一般都能看到configure失败的原因。根据这个原因自行分析改正即可。