Windows下编译并裁剪FFmpeg

Windows 下编译并裁剪FFmpeg

本文主要介绍下如何在Windows环境下编译出FFmpeg的可执行环境ffmpeg.exe, 并通过一个例子演示如何对其进行裁剪,使其体积变小。

一. 工具与环境

  • FFmpeg 4.3。 本文选择的FFmpeg版本为4.3;
  • MSY2。Windows下的Linux Shell 模拟工具, 主要用于模拟Linux终端的一些命令和指令。

二. 编译工具安装

FFmpeg的安装过程省略,源码可以由 https://github.com/FFmpeg/FFmpeg/tags 或 FFmpeg 官网下载,下载完毕后将它解压到任意位置,如本文解压在:E:\linux_share\ffmpeg-4.3.1

image-20220819110409799

这里着重介绍一下MSY2的安装,当然,不是指安装MSY2本身,而是在MSY2安装完成之后还需要安装其它一些其它的编译依赖工具。需要额外安装的依赖工具包括:

  • MinGW64, GCC编译套件在Windows下的移植,编译FFmpeg时会用到;
  • nasm, yasm, 一组汇编编译工具,因为FFmpeg源码中包含有部分汇编代码;
  • make, FFmpeg编译前需要先生成Makefile, make工具则用于执行Makefile;
  • diffutils, FFmpeg configure 生成Makefile时会用到。

Tips: MSYS2 的安装过程可参考:https://www.msys2.org/, 这里不做介绍。

2.1 安装MinGW64

由于我们已安装了MSY2, 所以我们这里可以直接选择使用 pacman 来安装这些编译依赖工具,pacman 相当于是一个包管理器,有点类似于Ubuntu下的apt, 或是CentOS下的yum。

双击MSYS2安装目录下的 msys2.exe, 启动MSYS2 控制台环境:

image-20220822151211109

输入:pacman -S --needed base-devel mingw-w64-x86_64-toolchain, 安装MinGW64:

$ pacman -S --needed base-devel mingw-w64-x86_64-toolchain
warning: file-5.39-2 is up to date -- skipping
[... more warnings ...]
:: There are 48 members in group base-devel:
:: Repository msys
   1) asciidoc  2) autoconf  3) autoconf2.13  4) autogen
   [... more packages listed ...]

Enter a selection (default=all):
:: There are 19 members in group mingw-w64-x86_64-toolchain:
:: Repository mingw64
   1) mingw-w64-x86_64-binutils  2) mingw-w64-x86_64-crt-git
   [... more packages listed ...]

Enter a selection (default=all):
resolving dependencies...
looking for conflicting packages...

Packages (123) docbook-xml-4.5-2  docbook-xsl-1.79.2-1
               [... more packages listed ...]
               m4-1.4.18-2  make-4.3-1  man-db-2.9.3-1
               mingw-w64-x86_64-binutils-2.35.1-3
               mingw-w64-x86_64-crt-git-9.0.0.6090.ad98746a-1
               mingw-w64-x86_64-gcc-10.2.0-6
               mingw-w64-x86_64-gcc-ada-10.2.0-6
               mingw-w64-x86_64-gcc-fortran-10.2.0-6
               mingw-w64-x86_64-gcc-libgfortran-10.2.0-6
               mingw-w64-x86_64-gcc-libs-10.2.0-6
               mingw-w64-x86_64-gcc-objc-10.2.0-6
               mingw-w64-x86_64-gdb-10.1-2
               mingw-w64-x86_64-gdb-multiarch-10.1-2
              [... more packages listed ...]

Total Download Size:    196.15 MiB
Total Installed Size:  1254.96 MiB

:: Proceed with installation? [Y/n]
[... downloading and installation continues ...]

询问是否安装时,输入 y, 然后等待安装完成即可。

2.2 安装nasm yasm

输入 pacman -S nasm , 注意 S 大写:

image-20220819113138102

安装yasm

输入 pacman -S yasm

image-20220819135418666

2.3 安装make

输入 pacman -S make

image-20220819135528419

2.4 安装diffutils

输入 pacman -S diffutils

image-20220819135658788

至此所需要的编译依赖工具已经全部安装完毕。

