🎬 第三章 音视频开发常用工具
📄 一句话概括

做二次开发时先想清楚自己站在哪一环,再挑库——几乎每件事都要配合别的库,因为它们本来就是一条流水线拆出来的。

📝 本节和前面几节的关系

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 秒实验

  1. 写下你想做的一个音视频小工具,判断它要用到哪几个库。
  2. 如果要用到 3 个以上,先回到命令行把它跑通一遍。

常见误区

  1. 一上手就写完整解码程序。先跑通最小示例,再逐步加。
  2. 以为挑一个库就够。它们是一条流水线,总要配合。
自测三问(点开对答案) 1. 开发包和命令行的分工是什么? —— 命令行适合手工做一件事,开发包适合让程序反复批量处理。 2. 怎么决定该用哪个库? —— 先想清楚要做的那件事在流水线的哪一环。 3. 为什么几乎没有【只用到一个库】的任务? —— 六个库本来就是一条流水线拆开的,读数据、编解码、管内存各归一个。

相关笔记