三条路、五环、两个必守的规矩,这一章压缩成一张表。 哪一环能省、省了会怎样,比记住参数更有用。
4.5.1 到 4.5.3 讲的是同一条链的三种用法。 下一篇 4.5.5 用一次四参数实战收尾。
一、三条路对照
这一章跑过的三件事,量级完全不同。 路 经过的环 时间量级
转封装 解封装、封装 十毫秒 本地转码 五环全走 百毫秒 边转边推 五环,末环换网络 同上加网络
这张表是后面八章的地图。 第五到第十二章讲的都是「处理」那一环里的某个库, 第十三章把它们拼成完整的直播链。 看懂这张表,就知道每一章在链条的哪个位置。 这是本课从「会调 API」走到「懂架构」的分界。
二、哪一环能省
省环是设计选择,不是偷工减料——但有一条例外。 省掉哪环 得到什么 失去什么
解码与编码 转封装 改不了画面 处理 纯转码 画面照搬 封装 内存里处理 没有产物 冲空包 少写两行 丢最后几帧
前三行都有正当用途:转封装保画质、纯转码换参数、内存处理做分析。第四行不是选择,是 bug。 判断方法很简单:省了之后「能干的活少了」是设计,省了之后「结果少了一截」是错。
三、两条必守的规矩
这两条都不报错,只是结果不对,所以最难查。 规矩 违反的后果
冲空包 解码丢尾帧,编码丢尾包 时间戳自己算 改帧率后忽快忽慢、音画漂移
第一条在小文件上几乎看不出来。 50 帧丢 1 帧,谁也不会注意; 两小时的片子丢一段,观众立刻发现。 第二条只在改帧率或丢帧时才暴露。 只换分辨率不动时间,时间戳原样照抄就行; 一旦丢帧,就得重排。 记住一个信号:如果「程序一直成功但结果不对」,先查这两条,命中率很高。
四、从这一章往后怎么走
这一章是分水岭。 前面三章讲「有什么」,这一章讲「怎么串」。 章 在链上的位置
第五到七章 libavutil、协议、封装的具体用法 第八章 编解码层实战 第九到十一章 滤镜、重采样、缩放——都在「处理」环 第十二章 设备读写,换掉链的入口与出口 第十三章 全串起来做直播与美颜
每一章都能对上这张表的一个位置,学的时候不会散。这就是先讲架构再讲细节的好处。
五、动手 Demo:把 4.5 的三篇数据汇成一张账
三条路的对比、五个环的取舍,汇成两张表。
PATHS = {
"转封装": ["解封装", "封装"],
"本地转码": ["解封装", "解码", "处理", "编码", "封装"],
"边转边推": ["解封装", "解码", "处理", "编码", "网络"],
}
for name, rings in PATHS.items():
print(name, len(rings), "->", "·".join(rings))
实跑输出:
--------------------------------------------------------------------
把 4.5 的三篇数据汇成一张账
--------------------------------------------------------------------
**① 三条路,三个量级**
路 经过的环 时间量级 能不能改画面
---------------------------------------------------------------------
转封装 解封装、封装 十毫秒 不能
本地转码 再加解码、处理、编码 百毫秒 能
边转边推 同上,末环换网络 同上加网络 能
**这张表是本课后面所有章节的地图。** 第五章到第十二章讲的都是「处理」这一环里的某一个库,
第十三章把它们拼成一条完整的直播链。
**② 哪一环能省,省了会怎样**
省掉哪环 得到什么 失去什么
--------------------------------------------------------
解码与编码 转封装 改不了任何画面参数
处理 纯转码 画面照搬,只换编码参数
封装 内存里处理 没有可播放的产物
冲空包 少写两行 丢最后几帧
**前三行是设计选择,第四行是 bug。** 前三种省法都有正当用途,最后一种只会丢数据。
**③ 两条必须记住的规矩**
**第一条:冲空包。** 解码往编码两个方向都要,忘了就丢尾巴。
这个错在小文件上不明显,在长视频上会丢掉好几秒。
**第二条:时间戳要自己算。** 改分辨率不会动时间戳,改帧率会。
丢帧之后如果不重排 pts,播出来会忽快忽慢。
**这两条都不报错,只是结果不对。** 这类问题最难查,因为程序一直「成功」地跑着。
三条路的区别只在环的个数与最后一环。 环数越多越慢,也越能改——这是一条固定的兑换关系。
30 秒实验
- 给三条路各估一个耗时量级,再跟 4.5.2 的实测对一遍。
- 把「滤镜」插进「处理」环,看图里多了一环。
- 把「冲空包」当成一环画进图里,看它该放在哪。
常见误区
- 把省环都当成优化。 省掉冲空包是丢数据,不是优化。
- 记参数不记架构。 参数会忘,架构记住了能自己推。
- 以为三条路是三套代码。 是同一条链摘插不同的环。
自测三问(点开对答案)
1. 三条路的根本区别是什么? —— 走几环、最后一环换成什么。转封装两环,转码五环,推流五环但末环是网络。 2. 省环与丢数据的区别怎么判断? —— 省了之后「能干的活少了」是设计选择;「结果少了一截」是 bug。 3. 这一章对后面八章的作用是什么? —— 给出地图。后面每一章都对应链上某个位置,学的时候不迷路。- ☐ (本节完,下一节 4.5.5 视频文件转码流程案例分析)