三. FFmpeg 裁剪

本节以wav转aac为例,演示一下如何对FFmpeg进行裁剪,使其仅保留wav转aac这一核心功能。

3.1 编译参数介绍

在开始前,有必要先了解一下FFmpeg中的编译参数,为了满足不同的生产环境,减少编译后的动态链接库或可执行文件的体积,加快编译速度,FFmpeg 提供了一系列编译参数,通过打开或关闭这些编译参数,就可以根据需要对FFmpeg进行定制化编译,即我们常说的裁剪。这些编译参数位于 FFmpeg根目录下的 configure文件中:

image-20220819140410046

cd到FFmpeg 安装目录,执行 ./configure --help 即可查看所有支持的编译参数:

image-20220822142614008

可以看到,原生支持的编译参数有很多,我们这里只关注下列部分,通过对下列参数的配置即可完成裁剪功能。

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        禁用所有过滤器

简单介绍一下上面的几个选项:

  • encoder, 对应的就是编码器,比如需要将mp3格式转换成aac格式,在转换后就必然会用到aac格式的编码器;
  • decoder; 对应的就是解码器,同上,如果要转换成aac格式,就必须先要将mp3格式进行解码,这就会用到mp3格式的解码器。
  • muxer, 对应的就是封装器,主要用于生成最终的封装格式,不同的音视频格式都有其固定的文件内容格式,方便播放器对其进行识别和解析。
  • demuxer, 对应的就是解封装器,比如一个MP4封装格式可以同时容纳H264编码格式的视频和AAC编码格式的音频,如果要取出其中的音频,就需要根据一定的规则去查找音频所在的流。
  • protocol, 文件协议,FFmpeg 不仅可以支持本地音视频文件的读取和写入,也可以支持网络流媒体的读取和写入,比如你想在本地观看一个网络电视,那么你可以在FFmpeg中传入这个网络电视的http/rtsp/rtmp地址,这样就可以实现本地播放了。
  • parser, 解析并填充内部数据结构,如:AVCodecParser, 这个和decoder 一般是搭配使用的。

Note: 这里列出的是一些常用的编译选项,完整的编译选项请参考:附录一:《FFmpeg 编译参数总结》

3.2 确定需求并选择编译参数

大概了解了各个编译参数的作用之后,就可以根据需求来打开或关闭某个编译选项。

我们以wav转aac 为例, 它的转换流程如下:

FFmpeg音频转码示意图

由于我们只是转换,所以我们需要以上编译参数中的这几个:

  • protocol, 转换过程发生在本地,不需要涉及到网络,所以可以直接将 protocol 设为 file;
  • demuxer, 解封装,我们需要解析wav文件中的格式信息,了解其原始的编码细节(样本格式,采样率,声道数...);
  • decoder, 解码,音频转换一般都是先将源文件格式转换成PCM格式,再进行编码;
  • encoder, 编码,如果要编码成AAC格式,那就必须符合AAC格式的编码要求(ADTS或ADIF), 只有这样输出后的文件未来播放器在播放时才可能把它当做是AAC格式来解析。
  • muxer, 封装,最终需要将编码得到的所有音频帧合并并输出为AAC格式,重新封装必不可少。

3.3 确定编译参数

以上我们初步选择了未来可能会用到的一些编译参数,但是究竟参数值应该设为多少,还需要进一步探究。下面分别对以上的参数选项做进一步分析:

protocol

没什么好说的,转码是在本地进行的,不支持网络,所以这里直接写file就行。

demuxer

我们需要操作的源文件格式是wav, 那这里写wav就行。

decoder

要想解码该文件,首先必须要先知道该文件是怎么编码的,我们随便打开一个wav 文件,使用ffmpeg.exe(未编译前需要额外下载)查看其详细信息:

image-20220819164305540

蓝色部分可以清楚的看到,该文件的编码格式为PCM, 样本格式为s16le (有符号数16bit 小端格式);

是所有的wav文件都是这样编码的么?再打开一个:

image-20220819164804569

可以看到,它的文件编码格式为PCM,样本格式却是:s24le(有符号数24bit, 小端格式)

