本节摘要:FFmpeg 的「能力清单」在编译时决定。本节讲清 configure 的核心开关(--enable-libx264、--enable-nvenc、--disable-xxx)各自开启什么,说明为什么工程上常要自己编译,并给出一套可落地的编译与工程搭建流程。
阅读完本节,你应当能够:
你系统里那个 ffmpeg 是别人编好的,开没开 H.264 编码器、带不带 NVENC,你说了不算。发行版的 FFmpeg 为了规避专利和减少体积,经常砍掉 x264、x265 这类编码器——于是你写 -c:v libx264 就报 Unknown encoder。
这就是工程上「自己编译」的动机:能力清单自己定。FFmpeg 的构建分两步:configure(开开关)→ make(编译)。configure 决定「编哪些、不编哪些」,这是本节的主角。
# 例:开启 x264/x265 编码器、NVENC 硬编,编译到 /opt/ffmpeg ./configure \ --prefix=/opt/ffmpeg \ --enable-gpl \ --enable-libx264 \ --enable-libx265 \ --enable-nvenc \ --enable-nonfree
逐个解读:
--prefix=/opt/ffmpeg:安装目录,影响后续链接时的路径--enable-gpl:允许链接 GPL 组件(x264 是 GPL,不开这个连不上)--enable-libx264 / --enable-libx265:启用软编解码器(依赖对应源码包已安装)--enable-nvenc:启用 NVIDIA 硬编(需要 SDK)--enable-nonfree:允许非自由组件(nvenc 等商用授权组件要走这个)反向开关同样重要:
--disable-avdevice:砍掉不需要的设备采集,减小体积--disable-doc / --disable-debug:发布版常见,省空间省时间--disable-everything --enable-xxx:只要一两个功能时的「最小化编译」,嵌入式常用不编译也能查别人编好的那份带什么:
# 编解码器、协议、滤镜三份清单 ffmpeg -encoders ffmpeg -decoders ffmpeg -protocols ffmpeg -filters
先查后写是铁律。写 -c:v libx265 前先 ffmpeg -encoders | grep 265,确认存在再动手。
| 方案 | 优点 | 代价 |
|---|---|---|
| 系统包 | 装得快、跟着发行版更新 | 能力被裁剪,可能缺 x264/硬编 |
| 自己编译 | 能力自定、版本可控 | 编译耗时、依赖管理麻烦 |
工程判断:开发调试用系统包够了,产线部署才值得自编译——特别是需要硬编、自定义滤镜、固定版本时。
编译完,写一个能链接 FFmpeg 的 C 程序,工程需要:
pkg-config 找到 libavformat、libavcodec、libavutil、libswscale 编译:cc demo.c $(pkg-config --cflags --libs libavformat libavcodec libavutil)
pkg-config 会给出头文件路径与链接库列表,这是最省事的接法。写代码时记得包含 libavformat/avformat.h 等头文件——这是所有 libav* 调用的入口。
FFmpeg 的 API 一直在演进,教程里的老代码在新版本可能编译不过。三个实用对策:
apt upgrade-Wdeprecated-declarations 会提示 API 已被替代doc/examples 是活文档,比网上教程可靠用一张图总结「从系统包到自编译」的决策路径:

先用系统包起步,遇到「缺能力」才考虑自编译。自编译的核心是 configure 开关——它决定能力清单。工程上记住「先查清单、锁定版本、以官方示例为准」三戒,能避开大部分开发环境的坑。
⚠️ 常见坑:configure 报
ERROR: libx264 not found说明依赖没装(先装 libx264-dev 这类开发包);--enable-nonfree不加上,NVENC 编不出来;编译好的 FFmpeg 没加进 PATH,which ffmpeg指到旧版,调试半天发现跑的不是新编的。
💡 关键直觉:FFmpeg 的「能力」是编译出来的,不是下载出来就全能。
ffmpeg -version里那行配置输出,就是你手上这份的「真实底细」——查能力、排故障、定方案,都从它开始。
下一节真正动手写程序——从打开文件到写出文件的完整调用序列。