只要接触视频、音频、直播、录屏、AI 生成视频,几乎绕不开 FFmpeg。 剪映、B 站后台转码、短视频 App、小程序视频处理、录屏软件、直播推流工具底层大量依赖 FFmpeg。
很多人只会复制网上片段命令,并不了解它是谁开发、什么语言编写、内部模块分工。本文完整梳理起源、架构、真实业务场景,附带大量可直接复制的生产级命令。
一、FFmpeg 起源与背景
FFmpeg 项目诞生于2000‑12‑20,由天才程序员Fabrice Bellard创建,他同时也是 QEMU 模拟器、TinyCC 编译器的作者。 项目名称含义:FF = Fast Forward(快进),mpeg 代表 MPEG 音视频标准。 2004 年后由 Michael Niedermayer 主导维护,全球社区志愿者持续迭代至今,当前稳定版本已经迭代到 8.x 系列。
小冷知识:2011 社区发生过一次分支分裂,部分开发者分出 Libav 项目,后续 FFmpeg 继续独立演进。
用什么语言编写
主体全部为 C 语言(C99 标准),部分性能热点使用汇编(x86/ARM SIMD 汇编)做硬加速。 没有 C++ 代码,所以拥有极强跨平台能力:Linux、Windows、MacOS、Android、iOS、WASM 网页端都可以编译运行。 Python / Java / Go / JS 只是上层封装调用,底层内核依旧是 C。
许可证:主库为 LGPL 协议,集成 x264/x265 等第三方编码库后变为 GPL 协议,商用项目需要注意许可证合规问题FFmpeg。
二、FFmpeg 核心架构与六大核心库
FFmpeg 分为底层函数库+上层命令行工具两大部分。你可以命令行直接使用;也可以把库嵌入自己程序开发。
底层核心库
- libavcodec:编解码核心库。h264/h265/av1/aac 等编解码器全部在这里。
- libavformat:封装 / 解封装。处理 mp4、flv、m3u8、mov、mkv 等容器格式,负责读文件、写文件。
- libavfilter:滤镜库。裁剪、缩放、加水印、调色、模糊、视频拼接,所有画面处理都靠它。
- libswscale:图像格式转换、画面缩放、色彩空间转换。
- libswresample:音频重采样、声道转换、音量处理。
- libavutil:通用工具函数,内存、日志、工具辅助。
三个命令行可执行程序
- ffmpeg:主力工具,转码、剪辑、滤镜、推流,绝大多数业务用它。
- ffprobe:音视频信息探测工具,读取分辨率、码率、帧率、编码格式、时长。
- ffplay:简易播放器,用来本地快速预览视频。
很多网页视频工具、小程序组件,只是套一层 GUI 界面,底层调用 ffmpeg 二进制程序。
三、FFmpeg 能做什么,真实业务落地场景
1)后端服务场景
- 用户上传视频自动转码,转成 h264 mp4,兼容浏览器、小程序;
- 视频压缩,降低码率,减小文件体积;
- 视频抽帧生成封面图;
- 直播推流、拉流,处理 rtmp、hls 流媒体;
- 批量处理用户上传音频、视频文件。
2)AI 视频项目场景
- AI 生成图片序列合成视频;
- 给 AI 生成视频加字幕、加水印;
- 视频降噪、调色;
- 提取数据集视频帧,批量导出图片。
3)个人、工具开发场景
- 视频裁剪、截取片段、合并多个视频;
- 提取视频里面的音频;
- 视频转 GIF 动图;
- 录屏;
- 批量格式转换。
4)移动端、小程序
Android/iOS App 内置 libffmpeg 库做本地剪辑;小程序 WASM 编译 FFmpeg,浏览器内直接处理视频。
四、FFmpeg 基础命令语法
基础通用格式:
ffmpeg [全局参数] -i 输入文件 [输入参数] 输出参数 输出文件-i:指定输入源,可以本地文件、http 链接、rtmp 流。-c copy:流拷贝,不重新编解码,速度极快,但部分操作不能用拷贝。
五、高频生产实战命令(直接复制使用)
1、查看视频信息 ffprobe
# 查看音视频完整元信息 ffprobe -show_streams -show_format input.mp42、格式转换
# mp4转mkv ffmpeg -i input.mp4 output.mkv # 视频提取音频,输出mp3 ffmpeg -i input.mp4 -vn -acodec copy output.mp33、视频截取片段
# 从00:01:00开始,截取30秒,流拷贝,速度快 ffmpeg -i input.mp4 -ss 00:01:00 -t 30 -c copy cut.mp4注意:流拷贝模式如果关键帧不对,会出现开头黑屏,需要重新编码去掉
-c copy。
4、视频压缩,降低码率
# h264压缩,控制比特率1M ffmpeg -i input.mp4 -vcodec libx264 -b:v 1000k output.mp45、视频抽帧,每隔 1 秒输出一张图片
ffmpeg -i input.mp4 -vf fps=1 frame_%04d.jpg6、图片序列合成视频
ffmpeg -framerate 24 -i frame_%04d.jpg -c:v libx264 output.mp47、视频转 GIF
ffmpeg -i input.mp4 -vf "fps=10,scale=480:-1" output.gif8、添加图片水印
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4overlay=10:10 代表水印距离左上角 x=10,y=10 像素。
9、直播推流 rtmp
# 将本地视频推送到rtmp直播服务器 ffmpeg -re -i input.mp4 -c copy -f flv rtmp://xxx/live/stream110、视频拼接(文件列表方式)
新建 list.txt
file '1.mp4' file '2.mp4'执行拼接:
ffmpeg -f concat -safe 0 -i list.txt -c copy out.mp4六、开发接入两种模式
命令行调用(简单项目首选)后端程序直接调用 ffmpeg 二进制程序,传入参数,读取 stdout/stderr 日志。 优点:开发简单;缺点:需要部署 ffmpeg 二进制包,进程调度开销。
直接调用底层 C 库 libav * 系列(音视频 SDK、APP)C/C++ 直接调用库 API;Go/Python 通过 binding 封装调用。 优点:性能高,进程内处理;缺点:开发门槛高,要理解音视频编解码原理。
七、常见踩坑总结
-c copy流拷贝速度快,但不能做裁剪、滤镜、缩放,这些操作必须重新编码;- 转码非常消耗 CPU,服务器批量处理要做好任务队列,防止并发打满机器;
- 很多黑屏、花屏问题来自输入源缺少关键帧;
- 商用产品要注意许可证,集成 x264/x265 后 GPL 协议会带来法律约束;
- ffprobe 优先用来探测视频参数,不要直接猜测分辨率、码率。
八、总结
- FFmpeg2000 年由 Fabrice Bellard 发起,C 语言 + 汇编编写,跨平台开源多媒体框架;
- 分为六大底层库 + ffmpeg、ffprobe、ffplay 三个命令行工具;
- 几乎所有音视频业务:转码、剪辑、抽帧、水印、直播推流、AI 视频数据集处理都可以完成;
- 简单业务优先命令行调用;复杂 SDK 项目直接调用底层 libav 系列库;
- 生产环境注意 CPU 负载、许可证、关键帧带来的黑屏问题。