FFmpeg 开发者快速入门
精简版快速入门,只保留核心概念与上手步骤。构建与安装、基本命令行用法、解复用与解码示例、库结构与数据流管道、编解码器/格式/滤镜 API、硬件加速、libswscale 与 libswresample、libavutil 等完整内容 详见 FFmpeg完整文档.md。
目录
- [一句话了解 FFmpeg](#一句话了解 FFmpeg)
- 工具与库
- [5 分钟上手](#5 分钟上手)
- [第一个命令行与 API 示例](#第一个命令行与 API 示例)
- 常用场景与选项
- 下一步
- 常见问题
1. 一句话了解 FFmpeg
FFmpeg 是广泛使用的多媒体处理框架 :提供命令行工具与一套 C 库,用于解码、编码、转码、滤镜与流处理。命令行 适合脚本、转码与调试;库(libavcodec、libavformat、libavfilter 等)可集成到应用中,实现自定义媒体管道。
为什么用?
- 编解码器与容器格式覆盖全、跨平台、久经生产验证
- 命令行即装即用;库 API 稳定、示例丰富(doc/examples/)
- 支持硬件加速(CUDA、VAAPI、QSV、VideoToolbox、MediaCodec)
2. 工具与库
| 类型 | 名称 | 用途 |
|---|---|---|
| 命令行 | ffmpeg | 转码、格式转换、流处理、音频提取 |
| 命令行 | ffplay | 简易媒体播放与解码测试 |
| 命令行 | ffprobe | 分析容器、流信息与元数据 |
| 库 | libavcodec | 音视频字幕编解码 |
| 库 | libavformat | 容器解复用/复用、协议与 I/O |
| 库 | libavfilter | 音视频滤镜图 |
| 库 | libavutil | 内存、数学、像素/采样格式等工具 |
| 库 | libswscale / libswresample | 图像缩放与音频重采样 |
理解 数据包(AVPacket) 与 帧(AVFrame) 的区分:libavformat 处理包级,libavcodec 处理帧级。
3. 5 分钟上手
安装
bash
# macOS
brew install ffmpeg
# Ubuntu/Debian
sudo apt-get install ffmpeg
# 从源码(简要)
./configure && make -j$(nproc) && make install
第一个命令
bash
# 格式转换
ffmpeg -i input.avi output.mp4
# 流拷贝(不重新编码)
ffmpeg -i input.mkv -c copy output.mp4
# 提取音频
ffmpeg -i video.mp4 -vn -c:a copy audio.aac
常用:-i 输入、-c:v/-c:a 编解码器、-c copy 流拷贝、-vf 视频滤镜、-map 流选择。
4. 第一个命令行与 API 示例
命令行转码示例
bash
# 转成 H.264 + AAC 的 MP4
ffmpeg -i video.avi -c:v libx264 -b:v 2M -c:a aac -b:a 128k video.mp4
# 缩放到 720p 并保持比例
ffmpeg -i input.mp4 -vf "scale=1280:-1" -c:a copy output.mp4
API 解复用与解码(核心模式)
c
// 简化流程:打开输入 → 找流 → 打开解码器 → 读包并解码
AVFormatContext *fmt_ctx = NULL;
avformat_open_input(&fmt_ctx, filename, NULL, NULL);
avformat_find_stream_info(fmt_ctx, NULL);
// 为某流打开解码器(示例略去查找逻辑)
AVCodecContext *dec_ctx = avcodec_alloc_context3(dec);
avcodec_parameters_to_context(dec_ctx, stream->codecpar);
avcodec_open2(dec_ctx, dec, NULL);
// 解码循环
AVPacket *pkt = av_packet_alloc();
AVFrame *frame = av_frame_alloc();
while (av_read_frame(fmt_ctx, pkt) >= 0) {
avcodec_send_packet(dec_ctx, pkt);
while (avcodec_receive_frame(dec_ctx, frame) >= 0) {
// 使用 frame
}
av_packet_unref(pkt);
}
// 刷新:avcodec_send_packet(dec_ctx, NULL),再 receive_frame 至 EOF
要点:发送/接收 API(send_packet → receive_frame);用完后 av_packet_unref/av_frame_unref;完整示例见 doc/examples/demux_decode.c。
5. 常用场景与选项
| 需求 | 做法 |
|---|---|
| 只换容器、不重编 | -c copy |
| 指定视频/音频编码器 | -c:v libx264、-c:a aac |
| 码率与质量 | -b:v 1M、-crf 23(x264) |
| 选流 | -map 0:v:0、-map 0:a:0 |
| 视频缩放 | -vf scale=1280:720 或 scale=1280:-1 |
| 查看能力 | ffmpeg -decoders、-encoders、-filters、-formats |
API 侧:错误检查(返回值、av_err2str);引用计数(av_*_unref);硬件解码见 doc/examples/hw_decode.c。
6. 下一步
- 完整文档 :FFmpeg完整文档.md(从概述、快速开始到构建安装、命令行用法、解复用与解码、库结构、数据流管道、编解码器/格式/滤镜 API、硬件加速、swscale/swresample/avutil 等全章节)
- 官方 :ffmpeg.org、文档
- 示例:仓库 doc/examples/(demux_decode.c、decode_video.c、transcode.c、mux.c、hw_decode.c 等)
7. 常见问题
| 现象 | 可能原因 | 处理 |
|---|---|---|
| 找不到编解码器 | 默认构建未启用外部库 | 使用 --enable-libx264 等重新 configure |
| 编译/链接失败 | 缺少头文件或库路径 | 检查 pkg-config、-I/-L;树内可 make examples |
| 解码/编码卡住 | 未处理 EAGAIN 或未刷新 | 按 send/receive 循环与 NULL 包刷新 |
| 内存泄漏 | 未 unref 包/帧 | 每次使用后 av_packet_unref/av_frame_unref |
| 硬件加速不可用 | 驱动或构建未启用 | 确认 --enable-cuda/vaapi 等与运行时环境 |
提示:先跑通 doc/examples 中的 demux_decode 与 transcode,再对照完整文档深入各库与 API。