其它的就不看了,至少能得出一个结论,后缀名为wav的文件,它的编码格式是不定的,事实上,WAV格式相当于是对PCM格式做了一层封装,但是封装的PCM的样本格式却是不确定的,我们无法得知未来给到的wav文件究竟采用的是哪种样本格式(f16, f32, s16.... ?)。既然如此,只需要让解码器支持所有的pcm格式即可,若要支持所有的pcm格式,需要写成:pcm*

encoder

我们最终编码要生成的格式是aac, 这里写aac, 默认输出的格式是AAC-LC。

muxer

封装这里我们选择将AAC流打包成ADTS 格式, 所以这里填 adts ,这也是目前比较常用的一种AAC编码格式。

filter

由于这里涉及到音频重采样,所里这里将filter的值设置为 aresample即可。

3.4 编写编译脚本

先禁用所有模块:

--disable-everything 

再开启上述模块:

--enable-protocol=file --enable-demuxer=wav --decoder=pcm* --encoder=aac --muxer=adts

指定输出目录在FFmpeg 根目录的 windows目录下:

--prefix=./windows

完整的编译脚本如下:

./configure --prefix=./windows --disable-everything --enable-protocol=file --enable-demuxer=wav --enable-decoder=pcm* --enable-encoder=aac --enable-muxer=adts --enable-filter=aresample --disable-autodetect --disable-avdevice --disable-swscale --extra-ldflags='-Wl,-Bstatic -lpthread'

Note: --enable-filter=aresample 开启是因为转码的过程中还会用到重采样;--disable-autodetect 主要是用于关闭默认所有外部依赖库, --disable-avdevice 主要是用于关闭FFmpeg的 AVDevice模块,这个模块主要是用于操作外部设备的,转码的时候用不到;--disable-swscale 主要是用于视频图像的像素格式转换的,这个模块我们也不需要。

--extra-ldflags='-Wl,-Bstatic -lpthread' 代表编译时静态链接 pthread 线程库,如果不指定此参数,在编译完成后,需要把 libwinpthread-1.dll 这个库文件与ffmpeg.exe 放置到同一目录下,否则ffmpeg.exe无法运行。

四. FFmpeg 编译

双击打开MSYS2 目录下的MinGW64程序:

image-20220822152156680

注意: 是mingw64.exe, 不是mingw32.exe, mingw64可以同时编译32位和64位的ffmpeg程序,后续的编译过程都是mingw64.exe下完成的。

cd 到 FFmpeg的安装目录,

# cd E:\\linux_share\\ffmpeg-4.3.1

拷贝上述脚本,然后回车,准备生成Makefile:

image-20220822153259054

开始执行后,并不会立即输出结果,大概要等1~2分钟的样子才会给出结果,这是因为FFmpeg会对编译脚本进行预校验,检查编译脚本是否有误,若编译脚本存在问题,不满足生成Makefile的条件,FFmpeg会报错,并将错误结果保存在 ffbuild/config.log目录下:

image-20220822103521830

若脚本正确,FFmpeg会列出当前编译的详细信息,包括支持的编码器、依赖库、编译位数、开关选项等等:

image-20220822103817641

若可以输出以上信息,则代表Makefile生成成功,接下来就可以正式编译了。

执行 make -j4, 开始编译FFmpeg:

image-20220822104001747

等待编译完成后再执行 make install,将编译完成的文件输出到之前指定的目录下(我们之前指定的目录是FFmpeg根目录下的windows目录)。

image-20220822104229063

等待install 结束,打开 FFmpeg目录下的windows目录:

image-20220822104559537

出现如上所示就说明编译已经全部完成了。

五. 编译验证

经过上面几步,我们已经顺利得到 FFmpeg的可执行档 ffmpeg.exe了,但是请注意:编译成功不代表可以执行成功,我们还需要实际验证一下此文件是否可以完成转码功能。随便找一个wav 文件,执行转码命令:

image-20220822105545875

看看是否有输出错误信息或是无法生成转码后的.aac文件。

image-20220822110114319

若是出现像上方提示的红色文字或是找不到转换后的.aac文件就说明无法完成转码,这个时候就需要重新检查一下之前的编译脚本了,有可能是某些参数设置得不正确,也有可能是某些参数没有配置导致的。

