📄 一句话概括
做二次开发时先想清楚自己站在哪一环,再挑库——几乎每件事都要配合别的库,因为它们本来就是一条流水线拆出来的。
📝 本节和前面几节的关系
3.5.2 讲了命令行,这一节讲把 FFmpeg 嵌进自己程序里的那一层。
一、开发包是什么
命令行适合【手工做一件事】,开发包适合【让程序反复做一万件事】。 所谓开发包,就是把前面那六个库链接进你自己的程序,直接调用它们的接口。 所以命令行能做的事,开发包都能做——只是少了那层壳,多了灵活性。
二、怎么挑库
方法很简单:先想清楚你要做的那件事在哪一环。 拆文件、读各流 → libavformat 解码出帧 → libavcodec 改分辨率 → libswscale 改采样率 → libswresample 加字幕、裁剪 → libavfilter
三、为什么总要配合
Demo 38 那张表里,每一行都有第三列——要配合哪个库。 原因很根本:这六个库本来就是一条流水线拆开的结果,不是六个独立工具。 你不可能只调 libavcodec 就完成解码——读数据要靠 avformat,管内存要靠 avutil。
四、入门路径
不建议一上来就写解码程序。推荐的顺序是: ① 先用熟命令行,把概念走通; ② 再照着官方示例,写一个【打开文件 → 找流 → 找解码器】的最小程序; ③ 最后才做【解码出帧 → 处理 → 再编码】的完整链路。 每一步都要能跑起来,不要跳步——这跟第 1.1 节说的修行顺序是同一个道理。
五、动手 Demo:用哪个库,看你要做什么
做二次开发时,先想清楚自己站在哪一环,再挑库。
tasks = [
("读一个 MP4 拆出各流", "libavformat", "libavcodec"),
("把视频转成 720p", "libswscale", "libavfilter"),
("把音频转成 48kHz", "libswresample", "libavcodec"),
("解码出每一帧图像", "libavcodec", "libavutil"),
("给画面加个字幕", "libavfilter", "libavformat"),
]
for task, main, also in tasks:
print("%-22s %-15s 还要配合 %s" % (task, main, also))
实跑输出:
--------------------------------------------------------------------
用哪个库,看你要做什么
--------------------------------------------------------------------
做二次开发时,先想清楚自己站在哪一环,再挑库。
你要做的事 主要用哪个库 还要配合
------------------------------------------------------
读一个 MP4 拆出各流 libavformat libavcodec
把视频转成 720p libswscale libavfilter
把音频转成 48kHz libswresample libavcodec
解码出每一帧图像 libavcodec libavutil
给画面加个字幕 libavfilter libavformat
注意第三列:**几乎每件事都要配合别的库**——因为它们本来就是一条流水线拆出来的。
注意第三列:几乎每件事都要配合别的库。 因为它们本来就是一条流水线拆出来的,不是六个独立工具。
30 秒实验
- 写下你想做的一个音视频小工具,判断它要用到哪几个库。
- 如果要用到 3 个以上,先回到命令行把它跑通一遍。
常见误区
- 一上手就写完整解码程序。先跑通最小示例,再逐步加。
- 以为挑一个库就够。它们是一条流水线,总要配合。
自测三问(点开对答案)
1. 开发包和命令行的分工是什么? —— 命令行适合手工做一件事,开发包适合让程序反复批量处理。 2. 怎么决定该用哪个库? —— 先想清楚要做的那件事在流水线的哪一环。 3. 为什么几乎没有【只用到一个库】的任务? —— 六个库本来就是一条流水线拆开的,读数据、编解码、管内存各归一个。- ☐ 下一章(第四章 音频基础)
相关笔记
- FFmpeg命令行 — 先把它跑通,再写代码
- FFmpeg — 六个库的整体分工
- ⌨️ 编程原理 · 索引 — 从跑通到写代码的一般路径
- 🎬 FFmpeg入门详解 · 索引