8
0
0

Linux 上装 ffmpeg

最早记的是 CentOS 源码编译那一套,只有一条路。用的久了发现三处不对,顺手改了。

  • 少开关。 当时的 configure 是 --enable-openssl,少写 --enable-gpl。编是编出来了,可它没有 libx264,压根转不了 mp4。

  • 版本太老。 4.2 是 2019 年的东西,现在都 9.0.2 了。

  • 顺序倒了。 编译是最后一步,不是第一步。多数情况 apt 一条就完事。

所以重写了一遍,按「省事程度」从低到高排。

提示:下面所有版本号和链接我都实际请求过一遍。容易过期的写法(比如仓库地址里不写死版本号)我都特意处理了,过半年回来照着敲还能用。

先看你属于哪种情况

别一上来就编译。先对号入座:

情况

怎么办

耗时

平时转码、抽帧、录屏

发行版的包(下面 1)

1 分钟

仓库里版本太老,或者压根没有

静态构建(下面 2)

3 分钟

CI 里要锁版本、能复现

静态构建(锁分支号)或 Docker

5 分钟

要精确复现某个版本

源码编译(下面 3)

20–60 分钟

程序里要调,不想装到系统上

跟着依赖走(下面 4)

1 分钟

一句话: 先 apt install ffmpeg 试一下,不够再换静态构建,编译放最后。

1 发行版的包

最快的路,也是多数人的终点。

系统

命令

备注

Debian / Ubuntu / Mint、Deepin / UOS

apt update 后 apt install -y ffmpeg

一般够用

RHEL / CentOS Stream、Rocky / AlmaLinux

见下面 1.1,要多两步

主仓库版本很老

Fedora

sudo dnf install -y ffmpeg

Arch / Manjaro

sudo pacman -S ffmpeg

开源编解码器最全

Alpine

sudo apk add ffmpeg

openSUSE

sudo zypper install -y ffmpeg

openEuler / Anolis / 麒麟

sudo dnf install -y ffmpeg

可能极老,建议走 2

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 文件怎么选

名字里的片段

什么意思

什么时候要

linux64-gpl

x86_64 静态

默认选它,基本都够

linuxarm64-gpl

ARM64 静态

树莓派、ARM 云主机

gpl-shared

带 .so

要给别的程序链接 .so

lgpl(不带 gpl)

没有 x264/x265

许可证上有限制时

n9.0 / n8.1

锁到某个发布分支

CI 要固定版本

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 参数(挑常用的)

参数

干什么的

要什么

--enable-gpl

允许 x264/x265 这些

不加就编不出 mp4

--enable-nonfree

允许 fdk-aac

介意许可证就去掉

--enable-libx264、--enable-libx265

H.264 / H.265

libx264-dev

--enable-libvpx、--enable-libaom

VP8/9、AV1

libvpx-dev

--enable-libopus、--enable-libvorbis

音频编码

opus-dev

--enable-libmp3lame

MP3

lame-dev

--enable-libfdk-aac

AAC 质量更好

得自己先编 fdk-aac

--enable-libass

烧字幕

libass-dev

--enable-libfreetype、--enable-fontconfig

drawtext 的前提

freetype

--enable-openssl

https / rtmps

openssl-devel

--enable-shared

顺便出 .so

默认只出静态

--disable-debug

去掉调试符号

—

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 出问题先看这张表

报错 / 现象

为啥

怎么办

ffmpeg: command not found

PATH 没生效

source ~/.bashrc;先 ls /opt/ffmpeg/bin 看东西在不在

error while loading shared libraries

多个版本串了

unset LD_LIBRARY_PATH;删掉冲突的软链,或改用静态构建

Unknown encoder 'libx264'

没开 GPL

configure 加 --enable-gpl --enable-libx264

GLIBC_2.xx not found

系统太老(多半是 CentOS 7)

自己编译,或者换发行版

文件明明在,却说找不到

文件名带空格或中文

用 -i "文件名" 加引号;或者先 cd 过去

undefined reference to ...

pkg-config 找不到库

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

yasm / nasm not found

缺汇编器,x264 编不动

apt install nasm 或 dnf install nasm

字幕烧出来是方块

没字体,或者根本没编 drawtext

装 fontconfig 和中文字体

装完版本还是老的

PATH 上有更靠前的另一个

which -a ffmpeg 看看优先级

转码特别慢

走的软解,也没开多线程

确认硬件编码有没有生效;或用 libx264 加 -threads

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

Lei

9.0.2

2026-09-18

8.1

Hoare

8.1.3

2026-09-21

8.0

Huffman

8.0.3

2026-06-18

7.1

Péter

7.1.5

2026-06-20

6.1

Heaviside

6.1.6

2026-06-20

5.1

Riemann

5.1.10

2026-06-21

4.4

Rao

4.4.8

2026-06-21

  • 官网首页的下载按钮指的是 9.0.2。

  • 大概半年一个分支。 分支之间的补丁版只修 bug,不加新功能。

  • release 分支只挑着合,master 才是真在开发的地方(官网原话:only cherry pick selected changes)。要新功能就上 master。

  • 8.0 开始 libpostproc 没了。 还在用 -vf pp= 的脚本会挂,换 scale 或 zscale。

10 常用链接

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!