在 Ubuntu 上编译全功能 FFmpeg 的完整指南

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 现在就是 git
  • libdc1394-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

故障排查技巧

  1. 阅读第一个真正的错误,而不是只看最后的 make 失败行。有用的信息通常出现在输出的更早位置。
  2. 如果报告某个库缺失,安装它的 -dev 软件包,并确认它出现在 pkg-config 中。
  3. 配置失败后检查 ffbuild/config.log。它记录了失败的具体编译器和链接器测试。
  4. 注意许可证。--enable-gpl--enable-version3--enable-nonfree 会影响最终二进制文件的分发方式。
  5. 如果编译时磁盘空间不足,可以用 make clean 清理临时构建文件,或在空间更大的目录中构建。
  6. 如果安装后的二进制文件找不到共享库,运行 sudo ldconfig,并用 ldd "$(which ffmpeg)" 检查库路径。

结论

从源码编译 FFmpeg 可以让你最大限度地控制编解码器、滤镜、许可证选择和安装路径。它比安装 Ubuntu 软件包需要更多工作,但当你需要特定功能集或更新的 FFmpeg 版本时,这样做是值得的。

按照本指南完成后,请使用 ffmpeg -versionffmpeg -buildconf 和一个小型转码测试来验证你的构建。通过这些检查后,你的自定义 FFmpeg 构建就可以用于实际的音频和视频处理工作了。

Leave a Reply