FFmpeg 是多媒体处理领域的瑞士军刀。它几乎可以处理你能想到的任何音频或视频任务:转码、重新封装、滤镜处理、流媒体、提取元数据、生成缩略图、音频响度标准化,等等。
Ubuntu 仓库中的软件包对很多用户来说已经足够好,但从源码编译 FFmpeg 可以让你更精细地控制编解码器、滤镜、许可证选择和构建选项。当你需要比发行版打包版本更新的 FFmpeg 时,这也很有用。
本指南会介绍如何在 Ubuntu 上编译带有大量常用功能的 FFmpeg,并给出你在过程中可能遇到的几个错误的修复方法。
为什么要从源码编译 FFmpeg?
在以下情况下,自己编译 FFmpeg 会很有用:
- 需要比
apt提供的版本更新的 FFmpeg - 需要发行版构建中省略的编解码器或滤镜支持
- 需要控制 GPL、version 3 和 non-free 组件
- 需要针对硬件的优化
- 需要为服务器或工作站提供可复现的构建配置
代价是维护成本。源码构建不会由 Ubuntu 的包管理器自动更新,因此当你需要安全修复或新功能时,需要自行重新构建。
前提条件
本指南假设你具备:
- Ubuntu 24.04 Noble Numbat,或类似的较新 Ubuntu 版本
- 基本的终端使用经验
sudo权限- 足够的磁盘空间,用于源码文件、构建产物和依赖项
开始之前,先检查系统中是否已经安装了 FFmpeg:
ffmpeg -version
which ffmpeg
如果已经安装了 Ubuntu 打包的 FFmpeg,而你之后又把自定义构建安装到 /usr/local 下,那么取决于你的 PATH 顺序,shell 可能会优先使用 /usr/local/bin/ffmpeg。安装后请验证这一点。
第 1 步:下载 FFmpeg 源码
创建源码目录并下载 FFmpeg 发布版 tarball:
mkdir -p ~/ffmpeg_sources
cd ~/ffmpeg_sources
wget https://ffmpeg.org/releases/ffmpeg-7.1.1.tar.bz2
tar xjf ffmpeg-7.1.1.tar.bz2
cd ffmpeg-7.1.1
如果你想使用其他版本,请到官方 FFmpeg 下载页面查看当前版本,并相应调整文件名。
第 2 步:安装构建依赖
安装编译工具链和开发库:
sudo apt-get update
sudo apt-get install -y
autoconf
automake
build-essential
cmake
git
libass-dev
libfreetype-dev
libgnutls28-dev
libmp3lame-dev
libsdl2-dev
libtool
libva-dev
libvdpau-dev
libvorbis-dev
libxcb1-dev
libxcb-shm0-dev
libxcb-xfixes0-dev
meson
ninja-build
pkg-config
texinfo
wget
yasm
nasm
zlib1g-dev
libx264-dev
libx265-dev
libnuma-dev
libvpx-dev
libfdk-aac-dev
libopus-dev
libdav1d-dev
libtheora-dev
libfribidi-dev
libharfbuzz-dev
libfontconfig1-dev
libpulse-dev
libsoxr-dev
libspeex-dev
libxml2-dev
libzvbi-dev
libbs2b-dev
libsnappy-dev
libgsm1-dev
libopencore-amrnb-dev
libopencore-amrwb-dev
libbluray-dev
libssh-dev
libssl-dev
libopenal-dev
librubberband-dev
libfftw3-dev
libopenmpt-dev
不同 Ubuntu 版本之间,软件包名称可能会变化。如果 apt 报告 Unable to locate package,请搜索当前名称:
apt search freetype dev
apt search libdc1394
排查软件包问题
在 Ubuntu 24.04 Noble 上,一些软件包名称与旧版指南不同:
libfreetype6-dev现在通常以libfreetype-dev安装git-core现在就是gitlibdc1394-22-dev现在通常以libdc1394-dev安装
某些可选软件包,例如 libflite-dev,可能无法从标准仓库获取。在这种情况下,可以省略对应的 FFmpeg 选项,启用另一个提供该软件包的仓库,或从源码构建该依赖。
第 3 步:配置 FFmpeg
使用你想启用的功能运行 FFmpeg 的 configure 脚本:
./configure
--prefix=/usr/local
--enable-gpl
--enable-version3
--enable-nonfree
--enable-shared
--enable-libass
--enable-libfdk-aac
--enable-libfreetype
--enable-libmp3lame
--enable-libopus
--enable-libtheora
--enable-libvorbis
--enable-libvpx
--enable-libx264
--enable-libx265
--enable-pthreads
--enable-libspeex
--enable-libsoxr
--enable-libxml2
--enable-libbluray
--enable-libfontconfig
--enable-libfribidi
--enable-libharfbuzz
--enable-libpulse
--enable-gnutls
这套配置启用了一系列音频、视频、字幕、字体和网络相关功能。它还启用了 --enable-nonfree,因为 libfdk-aac 需要该选项。使用 --enable-nonfree 配置出的构建不能按照 FFmpeg 的常规许可条款再分发,因此请把它用于你自己的系统,而不是打包给他人使用。
常见配置错误及解决方案
1. 缺少 FreeType 头文件
你可能会看到:
fatal error: ft2build.h: No such file or directory
#include <ft2build.h>
安装 FreeType 开发包:
sudo apt-get install libfreetype-dev
然后重新运行 ./configure。
2. 找不到 NASM/YASM
你可能会看到:
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
安装 NASM:
sudo apt-get install nasm
然后重新运行 ./configure。你可以使用 --disable-x86asm,但这会禁用重要的汇编优化,通常不是正确的修复方式。
3. 找不到 LibASS
你可能会看到:
ERROR: libass >= 0.11.0 not found using pkg-config
安装 LibASS 开发包:
sudo apt-get install libass-dev
然后确认 pkg-config 能看到它:
pkg-config --modversion libass
4. GnuTLS 和 OpenSSL 冲突
你可能会看到:
GnuTLS and OpenSSL must not be enabled at the same time.
选择一个 TLS 后端。例如:
./configure --enable-gnutls
或者:
./configure --enable-openssl
不要在同一个 FFmpeg 构建中同时启用两者。
第 4 步:编译并安装 FFmpeg
配置成功后,编译 FFmpeg:
make -j"$(nproc)"
这会使用所有可用 CPU 核心。根据你的硬件和所选功能,构建可能需要几分钟到半小时。
安装编译好的二进制文件和库:
sudo make install
更新共享库缓存:
sudo ldconfig
如果你的 shell 仍然找到旧的 FFmpeg 二进制文件,请检查路径顺序:
which ffmpeg
echo "$PATH"
你可能需要打开一个新的 shell,或调整 PATH,让 /usr/local/bin 在 /usr/bin 之前被搜索。
第 5 步:验证安装
检查已安装的 FFmpeg 版本和配置:
ffmpeg -version
ffmpeg -buildconf
确认预期的编码器、解码器和滤镜都存在:
ffmpeg -encoders
ffmpeg -decoders
ffmpeg -filters
对于定向检查,可以使用 grep。例如:
ffmpeg -encoders | grep -E 'libx264|libx265|libfdk_aac|libopus'
ffmpeg -filters | grep subtitles
做一个简单的转码测试也很有用:
ffmpeg -f lavfi -i testsrc2=size=1280x720:rate=30 -f lavfi -i sine=frequency=1000:sample_rate=48000 -t 5 -c:v libx264 -c:a aac test-output.mp4
ffprobe test-output.mp4
自定义你的构建
上面的配置覆盖面很广,但并不是唯一合理的构建方式。请根据你的实际使用场景添加或移除选项。
对于硬件加速,具体选项取决于你的 GPU、驱动和 SDK 安装情况。常见的调查方向包括:
- Intel 或 AMD 系统上的 VAAPI:
--enable-vaapi - NVIDIA NVENC/NVDEC 支持:核对当前 FFmpeg 文档,以及你的 FFmpeg 版本所需的 NVIDIA codec headers
- CUDA 相关工作流:核对 CUDA toolkit,以及你已安装版本支持的 FFmpeg 选项
对于更多格式和库,可以考虑:
--enable-libopenmpt,用于 tracker 音乐格式--enable-libgsm,用于 GSM 音频--enable-librubberband,用于时间拉伸和音高变换--enable-libsoxr,用于高质量音频重采样
启用某个选项之前,请确认对应的开发包已经安装,并且能被 pkg-config 看到:
pkg-config --list-all | grep -i soxr
pkg-config --modversion soxr
请查阅官方 FFmpeg Compilation Guide 和 configure 帮助,以获取与你的版本最匹配的准确选项:
./configure --help
故障排查技巧
- 阅读第一个真正的错误,而不是只看最后的
make失败行。有用的信息通常出现在输出的更早位置。 - 如果报告某个库缺失,安装它的
-dev软件包,并确认它出现在pkg-config中。 - 配置失败后检查
ffbuild/config.log。它记录了失败的具体编译器和链接器测试。 - 注意许可证。
--enable-gpl、--enable-version3和--enable-nonfree会影响最终二进制文件的分发方式。 - 如果编译时磁盘空间不足,可以用
make clean清理临时构建文件,或在空间更大的目录中构建。 - 如果安装后的二进制文件找不到共享库,运行
sudo ldconfig,并用ldd "$(which ffmpeg)"检查库路径。
结论
从源码编译 FFmpeg 可以让你最大限度地控制编解码器、滤镜、许可证选择和安装路径。它比安装 Ubuntu 软件包需要更多工作,但当你需要特定功能集或更新的 FFmpeg 版本时,这样做是值得的。
按照本指南完成后,请使用 ffmpeg -version、ffmpeg -buildconf 和一个小型转码测试来验证你的构建。通过这些检查后,你的自定义 FFmpeg 构建就可以用于实际的音频和视频处理工作了。