附录一:FFmpeg 编译参数汇总

1.1 Help options 帮助选项

参数参数作用
–help打印显示帮助信息
–quiet禁止显示信息输出
–list-decoders显示所有可用的解码器
–list-encoders显示所有可用的编码器
–list-hwaccels显示所有可用的硬件加速器
–list-demuxers显示所有可用的解复用器
–list-muxers显示所有可用的复用器
–list-parsers显示所有可用的解析器
–list-protocols显示所有可用的协议
–list-bsfs显示所有可用的比特流过滤器
–list-indevs显示所有可用的输入设备
–list-outdevs显示所有可用的输出设备
–list-filters显示所有可用的过滤器

1.2 Standard options 标准选项

参数参数作用
–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=DIRDarwin 已安装目标的目录名称

1.3 Licensing options 证书选项

参数参数作用
–enable-gpl允许使用GPL代码,编译的库和二进制文件处于GPL许可下,默认为否
–enable-version3升级(L)GPL到版本3,默认为否
–enable-nonfree允许使用非自由代码,并且二进制文件将不可再分发,默认为否

1.4 Configuration options 配置选项

参数参数作用
–disable-static不构建静态库,默认为否
–enable-shared构建共享动态库,默认为否
–enable-small优化大小而不是速度
–disable-runtime-cpudetect禁用在运行时检测 CPU 功能(较小的二进制文件)
–enable-gray启用全灰度支持(较慢的颜色)
–disable-swscale-alpha在 swscale 中禁用 alpha 通道支持
–disable-all禁用构建组件、库和程序
–disable-autodetect禁用自动检测到的外部库,默认为否

1.5 Program options 程序选项

参数参数作用
–disable-programs不构建命令行程序
–disable-ffmpeg禁用 ffmpeg 构建
–disable-ffplay禁用 ffplay 构建
–disable-ffprobe禁用 ffprobe 构建

1.6 Documentation options 文档选项

参数参数作用
–disable-doc不构建文档
–disable-htmlpages不构建 HTML 文档页面
–disable-manpages不构建手册文档页面
–disable-podpages不构建 POD 文档页面
–disable-txtpages不构建文本文档页面

1.7 Component options 组件选项

参数参数作用
–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 中禁用像素工具

1.8 Individual component options 独立组件选项

参数参数作用
–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禁用所有过滤器

1.9 External library support 扩展库支持

使用以下任何选项将允许 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 代码 [自动检测]

1.10 Toolchain options 工具链选项

参数参数作用
–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”覆盖环境变量

1.11 Advanced options 高级选项

参数参数作用
–malloc-prefix=PREFIX前缀 malloc 和带有 PREFIX 的相关名称
–custom-allocator=NAME使用支持的自定义分配器
–disable-symver禁用符号版本控制
–enable-hardcoded-tables使用硬编码表而不是运行时生成
–disable-safe-bitstream-reader在位读取器中禁用缓冲区边界检查(更快,但可能会崩溃)
–sws-max-filter-size=N swscale使用的最大过滤器大小 ,默认为256

1.12 Optimization options 优化选项

参数参数作用
–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考虑未对齐访问缓慢

1.13 开发人员选项

参数参数作用
–disable-debug禁用调试符号
–enable-debug=LEVEL设置调试级别
–disable-optimizations禁用编译器优化
–enable-extra-warnings启用更多编译器警告
–disable-stripping禁用剥离可执行文件和共享库
–assert-level=level0(默认),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=PATHlibfuzzer 的路径
–ignore-tests=TESTS被忽略的测试
–enable-linux-perf启用 Linux 性能监视器 API
–disable-large-tests禁用使用大量内存的测试

NOTE: 基于FFmpeg 4.4.1, From: FFmpeg - ./configure编译参数全部总结和整理

附录二. 使用VS2019编译FFmpeg

本节主要介绍下如何在Windows下使用Visual Studio 2019 来编译FFmpeg。

2.1 配置环境变量

由于Windows平台编译的特殊性,在正式开始之前,我们需要配置一下相关的环境变量,以确保编译FFmpeg时能够找到相关的编译器、链接器、运行时库。

