Linux 上装 ffmpeg
最早记的是 CentOS 源码编译那一套,只有一条路。用的久了发现三处不对,顺手改了。
少开关。 当时的 configure 是
--enable-openssl,少写--enable-gpl。编是编出来了,可它没有 libx264,压根转不了 mp4。版本太老。 4.2 是 2019 年的东西,现在都 9.0.2 了。
顺序倒了。 编译是最后一步,不是第一步。多数情况 apt 一条就完事。
所以重写了一遍,按「省事程度」从低到高排。
提示:下面所有版本号和链接我都实际请求过一遍。容易过期的写法(比如仓库地址里不写死版本号)我都特意处理了,过半年回来照着敲还能用。
先看你属于哪种情况
别一上来就编译。先对号入座:
一句话: 先 apt install ffmpeg 试一下,不够再换静态构建,编译放最后。
1 发行版的包
最快的路,也是多数人的终点。
1.1 CentOS 这类要多两步
RHEL 系因为专利授权的关系,主仓库里的 ffmpeg 很老,有的甚至干脆没有。新版本要去 RPM Fusion 拿。这几条我实测过能跑:
# EPEL 先装,RPM Fusion 依赖它
sudo dnf install --nogpgcheck \
https://dl.fedoraproject.org/pub/epel/epel-release-latest-$(rpm -E %rhel).noarch.rpm \
https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpm \
https://mirrors.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-$(rpm -E %rhel).noarch.rpm
# CRB 要一起开,不然有些包找不到
sudo subscription-manager repos --enable "codeready-builder-for-rhel-$(rpm -E %{rhel})-$(uname -m)-rpms" # 正牌 RHEL
sudo /usr/bin/crb enable # Rocky / Alma
sudo dnf install -y ffmpeg
ffmpeg -version | head -1
注意:
$(rpm -E %rhel)会自己解析成 8 / 9 / 10,不用手填大版本。国内嫌慢就把 rpmfusion.org 换成中科大的镜像。
2 静态构建(想用新版本又不想编译)
解压就能用,不碰系统的包,想删也删得干净。ffmpeg.org 下载页上 Linux 静态构建现在只列了一个源,就是 BtbN。
cd /tmp
wget https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-linux64-gpl.tar.xz
sudo mkdir -p /opt/ffmpeg
sudo tar -xJf ffmpeg-master-latest-linux64-gpl.tar.xz -C /opt/ffmpeg --strip-components=1
# 软链过去,想换回系统的版本只要改这一行
sudo ln -sf /opt/ffmpeg/bin/ffmpeg /usr/local/bin/ffmpeg
sudo ln -sf /opt/ffmpeg/bin/ffprobe /usr/local/bin/ffprobe
ffmpeg -version | head -1
2.1 文件怎么选
master-latest 是滚动的,隔几天内容就不一样。要固定下来就换成带分支号的,比如 ffmpeg-n9.0-latest-linux64-gpl-9.0.tar.xz。同一个 release 里还有 checksums.sha256,下完可以核对一下。
注意:CentOS 7 别用这招。 它的 glibc 才 2.17,新的二进制跑起来会报
GLIBC_2.xx not found。老系统只能自己编译。
3 源码编译
前两条都不够用才走这里。
3.1 依赖
# Debian 系
sudo apt update
sudo apt install -y build-essential yasm nasm pkg-config git \
libx264-dev libx265-dev libvpx-dev libaom-dev \
libopus-dev libvorbis-dev libmp3lame-dev \
libass-dev libfreetype6-dev libfontconfig1-dev \
zlib1g-dev libssl-dev
# RHEL 系
sudo dnf groupinstall -y "Development Tools"
sudo dnf install -y nasm yasm pkgconf-pkg-config \
x264-devel x265-devel libvpx-devel aom-devel \
opus-devel vorbis-devel lame-devel \
libass-devel freetype-devel fontconfig-devel \
zlib-devel openssl-devel
3.2 下载
wget https://ffmpeg.org/releases/ffmpeg-9.0.2.tar.xz
tar -xf ffmpeg-9.0.2.tar.xz
cd ffmpeg-9.0.2
原来写的 tar -zxvf ffmpeg-4.2.tar.gz 也能用。官方现在 .tar.xz / .tar.bz2 / .tar.gz 三种都提供,.tar.xz 体积最小,下完解压也快。
3.3 configure(这里原来踩过坑)
./configure --prefix=/usr/local/ffmpeg --enable-openssl
就这一行编出来的 ffmpeg 没有 libx264,转不了 mp4。x264/x265 是 GPL 的,不显式写 --enable-gpl 就编不进去,而且不报错,要到真正转码的时候才报 Unknown encoder 'libx264'。
应该这么写:
./configure \
--prefix=/opt/ffmpeg \
--enable-gpl \
--enable-version3 \
--enable-libx264 --enable-libx265 \
--enable-libvpx --enable-libaom \
--enable-libopus --enable-libvorbis \
--enable-libmp3lame \
--enable-libass --enable-libfreetype --enable-fontconfig \
--enable-openssl \
--disable-debug --disable-doc
提示:
--disable-debug能省一半体积,--disable-doc少一堆没用的依赖。
3.4 参数(挑常用的)
3.5 编译和 PATH
make -j"$(nproc)"
sudo make install
原来让我 vi /etc/profile 然后往里加一行 PATH。这个影响面太大了——所有用户、所有非交互 shell 都算上,脚本里可能拿到不想拿的版本。改软链更省事:
sudo ln -sf /opt/ffmpeg/bin/ffmpeg /usr/local/bin/ffmpeg
sudo ln -sf /opt/ffmpeg/bin/ffprobe /usr/local/bin/ffprobe
真要动 PATH,改自己的 ~/.bashrc 就好,别碰 /etc/profile:
echo 'export PATH="/opt/ffmpeg/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
4 跟着依赖走
不想装到系统上,或者要锁版本的时候,让包管理器把二进制带进来:
npm i ffmpeg-static ffprobe-static
pip install imageio-ffmpeg
调的时候得用包里的绝对路径,Node 里 require('ffmpeg-static') 返回的就是完整路径。
CI 里就直接用 Docker:
docker run --rm -v "$PWD:/work" -w /work \
jrottenberg/ffmpeg:6.1.1-alpine \
-i in.mp4 -c:v libx264 -crf 23 out.mp4
注意:tag 一定写死,别用 latest。 latest 意味着构建结果会变,昨天能跑今天就不行了。
5 装完先验一下
光看 ffmpeg -version 是不够的——版本号正常,不代表你要的编码器真的编进去了。分三层查:
# 一:路径对不对,有没有多个版本打架
which -a ffmpeg ffprobe
readlink -f "$(which ffmpeg)"
# 二:版本和编译参数
ffmpeg -version | head -3
ffmpeg -buildconf
# 三:关键功能在不在(最容易漏的一层)
ffmpeg -hide_banner -encoders | grep -E 'libx264|libx265|aac'
ffmpeg -hide_banner -decoders | grep -E 'h264|hevc'
ffmpeg -hide_banner -filters | grep -E 'drawtext|subtitles'
ffmpeg -hide_banner -protocols | grep -E 'https|rtsp|rtmp'
想快速看字体和字幕支持有没有编进去,grep 一下 drawtext 和 subtitles 有没有结果就行。
6 两个版本换来换去
readlink -f "$(which ffmpeg)"
sudo ln -sf /opt/ffmpeg/bin/ffmpeg /usr/local/bin/ffmpeg # 用自编译的
sudo ln -sf /usr/bin/ffmpeg /usr/local/bin/ffmpeg # 用系统的
7 出问题先看这张表
8 怎么删
# 静态构建
sudo rm -f /usr/local/bin/ffmpeg /usr/local/bin/ffprobe
sudo rm -rf /opt/ffmpeg
# 源码编译
cd ffmpeg-9.0.2 && sudo make uninstall
# 包管理器
sudo apt remove ffmpeg
sudo dnf remove ffmpeg
9 版本记录
截至 2026-10-17,从 ffmpeg.org 下载页抄的:
官网首页的下载按钮指的是 9.0.2。
大概半年一个分支。 分支之间的补丁版只修 bug,不加新功能。
release 分支只挑着合,master 才是真在开发的地方(官网原话:
only cherry pick selected changes)。要新功能就上 master。8.0 开始 libpostproc 没了。 还在用
-vf pp=的脚本会挂,换scale或zscale。
