8.2 播放器核心系统(Player Core Systems)
8.1 的结尾留下了一个分界:解码器把帧从码流里解放出来,工作便告完成——它对比特负责,帧解对了就是满分。可播放器的考卷上还有另一半题目,而且更难:时间。一帧解得再正确,早上屏半秒是穿帮,晚上屏半秒是卡顿;音频视频各自解得完美,错开百毫秒就是事故。
这就是播放器与解码器的本质分工:解码器回答 "帧是什么",播放器回答 "帧在何时"。后者没有规格书可查——编码标准从不规定一台机器该在什么时刻点亮哪个像素。这是一片纯工程的深水区,好在工业界有一份沿用二十余年的参考答案:ffplay 参考实现 [2]。本节的论述将以它为底本,把 "播放" 这件看似直觉的事,拆解成四个可以设计、可以实现的系统:
- 8.2.1 播放器的三个问题:何时解码、何时显示、对谁对齐——把 "播放" 翻译成工程语言的三个提问
- 8.2.2 音画同步:主时钟的三种策略:音频主、视频主、外部时钟各自的追随机制;为什么工业界默认让视频迁就音频
- 8.2.3 抖动缓冲:与网络和解的艺术:缓冲水位的双门限设计;起播延迟与卡顿率的跷跷板
- 8.2.4 渲染管线:从 YUV 到视网膜:色彩空间转换的最后一公里;上屏前的最后一段旅程
完成本节后,播放器将不再有黑盒——8.3 我们便动手,用 PyAV 亲手造一台出来。