打开VS2019 命令行工具,找到x64_x86 Cross Tools Command Prompt For VS 2019 , 右击以管理员身份运行。

注意:最好以管理员权限运行,否则后续在执行make install 指令时可能会发生权限不足的问题,切记。

image-20220823142655746

这几个工具该如何选择?

如果是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 到msys2 安装目录, 执行 msys2_shell.cmd -mingw64, 启用MinGW的64位运行环境:

image-20220823142942703

在新启动的msys窗口中执行 cl, 看看是否能找到VS2019 自带的 cl 编译器:

如果提示:bash: cl: 未找到命令:

image-20220823103106860

则说明msys 控制台系统中并没有共享我们本地的VS2019的运行环境,因此需要将 VS2019的运行环境添加到 msys 的控制台系统当中,目的要保证能在msys的环境中要能运行VS2019的控制台。

打开刚才msys2的安装路径,找到:msys2_shell.cmd 文件,打开:

image-20220823103323859

找到:

rem set MSYS2_PATH_TYPE=inherit

将其修改为:

set MSYS2_PATH_TYPE=inherit

以允许msys 继承外部的环境变量:

image-20220823103506882

修改完毕后保存,然后关闭之前打开的msys控制台窗口,再次执行 msys2_shell.cmd -mingw64 重新打开msys窗口,看看是否能找到cl:

image-20220823143244120

如上图所示,代表已经可以找到 VS 的 cl 编译器。

注意 有些时候你输入cl后,msys控制台有可能会输出乱码,遇到乱码是因为字符编码不一致导致的,可以右击msys2的标题栏,依次选择“Options”-"Text", 分别修改Locale 和 Character set 为 “zh_CN” 和 “UTF-8”。

img

修改完毕后,回到msys的控制台,再次执行cl,这样就不会有乱码了。

2.2 检查编译环境

这一步我们主要检查下VS 编译器和链接器的位置是否配置正确。

在msys窗口中分别输入 which clwhich link 查看当前编译器和链接器的位置:

image-20220823143805550

可以看到 cl 编译器的位置是正确的,link 链接器的位置是不正确的,这是因为目前找到的链接器默认为MSYS的链接器,MSYS默认也携带了一个名为link.exe的链接器(在:msys安装目录/usr/bin/link.exe),它与Visual Studio 自带的link.exe发生了冲突,这会影响之后构建系统的构建,我们这里要使用的是Visual Studio 自带的link.exe

找到MSYS自带的link.exe, 将它改成别的名字,比如我将其重命名为link.exe.bat:

image-20220823110152690

再次输入 which link:

image-20220823144127032

可以看到,修改后 link.exe的位置就正确了。

2.3 开始编译

编译脚本为:

./configure --toolchain=msvc --arch=i386 --prefix=./windows --disable-everything --enable-protocol=file --enable-demuxer=wav --enable-decoder=pcm* --enable-encoder=aac --enable-muxer=adts --enable-filter=aresample --disable-autodetect --disable-avdevice --disable-swscale 

Tips: Visual Studio 下的编译注意事项可以参考FFmpeg 官方WIKI: CompilationGuide/MSVC

cd 到 FFmpeg 安装目录,拷贝上述脚本准备生成Makefile:

image-20220823144712482

等待生成完毕,然后执行 make -j16, 开始编译FFmpeg:

image-20220823144928209

编译完成后,执行 make install,将编译完成的文件输出到之前指定的目录下:

image-20220823145107880

查看输出结果:

image-20220823145154188

2.4 编译验证

在ffmpeg.exe的当前目录打开cmd, 然后输入ffmpeg, 查看编译信息:

image-20220823145657644

可以看到 built with Microsoft (R) C/C++ Optimizing Compiler Version 19.29.30139 for x86 的输出信息,说明这个exe文件确实是由VS编译输出的。

找一个wav文件进行测试,比如我们需要将下列WAV文件转码成单声道,采样率为48000 的aac格式:

image-20220823150437589

如果没有输出错误信息,则代表转码成功。

<完>

posted @ 2022-08-24 14:30  夜行过客  阅读(2272)  评论(0编辑  收藏  举报