Linux下编译FFmpeg
作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音
在FFmpeg 支持的众多系统中,用 Ubuntu 来编译调试是最顺手的,所以本书以 Ubuntu 为例,其他的 Linux 操作系统也可以参考本文。
1,安装 Ubuntu 22.04 LTS 操作系统
我们先安装 VMware ,然后再安装上 Ubuntu 22.04 LTS 的系统,安装完成后,如下:

2,下载 FFmpeg-n4.4.1.zip 代码
https://github.com/FFmpeg/FFmpeg/archive/refs/tags/n4.4.1.zip
下载完 zip 压缩包之后,我是解压放到 Documents 目录下面,如下:

3,安装一些必要的软件
apt-get install diffutils make pkg-config yasm
apt-get install libsdl2-2.0
apt-get install libsdl2-dev
4,执行 configure
configure 负责检测当前的系统环境能否正常编译 FFmpeg,以及生成 ffbuild 目录下的 config.mak 文件。
#进入 FFmpeg 源码目录
cd /home/ubuntu/Documents/FFmpeg-n4.4.1
#执行检测脚本
./configure \
--enable-gpl \
--enable-nonfree \
--enable-debug=3 \
--disable-optimizations \
--disable-asm \
--disable-stripping
--enable-debug=3 这个选项是开启调试模式的,这样会产生调试符号,方便 gdb 进行调试。
--disable-optimizations 是关闭代码优化的,也是方便调试,因为有时候优化代码会改变代码原来的运行顺序1,导致调试的时候跳转看起来很奇怪。
--disable-asm 是关闭汇编代码优化的,FFmpeg 里面有些 C 函数有对应的汇编加速版本,但是对于初学者来说,C代码通常比汇编代码更易读。
--disable-stripping 是防止删除调试符号的,FFmpeg 会生成两个可执行文件,ffmpeg 与 ffmpeg_g。默认情况下,ffmpeg 是删除了调试信息的,而 ffmpeg_g 保留调试信息。使用了 --disable-stripping 可以保护 ffmpeg 可执行文件不被删除调试信息。这样你调试 ffmpeg 或者 ffmpeg_g 都是一样的。
configure 会生成根目录的 Makefile 文件吗?
网上的一些其他的教程会说 configure 脚本会生成 Makefile 文件,但其实不是的。FFmpeg 根目录的 Makefile 不是 configure 生成的,它一直就在。
configure 脚本生成的是 ffbuild 目录下的 config.mak 文件,这也是一个 Makefile 文件,而且很关键,没它就无法执行 make 编译。
configure 是一个 shell 脚本,是由一堆 Linux 命令组成的。他会不会生成根目录的 Makefile 是由他的内部shell代码决定的。有些开源项目会生成根目录的 Makefile,有些项目则不会,例如 FFmpeg。
5,正式开始编译FFmpeg
configure 执行完之后如果没有报错,我们就可以使用 make 命令正式开始编译FFmpeg。
make -j16
-j 参数可以指定编译线程数量,请选择合适的数量。
make 编译完之后,如果能在目录下看到 ffmpeg_g、ffplay_g 等文件,就算编译成功了。

你可以继续执行 make install 把 FFmpeg 可执行文件安装到 prefix 目录,但是我通常不这么做。我直接就在当前目录下调试 ffmpeg_g 了,因为他是静态库编译,不依赖动态库。
1. 这是编译器的优化能力,改变代码原来的运行顺序是为了能让更多的指令能并行,最后运行的结果跟原来是一样的。指令级并行(Instruction-Level Parallelism)相关的技术可以看《深入理解计算机系统》第5章 跟 《计算机体系结构》第3章。 ↩