需要转码、重新封装、滤镜处理、检查媒体、流式传输或生成音视频时,FFmpeg 往往是我首先使用的工具。对多数机器而言,Ubuntu 打包的版本是正确选择;但如果我需要更新的版本,或必须精确控制外部库,源码构建就很有用。
本指南在 Ubuntu 24.04 LTS(Noble)上构建 FFmpeg 9.0.1,并安装到当前用户主目录中的版本化目录。这样不会覆盖/usr/bin/ffmpeg,不会通过sudo make install向/usr/local写入未受软件包管理的文件,而且可以先测试新构建,再修改PATH。
文中的软件包名称和版本链接已于 2026 年 9 月 1 日根据 Ubuntu 与 FFmpeg 官方资料核对。这是一套覆盖面较广的实用构建,并非字面意义上的“FFmpeg 全功能”:FFmpeg 有大量可选库、无法同时满足的许可证组合,以及依赖具体硬件的 SDK。
Table of Contents
先判断是否真的需要源码构建
检查当前已经安装的版本:
if command -v ffmpeg >/dev/null 2>&1; then
command -v ffmpeg
ffmpeg -version | sed -n '1p'
fi
如果 Ubuntu 版本已经提供你需要的编解码器和滤镜,请使用会得到持续维护的软件包,到这里就可以结束:
sudo apt update
sudo apt install ffmpeg
Ubuntu 软件包会通过 APT 获取更新,源码构建则不会。选择源码路线后,你需要自行关注 FFmpeg 新版本,并针对重要修复重新构建。
这套构建会启用什么
下面的配置加入了常用 CPU 编解码器,以及字幕和音频功能:
- 通过 x264 和 x265 进行 H.264 与 HEVC 编码
- 通过 libvpx 支持 VP8 和 VP9
- 通过 dav1d 解码 AV1
- MP3、Opus、Vorbis 和 Theora 支持
- ASS 字幕与
drawtext相关字体塑形 - SoX Resampler,以及通过 GnuTLS 提供的 HTTPS
FFmpeg 原生 AAC 编码器仍然可用,因此这套构建不需要 Fraunhofer FDK AAC 或--enable-nonfree。基础方案有意不包含硬件编码器,因为相关要求取决于 GPU、驱动、头文件和 FFmpeg 版本。
第 1 步:安装明确需要的构建依赖
以下软件包名称都存在于 Ubuntu 24.04 官方软件包索引中。部分外部编解码器开发包位于 Ubuntu 的universe组件,因此请确认官方 Noble 软件源已启用。
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential \
ca-certificates \
curl \
gpg \
libass-dev \
libdav1d-dev \
libfreetype-dev \
libfribidi-dev \
libgnutls28-dev \
libharfbuzz-dev \
libmp3lame-dev \
libopus-dev \
libsoxr-dev \
libtheora-dev \
libvorbis-dev \
libvpx-dev \
libx264-dev \
libx265-dev \
nasm \
pkg-config \
xz-utils \
zlib1g-dev
如果 APT 找不到某个软件包,不要直接粘贴命令添加无关的 PPA。先确认 Ubuntu 版本和已配置的软件源:
. /etc/os-release
printf '%s %s\n' "$NAME" "$VERSION_ID"
apt-cache policy libx264-dev libx265-dev libass-dev
这些命令专门面向 Ubuntu 24.04。用于其他 Ubuntu 版本之前,请在官方索引中重新核对软件包名称。
第 2 步:下载并验证签名源码版本
用变量保存版本、工作目录和安装前缀。不要覆盖旧的或修改过的源码树,应把它们另行保存。
FFMPEG_VERSION='9.0.1'
FFMPEG_WORK_DIR="$HOME/src/ffmpeg-$FFMPEG_VERSION-build"
FFMPEG_PREFIX="$HOME/.local/ffmpeg-$FFMPEG_VERSION"
mkdir -p "$FFMPEG_WORK_DIR"
cd "$FFMPEG_WORK_DIR"
curl --fail --location \
--output "ffmpeg-$FFMPEG_VERSION.tar.xz" \
"https://ffmpeg.org/releases/ffmpeg-$FFMPEG_VERSION.tar.xz"
curl --fail --location \
--output "ffmpeg-$FFMPEG_VERSION.tar.xz.asc" \
"https://ffmpeg.org/releases/ffmpeg-$FFMPEG_VERSION.tar.xz.asc"
curl --fail --location \
--output ffmpeg-devel.asc \
https://ffmpeg.org/ffmpeg-devel.asc
除了 tarball 签名,还要验证签名密钥指纹。使用临时 GnuPG 主目录,可以让这次检查与用户日常使用的密钥环相互隔离:
FFMPEG_GPG_HOME="$(mktemp -d)"
chmod 700 "$FFMPEG_GPG_HOME"
gpg --homedir "$FFMPEG_GPG_HOME" --import ffmpeg-devel.asc
gpg --homedir "$FFMPEG_GPG_HOME" --with-colons --fingerprint \
| awk -F: '$1 == "fpr" {print $10}' \
| grep -Fx 'FCF986EA15E6E293A5644F10B4322F04D67658D8'
gpg --homedir "$FFMPEG_GPG_HOME" --verify \
"ffmpeg-$FFMPEG_VERSION.tar.xz.asc" \
"ffmpeg-$FFMPEG_VERSION.tar.xz"
如果指纹比较或签名验证失败,请不要继续。两项都成功后再解压:
tar -xf "ffmpeg-$FFMPEG_VERSION.tar.xz"
cd "$FFMPEG_WORK_DIR/ffmpeg-$FFMPEG_VERSION"
第 3 步:配置版本化的用户级构建
运行所下载版本自带的 configure 脚本:
./configure \
--prefix="$FFMPEG_PREFIX" \
--disable-doc \
--enable-gpl \
--enable-gnutls \
--enable-libass \
--enable-libdav1d \
--enable-libfreetype \
--enable-libfribidi \
--enable-libharfbuzz \
--enable-libmp3lame \
--enable-libopus \
--enable-libsoxr \
--enable-libtheora \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265
这里有意不使用--enable-shared。安装后的 FFmpeg 程序仍会使用 Ubuntu 的外部编解码器库,但这套方案不会把自定义 FFmpeg 共享库加入系统动态加载路径,也不需要运行sudo ldconfig。
添加其他参数之前,请查看刚下载的源码版本自身提供的 configure 帮助:
./configure --help
如果 configure 失败,有用的信息通常位于ffbuild/config.log末尾附近。对于某个应该存在的库,也可以直接询问pkg-config:
tail -n 80 ffbuild/config.log
pkg-config --modversion x264
pkg-config --modversion libass
遇到 NASM 缺失错误时,除非你确实想放弃优化过的 x86 汇编,否则不要用--disable-x86asm绕过。请安装 Noble 的nasm软件包,再重新运行 configure。
第 4 步:不使用sudo完成构建和安装
根据机器情况选择并行任务数。4 是比较保守的起点;小型虚拟机可以调低,只有确认内存充足后才应调高。
FFMPEG_JOBS="${FFMPEG_JOBS:-4}"
make -j"$FFMPEG_JOBS"
make install
由于FFMPEG_PREFIX位于当前用户的主目录中,make install不应需要 root 权限。如果出现权限请求,请停止并检查./configure显示的 prefix,不要直接加上sudo。
第 5 步:验证刚刚构建的准确二进制文件
验证时使用绝对路径,避免旧的/usr/bin/ffmpeg掩盖问题:
FFMPEG_BIN="$FFMPEG_PREFIX/bin/ffmpeg"
FFPROBE_BIN="$FFMPEG_PREFIX/bin/ffprobe"
"$FFMPEG_BIN" -version
"$FFMPEG_BIN" -buildconf
"$FFMPEG_BIN" -hide_banner -encoders \
| grep -E 'libx264|libx265|libvpx|libmp3lame|libopus'
"$FFMPEG_BIN" -hide_banner -filters \
| grep -E 'drawtext|subtitles|aresample'
下面的冒烟测试会自行生成一段短视频和声音,完成编码并检查结果,不需要使用个人媒体文件:
FFMPEG_TEST_OUTPUT="$FFMPEG_WORK_DIR/ffmpeg-smoke-test.mp4"
"$FFMPEG_BIN" -hide_banner \
-f lavfi -i 'testsrc2=size=640x360:rate=30' \
-f lavfi -i 'sine=frequency=1000:sample_rate=48000' \
-t 3 \
-c:v libx264 -preset veryfast -pix_fmt yuv420p \
-c:a aac -shortest -y "$FFMPEG_TEST_OUTPUT"
"$FFPROBE_BIN" -v error \
-show_entries stream=index,codec_name,codec_type \
-show_entries format=duration \
-of json "$FFMPEG_TEST_OUTPUT"
构建命令成功,并不能证明每一种编解码器、滤镜、设备或驱动都可以工作。请检查你实际准备使用的具体路径。
用 LazyEdit 让这套构建进入实际工作流
编译 FFmpeg 通常只是准备工作,并不是最终的工作流。我维护着 LazyEdit:这是 LazyingArt 的开源视频工作流,用于预处理、转写、多语言字幕、关键帧、元数据和可选的发布环节。
LazyEdit 通常可以直接使用 Ubuntu 打包的 FFmpeg,并不特别要求 FFmpeg 9.0.1。只有在确实缺少所需编解码器或滤镜时,源码构建才有意义。如果使用本指南中的自定义 prefix,请在实际运行 LazyEdit 的同一个 shell、tmux 会话、容器或服务中,确认ffmpeg和ffprobe都解析到该目录。只在一个交互式 shell 中修改PATH,并不能证明服务也使用同一套二进制文件。
不替换 Ubuntu 软件包,直接使用自定义构建
只在当前 shell 中使用:
export PATH="$FFMPEG_PREFIX/bin:$PATH"
hash -r
type -a ffmpeg
ffmpeg -version | sed -n '1p'
验证完成后,才把版本化 prefix 放入持久化的PATH。升级时请构建到新的 prefix,先用绝对路径测试,再切换PATH项。保留/usr/bin中的 Ubuntu 打包版本,可以得到明确的回退路径。
许可证:GPL 与 non-free 选项
FFmpeg 默认采用 LGPL,但这套方案启用了 x264 和 x265,因此使用了--enable-gpl。如果要分发生成的二进制文件,请阅读 FFmpeg 的 GPL 合规说明,并检查所有链接库的许可证。
基础方案使用 FFmpeg 原生 AAC 编码器。如果加入libfdk-aac-dev,FFmpeg 编解码器文档要求使用--enable-libfdk-aac;把它和这里的 GPL 配置组合时,还必须添加--enable-nonfree。FFmpeg 会把这种构建标记为不可再分发。不要仅仅因为旧的“全部启用”清单里出现过这些参数就照搬。
如果不需要 x264 或 x265,可以省略对应开发包和 configure 参数,同时删除--enable-gpl。最终许可证必须依据完整配置判断,不能只看某一个参数。
硬件加速应当单独决定
不要假定增加一个 configure 参数就能让 GPU 加速工作。VAAPI、NVENC/NVDEC、Vulkan 等路径依赖不同的头文件、驱动、设备和运行时权限。先查看对应 FFmpeg 版本的./configure --help,只安装所选路径的官方依赖,并在目标机器上测试。
构建后,下面的命令会列出编译进 FFmpeg 的接口:
"$FFMPEG_BIN" -hide_banner -hwaccels
这份列表不能证明机器存在兼容 GPU,也不能证明驱动工作正常。用于生产环境前,请使用真实设备完成一次小型解码或编码测试。
维护检查清单
对于源码构建,我会保持以下习惯:
- 关注 FFmpeg 官方下载页和安全页面中的新版本。
- 下载新的 tarball 与签名,并再次核对官方发布的指纹。
- 构建到新的版本化 prefix,不覆盖当前正常工作的版本。
- 将
ffmpeg -version和ffmpeg -buildconf的输出与部署记录一起保存。 - 除合成冒烟测试外,还要重复一次有代表性的媒体处理测试。
- 新二进制文件通过检查后,才切换
PATH。
这比apt install ffmpeg多花一点工夫,但你会得到可追踪的源码版本、明确的功能配置,以及无需修改 Ubuntu 系统二进制文件的清晰回退路径。
一手资料
核对日期:2026 年 9 月 1 日。
