这个步骤相对比较简单,不再详细说明。
首先需要安装msys2环境以及相关的编译依赖项, 官方网址为:
在官网下载好 安装程序后,直接按照提示安装即可。
安装好后需要将下载库的地址更换为国内源,否则下载速度可能会极慢,甚至失败。配置文件位于:C:\msys64\etc\pacman.d,分别将mirrorlist.mingw32、mirrorlist.mingw64、mirrorlist.msys三个配置文件的首选Server的地址,更换为清华大学及中科大镜像
# See https://www.msys2.org/dev/mirrors ## Primary ## 清华大学 Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686/ ## 中科大 Server = https://mirrors.ustc.edu.cn/msys2/mingw/i686/ Server = https://mirror.msys2.org/mingw/i686/ Server = https://repo.msys2.org/mingw/i686/ ## Tier 1 Server = https://mirror.umd.edu/msys2/mingw/i686/ Server = https://mirror.yandex.ru/mirrors/msys2/mingw/i686/ Server = https://download.nus.edu.sg/mirror/msys2/mingw/i686/ Server = https://mirror.accum.se/mirror/msys2.org/mingw/i686/ Server = https://ftp.nluug.nl/pub/os/windows/msys2/builds/mingw/i686/ Server = https://ftp.osuosl.org/pub/msys2/mingw/i686/ Server = https://mirror.internet.asn.au/pub/msys2/mingw/i686/ Server = https://mirror.selfnet.de/msys2/mingw/i686/ Server = https://mirrors.dotsrc.org/msys2/mingw/i686/ Server = https://mirrors.bfsu.edu.cn/msys2/mingw/i686/ Server = https://mirror.nju.edu.cn/msys2/mingw/i686/ Server = https://repo.extreme-ix.org/msys2/mingw/i686/ Server = https://mirror.clarkson.edu/msys2/mingw/i686/ Server = https://quantum-mirror.hu/mirrors/pub/msys2/mingw/i686/ Server = https://mirror.archlinux.tw/MSYS2/mingw/i686/ Server = https://fastmirror.pp.ua/msys2/mingw/i686/ ## Tier 2 Server = https://ftp.cc.uoc.gr/mirrors/msys2/mingw/i686/ Server = https://mirror.jmu.edu/pub/msys2/mingw/i686/ Server = https://mirrors.piconets.webwerks.in/msys2-mirror/mingw/i686/ Server = https://www2.futureware.at/~nickoe/msys2-mirror/mingw/i686/ Server = https://mirrors.sjtug.sjtu.edu.cn/msys2/mingw/i686/ Server = https://mirrors.bit.edu.cn/msys2/mingw/i686/ Server = https://mirrors.aliyun.com/msys2/mingw/i686/ Server = https://mirror.iscas.ac.cn/msys2/mingw/i686/ Server = https://mirrors.cloud.tencent.com/msys2/mingw/i686/
# See https://www.msys2.org/dev/mirrors ## Primary Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64/ Server = https://mirrors.ustc.edu.cn/msys2/mingw/x86_64/ Server = https://mirror.msys2.org/mingw/x86_64/ Server = https://repo.msys2.org/mingw/x86_64/ ## Tier 1 Server = https://mirror.umd.edu/msys2/mingw/x86_64/ Server = https://mirror.yandex.ru/mirrors/msys2/mingw/x86_64/ Server = https://download.nus.edu.sg/mirror/msys2/mingw/x86_64/ Server = https://mirror.accum.se/mirror/msys2.org/mingw/x86_64/ Server = https://ftp.nluug.nl/pub/os/windows/msys2/builds/mingw/x86_64/ Server = https://ftp.osuosl.org/pub/msys2/mingw/x86_64/ Server = https://mirror.internet.asn.au/pub/msys2/mingw/x86_64/ Server = https://mirror.selfnet.de/msys2/mingw/x86_64/ Server = https://mirrors.dotsrc.org/msys2/mingw/x86_64/ Server = https://mirrors.bfsu.edu.cn/msys2/mingw/x86_64/ Server = https://mirror.nju.edu.cn/msys2/mingw/x86_64/ Server = https://repo.extreme-ix.org/msys2/mingw/x86_64/ Server = https://mirror.clarkson.edu/msys2/mingw/x86_64/ Server = https://quantum-mirror.hu/mirrors/pub/msys2/mingw/x86_64/ Server = https://mirror.archlinux.tw/MSYS2/mingw/x86_64/ Server = https://fastmirror.pp.ua/msys2/mingw/x86_64/ ## Tier 2 Server = https://ftp.cc.uoc.gr/mirrors/msys2/mingw/x86_64/ Server = https://mirror.jmu.edu/pub/msys2/mingw/x86_64/ Server = https://mirrors.piconets.webwerks.in/msys2-mirror/mingw/x86_64/ Server = https://www2.futureware.at/~nickoe/msys2-mirror/mingw/x86_64/ Server = https://mirrors.sjtug.sjtu.edu.cn/msys2/mingw/x86_64/ Server = https://mirrors.bit.edu.cn/msys2/mingw/x86_64/ Server = https://mirrors.aliyun.com/msys2/mingw/x86_64/ Server = https://mirror.iscas.ac.cn/msys2/mingw/x86_64/ Server = https://mirrors.cloud.tencent.com/msys2/mingw/x86_64/
# See https://www.msys2.org/dev/mirrors ## Primary Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch/ Server = https://mirrors.ustc.edu.cn/msys2/msys/$arch/ Server = https://mirror.msys2.org/msys/$arch/ Server = https://repo.msys2.org/msys/$arch/ ## Tier 1 Server = https://mirror.umd.edu/msys2/msys/$arch/ Server = https://mirror.yandex.ru/mirrors/msys2/msys/$arch/ Server = https://download.nus.edu.sg/mirror/msys2/msys/$arch/ Server = https://mirror.accum.se/mirror/msys2.org/msys/$arch/ Server = https://ftp.nluug.nl/pub/os/windows/msys2/builds/msys/$arch/ Server = https://ftp.osuosl.org/pub/msys2/msys/$arch/ Server = https://mirror.internet.asn.au/pub/msys2/msys/$arch/ Server = https://mirror.selfnet.de/msys2/msys/$arch/ Server = https://mirrors.dotsrc.org/msys2/msys/$arch/ Server = https://mirrors.bfsu.edu.cn/msys2/msys/$arch/ Server = https://mirror.nju.edu.cn/msys2/msys/$arch/ Server = https://repo.extreme-ix.org/msys2/msys/$arch/ Server = https://mirror.clarkson.edu/msys2/msys/$arch/ Server = https://quantum-mirror.hu/mirrors/pub/msys2/msys/$arch/ Server = https://mirror.archlinux.tw/MSYS2/msys/$arch/ Server = https://fastmirror.pp.ua/msys2/msys/$arch/ ## Tier 2 Server = https://ftp.cc.uoc.gr/mirrors/msys2/msys/$arch/ Server = https://mirror.jmu.edu/pub/msys2/msys/$arch/ Server = https://mirrors.piconets.webwerks.in/msys2-mirror/msys/$arch/ Server = https://www2.futureware.at/~nickoe/msys2-mirror/msys/$arch/ Server = https://mirrors.sjtug.sjtu.edu.cn/msys2/msys/$arch/ Server = https://mirrors.bit.edu.cn/msys2/msys/$arch/ Server = https://mirrors.aliyun.com/msys2/msys/$arch/ Server = https://mirror.iscas.ac.cn/msys2/msys/$arch/ Server = https://mirrors.cloud.tencent.com/msys2/msys/$arch/
运行C:\msys64\msys2.exe,在命令行通过 pacman -Syu 一键安装和升级所有的库。
在编译过程中可能会遇到还缺少某些其他库的问题, 直接根据提示安装就可以。比如可能还需要安装的库如下:
pacman -S make cmake #常规编译工具 pacman -S yasm #汇编工具 pacman -S nasm #汇编工具 pacman -S pkg-config #库配置工具,编译支持x264和x265会用到 pacman -S mingw-w64-x86_64-gcc #编译工具
pacman -S diffutils #比较工具,ffmpeg configure 生成makefile时用到
pacman -S git #源码下载工具
首先,为了使msys2访问windows PATH环境变量,需要在msys2安装目录中找到脚本文件msys2_shell.cmd,使用任何编辑器将其打开,将rem set MSYS2_PATH_TYPE=inherit修改为set MSYS2_PATH_TYPE=inherit,即删除rem注释继承系统环境变量。
其次,在windows开始菜单中找到Visual Studio 2019,右击“x64_x86 Cross Tools Command Prompt For VS 2019”,选择以管理员身份运行(最好以管理员权限运行,否则后续在执行make install 指令时可能会发生权限不足的问题,切记)。
关于几个选项的选择
如果是32位Windows, 想编译32位的FFmpeg, 建议选择:x86 Native Tools Command Prompt;
如果是64位Windows, 想编译64位的FFmpeg, 建议选择:x64 Native Tools Command Prompt
如果是32位Windows, 想编译64位的FFmpeg, 建议选择:x86_x64 Cross Tools Command Prompt
如果是64位Windows, 想编译32位的FFmpeg, 建议选择:x64_x86 Cross Tools Command Prompt
具体请参见微软官网:Use the Microsoft C++ toolset from the command line
我的操作系统是Win10 64位,需要编译的是32位的FFmpeg,所以选择的是:x64_x86 Cross Tools Command Prompt For VS 2019
然后,cd到C:\msys64,32位方式运行msys2_shell.cmd(msys2_shell.cmd -mingw64会以64位方式运行msys2),启用MinGW运行环境,此时在弹出的msys2命令窗口中输入cl,输出MSVC信息,则说明编译器配置成功。
在msys窗口中分别输入which cl和which link查看当前编译器和链接器的位置:
可以看到cl编译器的位置是正确的,link链接器的位置是不正确的,这是因为目前找到的链接器默认为MSYS的链接器,MSYS默认也携带了一个名为link.exe的链接器(在:msys安装目录/usr/bin/link.exe),它与Visual Studio 自带的link.exe发生了冲突,这会影响之后构建系统的构建(在我的编译过程中就是因为忽略了这个问题,导致编译过程异常缓慢,而且生成的dll文件无法使用),我们这里一定要确定使用的是Visual Studio自带的link.exe。找到MSYS自带的link.exe, 将它改成别的名字,比如我将其重命名为link.exe_back。再次输入which link:
可以看到link.exe已经为Visual Studio目录下link.exe。
源码可以由https://github.com/FFmpeg/FFmpeg/tags或FFmpeg官网下载,如本人下载的是最新版的4.3版本。
首先从github上获取SDL源码,命令如下:
git clone https://github.com/libsdl-org/SDL.git cd SDL git checkout release-2.30.0
需要注意的是,SDL现在已经发布了3.0版本,而ffmpeg目前只能用SDL2版本,所以在拉取代码后,需要切换到2.30.0这个版本。
下载好 SDL2 源码后,我们需要使用 CMake 为其生成VS工程,所以我们首先到这里下载CMake,并将其安装到Windows系统上。之后打开 CMake-GUI,在 CMake-GUI 中指定SDL2源码所在路径以及编译后的输出路径,随后执行Configure,随后配置如下
随后保持默认配置,Generate VS2019工程。
有了VS工程,可以通过VS2019来编译SDL了。编译好的SDL会保存到指定输出目录的Release或Debug目录下,而我们希望输出的路径则是/usr/local/sdl2/lib,需要在指定输出目录下创建 lib 目录,并将SDL2.lib和SDL2.dll文件拷贝到lib目录下。同时在lib目录下创建 pkgconfig目录,将sdl2.pc文件拷贝到该目录中。此外,我们还要修改 sdl2.pc 中的内容,将其中的库路径修改为指定的输出路径,最终完整的目录结构如下所示:
与SDL一样我们也要先获取其源码,可以通过下面的命令获取x264源码:
git clone https://code.videolan.org/videolan/x264.git
源码获取到后,可以直接在MSYS2环境下编译出Windows下可用的动态库,具体步骤如下:
cd x264 # 在MSYS2中进入x264源码目录
pacman -S automake autoconf libtool # 安装生成Makefile的工具 CC=cl ./configure --prefix=/usr/local/x264 --enable-shared make -j 4 && make install
通过上面的命令就可以将x264编译出来了。x264编译好后,其输出的目录结构与SDL2是一样的,在/usr/local/x264中包括了include、lib、bin等目录。要特别强调的一点是,我们需要将lib目录下的libx264.dll.lib文件名修改为libx264.lib,否则ffmpeg编译时会报 “无法找到该库” 的错误。
fdk-aac的编译与SDL类似,它同样要使用CMake生成VS工程文件,之后再通过VS编译该库。首先,通下面的的命令获取fdk-aac源码:
git clone https://github.com/mstorsjo/fdk-aac.git
之后,通过CMake生成VS工程文件,具体执行步骤请参考 SDL 生成 VS 工程的步骤,这里就不再重复了。
接下来,使用VS2019编译fdk-aac,编译好的库同要会被放到Release或Debug目录下,因此我们必须像处理SDL库一样,需要手工组织fdk-aac的输出目录树。至此fdk-aac就算编译好了。
在编译fdk-aac时有个特殊情况,就是使用CMake的方式无法产生include头文件(这也有可能是我哪块执行的不对)。为了解决这个问题,又用MSYS2+mingw的方式重新编译了一遍fdk-aac,这种方式是可以生成include头文件的,然后将生成的头文件手动拷贝到了/usr/local/fdk-aac目录下即可。
./autogen.sh ./configure --prefix=/c/work/Opensource/ffmpegbuild/fdk-aac/migwbuild make make install
首先下载x265源码
git clone https://github.com/videolan/x265.git
查询VS2019 cmake路径查询VS2019 cmake路径,执行whereis cmake
编辑文件/c/work/Opensource/ffmpegbuild/x265/build/msys-cl/make-Makefiles.sh,修改其中cmake.exe为VC版绝对路径,否则会使用默认msys2中的cmake,即将:
cmake -G "NMake Makefiles" -DCMAKE_CXX_FLAGS="-DWIN32 -D_WINDOWS -W4 -GR -EHsc" -DCMAKE_C_FLAGS="-DWIN32 -D_WINDOWS -W4" ../../source
修改为:
/c/"Program Files (x86)/Microsoft Visual Studio/2019"/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/bin/cmake -G "NMake Makefiles" -DCMAKE_CXX_FLAGS="-DWIN32 -D_WINDOWS -W4 -GR -EHsc" -DCMAKE_C_FLAGS="-DWIN32 -D_WINDOWS -W4" ../../source
进入源码目录,执行以下3个命令完成编译
cd /home/source/x265/build/msys-cl/ ./make-Makefiles.sh nmake install
执行nmake install之后可见x265被编译至C:/Program Files (x86)/x265/目录,我们需要将其复制至msys2的/usr/local/目录,并修改相应的x256.pc文件中的路径
首先,我们要设置环境变量PKG_CONFIG_PATH,通过它告诉FFmpeg上述几个库从哪儿可以找到,具体的设置方法如下:
在msys2窗口运行命令pacman -S vim,安装vim,vim ~/.bashrc编辑该文件,在~/.bashrc中设置环境变量
export PKG_CONFIG_PATH=/usr/local/sdl2/lib/pkgconfig:/usr/local/x264/lib/pkgconfig:/usr/local/fdk-aac/lib/pkgconfig:/usr/local/x265/lib/pkgconfig:$PKG_CONFIG_PATH
然后执行命令source ~/.bashrc让环境变量生效。四个库pkgconfig配置文件内容如下:
# sdl pkg-config source file prefix=/usr/local/sdl2 exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: sdl2 Description: Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. Version: 2.30.0 Requires.private: Conflicts: Libs: -L${libdir} -lSDL2 Libs.private: -lSDL2-static -lkernel32 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lversion -luuid -ladvapi32 -lsetupapi -lshell32 -ldinput8 Cflags: -I${includedir} -I${includedir}/SDL2
prefix=/usr/local/x264 exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: x264 Description: H.264 (MPEG4 AVC) encoder library Version: 0.164.3191 Libs: -L${exec_prefix}/lib -llibx264 Libs.private: Cflags: -I${prefix}/include -DX264_API_IMPORTS
prefix=/usr/local/fdk-aac exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Fraunhofer FDK AAC Codec Library Description: AAC codec library Version: 2.0.3 Libs: -L${libdir} -lfdk-aac Libs.private: -lm Cflags: -I${includedir}
prefix=/usr/local/x265 exec_prefix=${prefix}/bin libdir=${prefix}/lib includedir=${prefix}/include Name: x265 Description: H.265/HEVC video encoder Version: 3.4 Libs: -L${libdir} -llibx265 Libs.private: Cflags: -I${includedir}
进入到ffmpeg源码解压目录,执行./configure --help即可查看所有支持的编译参数:
可以看到,原生支持的编译参数有很多,我们这里只关注下列部分,通过对下列参数的配置即可完成裁剪功能。
Individual component options: --disable-everything 禁用下方的所有组件 --disable-encoder=NAME 禁用指定的编码器 --enable-encoder=NAME 启用指定的编码器 --disable-encoders 禁用所有编码器 --disable-decoder=NAME 禁用指定的解码器 --enable-decoder=NAME 启用指定的解码器 --disable-decoders 禁用所有解码器 --disable-hwaccel=NAME 禁用硬件加速(硬件解码) --enable-hwaccel=NAME 启用硬件加速 --disable-hwaccels 禁用所有硬件加速 --disable-muxer=NAME 禁用指定的封装器 --enable-muxer=NAME 启用指定的封装器 --disable-muxers 禁用所有封装器 --disable-demuxer=NAME 禁用指定的解封装器 --enable-demuxer=NAME 启用指定的封装器 --disable-demuxers 禁用所有解封装器 --enable-parser=NAME 启用指定的解析器 --disable-parser=NAME 禁用指定的解析器 --disable-parsers 禁用所有的解析器 --enable-bsf=NAME 启用指定的比特流过滤器(bitstream filter) --disable-bsf=NAME 禁用指定的比特流过滤器 --disable-bsfs 禁用所有比特流过滤器 --enable-protocol=NAME 启用指定的协议(这里的协议就是TCP/UDP/FILE) --disable-protocol=NAME 禁用指定的协议 --disable-protocols 禁用所有的协议 --enable-indev=NAME 启用指定的输入设备 --disable-indev=NAME 禁用指定的输入设备 --disable-indevs 禁用所有的输入设备 --enable-outdev=NAME 启用指定的输出设备 --disable-outdev=NAME 禁用指定的输出设备 --disable-outdevs 禁用所有输出设备 --disable-devices 禁用所有设备 --enable-filter=NAME 启用指定的过滤器 --disable-filter=NAME 禁用指定的过滤器 --disable-filters 禁用所有过滤器
简单介绍一下上面的几个选项:
这里列出的是一些常用的编译选项,完整的编译选项请参考:附录一:《FFmpeg 编译参数总结》。
本人在编译时使用如下编译选项:
./configure --prefix=./buildout --toolchain=msvc --disable-doc --enable-shared --enable-libx264 --enable-gpl --enable-libfdk-aac --enable-nonfree --enable-libx265 --enable-sdl --enable-ffplay --disable-debug
其中增加最后一个配置选项--disable-debug,是因为在没有这个选项的情况下,编译会卡死在生成avcodec.dll库时,提示“正在创建库 libavcodec/avcodec.lib 和对象 libavcodec/avcodec.exp”,该文章也遇到这个问题,但是微软官方也没有给出解决方案,不清楚是不是只有在特定版本的VS2019(本人为community版本)中才能复现该问题,所以暂时增加--disable-debug取消调试信息生成。
之后执行make命令进行编译。在编译过程中,假如出现如下错误[error C2065: “slib”: 未声明的标识符]:
那么需要修改fftools/cmdutils.c源码文件, 将第1153行注释掉,原因是CC_IDENT标识未定义引起的, 如下所示:
后续编译过程中遇见类似的编译错误,请按相同办法处理。编译完成后执行make install,将会将可执行程序、库文件、头文件等安装到指定目录。
至此编译完成,后续会介绍通过vcpkg直接安装ffmpeg的方法以及一个基于ffmpeg的简单播放器实例。
参数 | 参数作用 |
---|---|
–help | 打印显示帮助信息 |
–quiet | 禁止显示信息输出 |
–list-decoders | 显示所有可用的解码器 |
–list-encoders | 显示所有可用的编码器 |
–list-hwaccels | 显示所有可用的硬件加速器 |
–list-demuxers | 显示所有可用的解复用器 |
–list-muxers | 显示所有可用的复用器 |
–list-parsers | 显示所有可用的解析器 |
–list-protocols | 显示所有可用的协议 |
–list-bsfs | 显示所有可用的比特流过滤器 |
–list-indevs | 显示所有可用的输入设备 |
–list-outdevs | 显示所有可用的输出设备 |
–list-filters | 显示所有可用的过滤器 |
参数 | 参数作用 |
---|---|
–logfile=FILE | 记录测试并输出到 指定文件FILE ,默认为ffbuild/config.log |
–disable-logging | 不记录配置调试信息 |
–fatal-warnings | 如果生成任何配置警告,则失败 |
–prefix=PREFIX | 安装在指定路径PREFIX,默认为/usr/local |
–bindir=DIR | 在指定路径DIR 中安装二进制文件,默认为PREFIX/bin |
–datadir=DIR | 在指定路径DIR中安装数据文件,默认为PREFIX/share/ffmpeg |
–docdir=DIR | 在指定路径DIR中安装文档,默认为PREFIX/share/doc/ffmpeg |
–libdir=DIR | 在指定路径安装库,默认为PREFIX/lib |
–shlibdir=DIR | 在指定路径安装共享库,默认为LIBDIR,即PREFIX/lib |
–incdir=DIR | 在指定路径安装包含文件,默认为PREFIX/include |
–mandir=DIR | 在指定路径安装手册页,默认为PREFIX/share/man |
–pkgconfigdir=DIR | 在指定路径安装pkg-config 文件,默认为LIBDIR/pkgconfig |
–enable-rpath | 使用rpath允许在不属于动态链接器搜索路径的路径中安装库链接程序时使用rpath(小心使用) |
–install-name-dir=DIR | Darwin 已安装目标的目录名称 |
参数 | 参数作用 |
---|---|
–enable-gpl | 允许使用GPL代码,编译的库和二进制文件处于GPL许可下,默认为否 |
–enable-version3 | 升级(L)GPL到版本3,默认为否 |
–enable-nonfree | 允许使用非自由代码,并且二进制文件将不可再分发,默认为否 |
参数 | 参数作用 |
---|---|
–disable-static | 不构建静态库,默认为否 |
–enable-shared | 构建共享动态库,默认为否 |
–enable-small | 优化大小而不是速度 |
–disable-runtime-cpudetect | 禁用在运行时检测 CPU 功能(较小的二进制文件) |
–enable-gray | 启用全灰度支持(较慢的颜色) |
–disable-swscale-alpha | 在 swscale 中禁用 alpha 通道支持 |
–disable-all | 禁用构建组件、库和程序 |
–disable-autodetect | 禁用自动检测到的外部库,默认为否 |
参数 | 参数作用 |
---|---|
–disable-programs | 不构建命令行程序 |
–disable-ffmpeg | 禁用 ffmpeg 构建 |
–disable-ffplay | 禁用 ffplay 构建 |
–disable-ffprobe | 禁用 ffprobe 构建 |
参数 | 参数作用 |
---|---|
–disable-doc | 不构建文档 |
–disable-htmlpages | 不构建 HTML 文档页面 |
–disable-manpages | 不构建手册文档页面 |
–disable-podpages | 不构建 POD 文档页面 |
–disable-txtpages | 不构建文本文档页面 |
参数 | 参数作用 |
---|---|
–disable-avdevice | 禁用 libavdevice 构建 |
–disable-avcodec | 禁用 libavcodec 构建 |
–disable-avformat | 禁用 libavformat 构建 |
–disable-swresample | 禁用 libswresample 构建 |
–disable-swscale | 禁用 libswscale 构建 |
–disable-postproc | 禁用 libpostproc 构建 |
–disable-avfilter | 禁用 libavfilter 构建 |
–enable-avresample | 启用 libavresample 构建(已弃用),默认为否 |
–disable-pthreads | 禁用 pthreads [自动检测] |
–disable-w32threads | 禁用 Win32 线程 [自动检测] |
–disable-os2threads | 禁用 OS/2 线程 [自动检测] |
–disable-network | 禁用网络支持 ,默认为否 |
–disable-dct | 禁用 DCT 代码 |
–disable-dwt | 禁用 DWT 代码 |
–disable-error-resilience | 禁用错误恢复代码 |
–disable-lsp | 禁用 LSP 代码 |
–disable-lzo | 禁用 LZO 解码器代码 |
–disable-mdct | 禁用 MDCT 代码 |
–disable-rdft | 禁用 RDFT 代码 |
–disable-fft | 禁用 FFT 代码 |
–disable-faan | 禁用浮点 AAN (I)DCT 代码 |
–disable-pixelutils | 在 libavutil 中禁用像素工具 |
参数 | 参数作用 |
---|---|
–disable-everything | 禁用下面列出的所有组件 |
–disable-encoder=NAME | 禁用指定NAME的编码器 |
–enable-encoder=NAME | 启用指定NAME的编码器 |
–disable-encoders | 禁用所有编码器 |
–disable-decoder=NAME | 禁用指定NAME的解码器 |
–enable-decoder=NAME | 启用指定NAME的解码器 |
–disable-decoders | 禁用所有解码器 |
–disable-hwaccel=NAME | 禁用指定NAME的硬件 |
–enable-hwaccel=NAME | 启用指定NAME的硬件 |
–disable-hwaccels | 禁用所有 hwaccels |
–disable-muxer=NAME | 禁用指定NAME的复用器 |
–enable-muxer=NAME | 启用指定NAME的复用器 |
–disable-muxers | 禁用所有复用器 |
–disable-demuxer=NAME | 禁用指定NAME的解复用器 |
–enable-demuxer=NAME | 启用指定NAME的解复用器 |
–disable-demuxers | 禁用所有解复用器 |
–enable-parser=NAME | 启用指定NAME的解析器 |
–disable-parser=NAME | 禁用指定NAME的解析器 |
–disable-parsers | 禁用所有解析器 |
–enable-bsf=NAME | 启用指定NAME的比特流过滤器 |
–disable-bsf=NAME | 禁用指定NAME的比特流过滤器 |
–disable-bsfs | 禁用所有比特流过滤器 |
–enable-protocol=NAME | 启用指定NAME协议 |
–disable-protocol=NAME | 禁用指定NAME协议 |
–disable-protocols | 禁用所有协议 |
–enable-indev=NAME | 启用指定NAME的输入设备 |
–disable-indev=NAME | 禁用指定NAME的输入设备 |
–disable-indevs | 禁用输入设备 |
–enable-outdev=NAME | 启用指定NAME的输出设备 |
–disable-outdev=NAME | 禁用指定NAME的输出设备 |
–disable-outdevs | 禁用输出设备 |
–disable-devices | 禁用所有设备 |
–enable-filter=NAME | 启用指定NAME的过滤器名称 |
–disable-filter=NAME | 禁用指定NAME的过滤器名称 |
–disable-filters | 禁用所有过滤器 |
使用以下任何选项将允许 FFmpeg 链接到相应的外部库。 如果满足所有其他依赖项并且未明确禁用它们,则依赖于该库的所有组件都将启用。 例如。 --enable-libopus 将启用与 libopus 的链接并允许构建 libopus 编码器,除非使用 --disable-encoder=libopus 明确禁用它。
请注意,只有系统库会被自动检测。 所有其他外部库必须显式启用。
另请注意,以下帮助文本描述了库本身的用途,并非它们的所有功能都必须由 FFmpeg 使用。
参数 | 参数作用 |
---|---|
–disable-alsa | 禁用 ALSA 支持 [自动检测] |
–disable-appkit | 禁用 Apple AppKit 框架 [自动检测] |
–disable-avfoundation | 禁用 Apple AVFoundation 框架 [自动检测] |
–enable-avisynth | 启用读取 AviSynth 脚本文件 [否] |
–disable-bzlib | 禁用 bzlib [自动检测] |
–disable-coreimage | 禁用 Apple CoreImage 框架 [自动检测] |
–enable-chromaprint | 使用 chromaprint 启用音频指纹识别,默认为否 |
–enable-frei0r | 启用 frei0r 视频过滤 ,默认为否 |
–enable-gcrypt | 启用 gcrypt,需要 rtmp(t)e 支持,如果未使用 openssl、librtmp 或 gmp则默认为否 |
–enable-gmp | 启用 gmp,需要 rtmp(t)e 支持,如果未使用 openssl 或 librtmp则默认为否 |
–enable-gnutls | 启用 gnutls,需要 https 支持,如果未使用 openssl、libtls 或 mbedtls则默认为否 |
–disable-iconv | 禁用 iconv [自动检测] |
–enable-jni | 启用 JNI 支持,默认为否 |
–enable-ladspa | 启用 LADSPA 音频过滤,默认为否 |
–enable-libaom | 通过 libaom 启用 AV1 视频编码/解码,默认为否 |
–enable-libaribb24 | 通过 libaribb24 启用 ARIB 文本和字幕解码,默认为否 |
–enable-libass | 启用 libass 字幕渲染,需要字幕,默认为否 |
–enable-libbluray | 使用 libbluray 启用蓝光阅读,默认为否 |
–enable-libbs2b | 启用 bs2b DSP 库,默认为否 |
–enable-libcaca | 使用 libcaca 启用文本显示,默认为否 |
–enable-libcelt | 通过 libcelt 启用 CELT 解码,默认为否 |
–enable-libcdio | 启用使用 libcdio 抓取音频 CD,默认为否 |
–enable-libcodec2 | 使用 libcodec2 启用 codec2 编码/解码,默认为否 |
–enable-libdav1d | 通过 libdav1d 启用 AV1 解码,默认为否 |
–enable-libdavs2 | 通过 libdavs2 启用 AVS2 解码,默认为否 |
–enable-libdc1394 | 使用 libdc1394和libraw1394启用IIDC-1394 抓取 |
–enable-libfdk-aac | 通过 libfdk-aac 启用 AAC 解码/编码,默认为否 |
–enable-libflite | 通过 libflite 启用 flite(语音合成)支持,默认为否 |
–enable-libfontconfig | 启用 libfontconfig,对 drawtext 过滤器有用,默认为否 |
–enable-libfreetype | 启用 libfreetype,drawtext 过滤器需要,默认为否 |
–enable-libfribidi | 启用 libfribidi,改进 drawtext 过滤器,默认为否 |
–enable-libglslang | 启用 GLSL->SPIRV 编译通过 libglslang,默认为否 |
–enable-libgme | 通过 libgme 启用游戏音乐 Emu,默认为否 |
–enable-libgsm | 通过 libgsm 启用 GSM 解码/编码,默认为否 |
–enable-libiec61883 | 通过 libiec61883 启用 iec61883,默认为否 |
–enable-libilbc | 通过 libilbc 启用 iLBC 解码/编码,默认为否 |
–enable-libjack | 启用 JACK 音频声音服务器,默认为否 |
–enable-libklvanc | 启用内核实验室 VANC 处理,默认为否 |
–enable-libkvazaar | 通过 libkvazaar 启用 HEVC 编码,默认为否 |
–enable-liblensfun | 启用 lensfun 镜头校正,默认为否 |
–enable-libmodplug | 通过 libmodplug 启用 ModPlug,默认为否 |
–enable-libmp3lame | 通过 libmp3lame 启用 MP3 编码,默认为否 |
–enable-libopencore-amrnb | 通过 libopencore-amrnb 启用 AMR-NB 解码/编码,默认为否 |
–enable-libopencore-amrwb | 通过 libopencore-amrwb 启用 AMR-WB 解码,默认为否 |
–enable-libopencv | 通过 libopencv 启用视频过滤,默认为否 |
–enable-libopenh264 | 通过 OpenH264 启用 H.264 编码,默认为否 |
–enable-libopenjpeg | 通过 OpenJPEG 启用 JPEG 2000 解码/编码,默认为否 |
–enable-libopenmpt | 启用通过 libopenmpt 解码跟踪的文件,默认为否 |
–enable-libopenvino | 启用 OpenVINO 作为 DNN 模块后端,默认为否 |
–enable-libopus | 通过 libopus 启用 Opus 解码/编码,默认为否 |
–enable-libpulse | 通过 libpulse 启用 Pulseaudio 输入,默认为否 |
–enable-librabbitmq | 启用 RabbitMQ 库,默认为否 |
–enable-librav1e | 通过 rav1e 启用 AV1 编码,默认为否 |
–enable-librist | 通过 librist 启用 RIST,默认为否 |
–enable-librsvg | 通过 librsvg 启用 SVG 光栅化,默认为否 |
–enable-librubberband | 启用橡皮筋过滤器所需的橡皮筋,默认为否 |
–enable-librtmp | 通过 librtmp 启用 RTMP[E] 支持,默认为否 |
–enable-libshine | 通过 libshine 启用定点 MP3 编码,默认为否 |
–enable-libsmbclient | 通过 libsmbclient 启用 Samba 协议,默认为否 |
–enable-libsnappy | 启用 Snappy 压缩,需要 hap 编码,默认为否 |
–enable-libsoxr | 启用libsoxr 重采样,默认为否 |
–enable-libspeex | 通过 libspeex 启用 Speex 解码/编码,默认为否 |
–enable-libsrt | 通过 libsrt 启用 Haivision SRT 协议,默认为否 |
–enable-libssh | 通过 libssh 启用 SFTP 协议,默认为否 |
–enable-libsvtav1 | 通过 SVT 启用 AV1 编码,默认为否 |
–enable-libtensorflow | 启用TensorFlow作为基于DNN的过滤器的DNN模块后端,默认为否 |
–enable-libtesseract | 启用 Tesseract,ocr 过滤器需要,默认为否 |
–enable-libtheora | 通过 libtheora 启用 Theora 编码,默认为否 |
–enable-libtls | 如果未使用openssl、gnutls或mbedtls,则启用https支持所需的LibreSSL,默认为否 |
–enable-libtwolame | 通过 libttwolame 启用 MP2 编码,默认为否 |
–enable-libuavs3d | 通过 libuavs3d 启用 AVS3 解码,默认为否 |
–enable-libv4l2 | 启用 libv4l2/v4l-utils,默认为否 |
–enable-libvidstab | 使用 vid.stab 启用视频稳定,默认为否 |
–enable-libvmaf | 通过 libvmaf 启用 vmaf 过滤器,默认为否 |
–enable-libvo-amrwbenc | 通过 libvo-amrwbenc 启用 AMR-WB 编码,默认为否 |
–enable-libvorbis | 通过 libvorbis 启用 Vorbis 编码/解码,默认为否 |
–enable-libvpx | 通过 libvpx 启用 VP8 和 VP9 解码/编码,默认为否 |
–enable-libwebp | 通过 libwebp 启用 WebP 编码,默认为否 |
–enable-libx264 | 通过 x264 启用 H.264 编码,默认为否 |
–enable-libx265 | 通过 x265 启用 HEVC 编码,默认为否 |
–enable-libxavs | 通过 xavs 启用 AVS 编码,默认为否 |
–enable-libxavs2 | 通过 xavs2 启用 AVS2 编码,默认为否 |
–enable-libxcb | 使用 XCB 启用 X11 抓取 [自动检测] |
–enable-libxcb-shm | 启用 X11 抓取 shm 通信 [自动检测] |
–enable-libxcb-xfixes | 启用 X11 抓取鼠标渲染 [自动检测] |
–enable-libxcb-shape | 启用 X11 抓取形状渲染 [自动检测] |
–enable-libxvid | 通过 xvidcore 启用 Xvid 编码,存在原生 MPEG-4/Xvid 编码器,默认为否 |
–enable-libxml2 | 使用 C 库 libxml2 启用 XML 解析,默认为否 |
–enable-libzimg | 启用 z.lib,zscale 过滤器需要,默认为否 |
–enable-libzmq | 启用通过 libzmq 传递消息,默认为否 |
–enable-libzvbi | 通过 libzvbi 启用图文电视支持,默认为否 |
–enable-lv2 | 启用 LV2 音频过滤,默认为否 |
–disable-lzma | 禁用 lzma [自动检测] |
–enable-decklink | 启用 Blackmagic DeckLink I/O 支持,默认为否 |
–enable-mbedtls | 如果未使用openssl、gnutls或libtls,则启用https支持所需的mbedTLS,默认为否 |
–enable-mediacodec | 启用 Android MediaCodec 支持,默认为否 |
–enable-mediafoundation | 通过 MediaFoundation 启用编码 |
–enable-libmysofa | 启用 libmysofa,需要 soflizer 过滤器,默认为否 |
–enable-openal | 启用 OpenAL 1.1 捕获支持,默认为否 |
–enable-opencl | 启用 OpenCL 处理,默认为否 |
–enable-opengl | 启用 OpenGL 渲染,默认为否 |
–enable-openssl | 如果未使用gnutls、libtls 或 mbedtls,则启用https支持所需的openssl,默认为否 |
–enable-pocketsphinx | 启用 PocketSphinx,asr 过滤器需要,默认为否 |
–disable-sndio | 禁用 sndio 支持 [自动检测] |
–disable-schannel | 禁用 SChannel SSP,需要 TLS 支持[自动检测] |
–disable-sdl2 | 禁用 sdl2 [自动检测] |
–disable-securetransport | 禁用安全传输,需要 TLS 支持 |
–enable-vapoursynth | 启用 VapourSynth 解复用器,默认为否 |
–enable-vulkan | 启用 Vulkan 代码,默认为否 |
–disable-xlib | 禁用 xlib [自动检测] |
–disable-zlib | 禁用 zlib [自动检测] |
以下库提供各种硬件加速功能:
参数 | 参数作用 |
---|---|
–disable-amf | 禁用 AMF 视频编码代码 [自动检测] |
–disable-audiotoolbox | 禁用 Apple AudioToolbox 代码 [自动检测] |
–enable-cuda-nvcc | 启用 Nvidia CUDA 编译器,默认为否 |
–disable-cuda-llvm | 使用 clang, 禁用 CUDA 编译[自动检测] |
–disable-cuvid | 禁用 Nvidia CUVID 支持 [自动检测] |
–disable-d3d11va | 禁用 Microsoft Direct3D 11 视频加速代码 [自动检测] |
–disable-dxva2 | 禁用 Microsoft DirectX 9 视频加速代码 [自动检测] |
–disable-ffnvcodec | 禁用动态链接的 Nvidia 代码 [自动检测] |
–enable-libdrm | 启用 DRM 代码 (Linux),默认为否 |
–enable-libmfx | 通过 libmfx 启用英特尔 MediaSDK(AKA 快速同步视频)代码,默认为否 |
–enable-libnpp | 启用基于 Nvidia Performance Primitives 的代码,默认为否 |
–enable-mmal | 通过 MMAL 启用 Broadcom 多媒体抽象层 (Raspberry Pi) ,默认为否 |
–disable-nvdec | 禁用 Nvidia 视频解码加速(通过 hwaccel)[自动检测] |
–disable-nvenc | 禁用 Nvidia 视频编码代码 [自动检测] |
–enable-omx | 启用 OpenMAX IL 代码,默认为否 |
–enable-omx-rpi | 为 Raspberry Pi 启用 OpenMAX IL 代码 ,默认为否 |
–enable-rkmpp | 启用瑞芯微媒体处理平台代码 ,默认为否 |
–disable-v4l2-m2m | 禁用 V4L2 mem2mem 代码 [自动检测] |
–disable-vaapi | 禁用视频加速 API(主要是 Unix/Intel)代码 [自动检测] |
–disable-vdpau | 禁用适用于 Unix 代码的 Nvidia Video Decode 和 Presentation API [自动检测] |
–disable-videotoolbox | 禁用 VideoToolbox 代码 [自动检测] |
参数 | 参数作用 |
---|---|
–arch=ARCH | 选择架构 |
–cpu=CPU | 选择所需的最小CPU(影响指令选择,可能会在较旧的 CPU 上崩溃) |
–cross-prefix=PREFIX | 编译工具使用 PREFIX |
–progs-suffix=SUFFIX | 程序名后缀 |
–enable-cross-compile | 假设使用了交叉编译器 |
–sysroot=PATH | 交叉构建树的根 |
–sysinclude=PATH | 交叉构建系统头文件的位置 |
–target-os=OS | 编译器目标 OS |
–target-exec=CMD | 目标上运行可执行文件的命令 |
–target-path=DIR | 在目标上查看构建目录的路径 |
–target-samples=DIR | 目标样本目录的路径 |
–tempprefix=PATH | 强制固定目录/前缀而不是 mktemp 进行检查 |
–toolchain=NAME | 根据 NAME 设置工具默认值 |
–nm=NM | 使用 nm 工具 NM [nm -g] |
–ar=AR | 使用存档工具 AR [ar] |
–as=AS | 使用汇编器 AS |
–ln_s=LN_S | 使用符号链接工具 LN_S [ln -s -f] |
–strip=STRIP | 使用剥离工具STRIP [strip] |
–windres=WINDRES | 使用windows资源编译器WINDRES [windres] |
–x86asmexe=EXE | 使用 nasm 兼容的汇编程序 EXE [nasm] |
–cc=CC | 使用 C 编译器 CC [gcc] |
–cxx=CXX | 使用 C 编译器 CXX [g++] |
–objcc=OCC | 使用 ObjC 编译器 OCC [gcc] |
–dep-cc=DEPCC | 使用依赖生成器 DEPCC [gcc] |
–nvcc=NVCC | 使用 Nvidia CUDA 编译器 NVCC 或 clang |
–ld=LD | 使用链接器 LD |
–pkg-config=PKGCONFIG | 使用 pkg-config 工具 PKGCONFIG [pkg-config] |
–pkg-config-flags=FLAGS | 将附加标志传递给 pkgconf |
–ranlib=RANLIB | 使用ranlib RANLIB |
–doxygen=DOXYGEN | 使用 DOXYGEN 生成 API doc [doxygen] |
–host-cc=HOSTCC | 使用主机 C 编译器 HOSTCC |
–host-cflags=HCFLAGS | 在为主机编译时使用 HCFLAGS |
–host-cppflags=HCPPFLAGS | 在为主机编译时使用 HCPPFLAGS |
–host-ld=HOSTLD | 使用主机链接器 HOSTLD |
–host-ldflags=HLDFLAGS | 链接主机时使用 HLDFLAGS |
–host-extralibs=HLIBS | 链接主机时使用库 HLIBS |
–host-os=OS | 编译器主机操作系统 |
–extra-cflags=ECFLAGS | 将 ECFLAGS 添加到 CFLAGS |
–extra-cxxflags=ECFLAGS | 将 ECFLAGS 添加到 CXXFLAGS |
–extra-objcflags=FLAGS | 将 FLAGS 添加到 OBJCFLAGS |
–extra-ldflags=ELDFLAGS | 将 ELDFLAGS 添加到 LDFLAGS |
–extra-ldexeflags=ELDFLAGS | 将 ELDFLAGS 添加到 LDEXEFLAGS |
–extra-ldsoflags=ELDFLAGS | 将 ELDFLAGS 添加到 LDSOFLAGS |
–extra-libs=ELIBS | 添加 ELIBS |
–extra-version=STRING | 版本字符串后缀 |
–optflags=OPTFLAGS | 覆盖优化相关的编译器标志 |
–nvccflags=NVCCFLAGS | 覆盖 nvcc 标志 |
–build-suffix=SUFFIX | 库名后缀 |
–enable-pic | 构建与位置无关的代码 |
–enable-thumb | 编译 Thumb 指令集 |
–enable-l | 使用链接时优化 |
–env=“ENV=override” | 覆盖环境变量 |
参数 | 参数作用 |
---|---|
–malloc-prefix=PREFIX | 前缀 malloc 和带有 PREFIX 的相关名称 |
–custom-allocator=NAME | 使用支持的自定义分配器 |
–disable-symver | 禁用符号版本控制 |
–enable-hardcoded-tables | 使用硬编码表而不是运行时生成 |
–disable-safe-bitstream-reader | 在位读取器中禁用缓冲区边界检查(更快,但可能会崩溃) |
–sws-max-filter-size=N swscale | 使用的最大过滤器大小 ,默认为256 |
参数 | 参数作用 |
---|---|
–disable-asm | 禁用所有程序集优化 |
–disable-altivec | 禁用 AltiVec 优化 |
–disable-vsx | 禁用 VSX 优化 |
–disable-power8 | 禁用 POWER8 优化 |
–disable-amd3dnow | 禁用 3DNow!优化 |
–disable-amd3dnowext | 禁用 3DNow!扩展优化 |
–disable-mmx | 禁用 MMX 优化 |
–disable-mmxext | 禁用 MMXEXT 优化 |
–disable-sse | 禁用 SSE 优化 |
–disable-sse2 | 禁用 SSE2 优化 |
–disable-sse3 | 禁用 SSE3 优化 |
–disable-ssse3 | 禁用 SSSE3 优化 |
–disable-sse4 | 禁用 SSE4 优化 |
–disable-sse42 | 禁用 SSE4.2 优化 |
–disable-avx | 禁用 AVX 优化 |
–disable-xop | 禁用 XOP 优化 |
–disable-fma3 | 禁用 FMA3 优化 |
–disable-fma4 | 禁用 FMA4 优化 |
–disable-avx2 | 禁用 AVX2 优化 |
–disable-avx512 | 禁用 AVX-512 优化 |
–disable-aesni | 禁用 AESNI 优化 |
–disable-armv5te | 禁用 armv5te 优化 |
–disable-armv6 | 禁用 armv6 优化 |
–disable-armv6t2 | 禁用 armv6t2 优化 |
–disable-vfp | 禁用 VFP 优化 |
–disable-neon | 禁用 NEON 优化 |
–disable-inline-asm | 禁用内联汇编 |
–disable-x86asm | 禁用独立 x86 程序集 |
–disable-mipsdsp | 禁用 MIPS DSP ASE R1 优化 |
–disable-mipsdspr2 | 禁用 MIPS DSP ASE R2 优化 |
–disable-msa | 禁用 MSA 优化 |
–disable-msa2 | 禁用 MSA2 优化 |
–disable-mipsfpu | 禁用浮点 MIPS 优化 |
–disable-mmi | 禁用龙芯 SIMD 优化 |
–disable-fast-unaligned | 考虑未对齐访问缓慢 |
参数 | 参数作用 |
---|---|
–disable-debug | 禁用调试符号 |
–enable-debug=LEVEL | 设置调试级别 |
–disable-optimizations | 禁用编译器优化 |
–enable-extra-warnings | 启用更多编译器警告 |
–disable-stripping | 禁用剥离可执行文件和共享库 |
–assert-level=level | 0(默认),1或2,断言测试的数量,2 会导致运行时变慢 |
–enable-memory-poisoning | 用任意数据填充堆未初始化的分配空间 |
–valgrind=VALGRIND | 通过 valgrind 运行“make fate”测试以检测内存泄漏和错误,使用指定的 valgrind 二进制文件。不能与 --target-exec 结合使用 |
–enable-ftrapv | 陷阱算术溢出 |
–samples=FATE | 测试样本的路径位置 |
–enable-neon-clobber-test | 检查 NEON 寄存器的破坏(应该是仅用于调试目的) |
–enable-xmm-clobber-test | 检查 XMM 寄存器的破坏(仅限 Win64;应仅用于调试目的) |
–enable-random | 随机启用/禁用组件 |
–enable-random=LIST | 随机启用/禁用特定组件,LIST 是一个逗号分隔的列表 NAME[:PROB] 条目,其中 NAME 是一个组件(group) 和 PROB 相关的概率 名称(默认 0.5)。 |
–random-seed=VALUE | –enable/disable-random 的种子值 |
–disable-valgrind-backtrace | 在 Valgrind 下不打印回溯(仅适用于 --disable-optimizations 构建) |
–enable-ossfuzz | 启用构建模糊器工具 |
–libfuzzer=PATH | libfuzzer 的路径 |
–ignore-tests=TESTS | 被忽略的测试 |
–enable-linux-perf | 启用 Linux 性能监视器 API |
–disable-large-tests | 禁用使用大量内存的测试 |
本博文部分内容参考如下文章,特此感谢: