🎬 第五章 视频基础
📄 一句话概括

播放器是四个环节串成的一条流水线:解封装 → 解码 → 同步 → 渲染——四个环节出错的表现完全不同,所以排查第一步是判断卡在哪一环。

📝 本节和前面几节的关系

5.3 讲完了编码,5.4 换一个视角:播放器是怎么把码流变成画面与声音的。

一、四个环节

解封装:把文件拆成视频流与音频流。 解码:把压缩数据还原成原始帧。 同步:按时间戳把音视频对齐。 渲染:把画面显示出来、把声音播出来。

二、各环节出错的表现

这是一张非常实用的对照表: 打不开文件 → 多半是解封装(格式不支持)。 花屏、绿屏、卡顿 → 多半是解码。 音画不同步 → 同步环节。 撕裂、爆音、黑屏 → 渲染与输出。 症状不同,方向就不同——这比无头绪地读日志快得多。

三、为什么解码最常出问题

因为解码依赖编码标准的每一个细节:预测怎么做、反量化怎么算,都必须完全一致。 所以【编码器实现的偏差】或者【码流本身损坏】,都会先在解码这一环炸出来。 这也是为什么排查花屏类问题,常常要下到帧这一层(第 3.4.1 节那类工具)。

四、同步为什么单独成一环

因为音视频是两条各自独立的数据流,它们的到达速度并不一样。 音频比视频短,多出来的音频要播完;视频比音频短,最后一帧要停住。 同步环节做的事,就是按时间戳决定每一刻该显示哪一帧、播哪一段声音。

五、动手 Demo:一个播放器要做哪几件事

播放器不是【一个程序】,而是四个环节串起来的一条流水线。

rows = [("解封装", "把文件拆成视频流音频流", "格式不支持"),
        ("解码", "把压缩数据还原成原始帧", "花屏、卡顿"),
        ("同步", "按时间戳对齐音视频", "音画不同步"),
        ("渲染", "把画面显示、把声音播出来", "撕裂、爆音")]
for a, b, c in rows:
    print("%-8s %-26s %s" % (a, b, c))

实跑输出:

--------------------------------------------------------------------
一个播放器要做哪几件事
--------------------------------------------------------------------

播放器不是【一个程序】,而是四个环节串起来的一条流水线。

  环节       做什么                       常见问题
  ---------------------------------------------------
  解封装     把文件拆成视频流音频流       格式不支持
  解码       把压缩数据还原成原始帧       花屏、卡顿
  同步       按时间戳对齐音视频           音画不同步
  渲染       把画面显示、把声音播出来     撕裂、爆音

  这四个环节**任何一个出错,表现都不一样**——
  所以排查播放问题,**第一步永远是判断卡在哪一环**。

这四个环节任何一个出错,表现都不一样—— 所以排查播放问题,第一步永远是判断卡在哪一环。

30 秒实验

  1. 回想你最近遇到的一次播放问题,判断它属于这四个环节里的哪一个。
  2. 写下你的判断依据。

常见误区

  1. 遇到问题就换播放器。换之前先判断是哪一环,才不白换。
  2. 把所有卡顿都归给网速。解码跟不上也会卡。
自测三问(点开对答案) 1. 播放器的四个环节是什么? —— 解封装、解码、同步、渲染。 2. 花屏最可能出在哪一环? —— 解码。 3. 为什么同步要单独成一个环节? —— 音视频是两条独立的流,到达速度不同,必须按时间戳统一调度。

相关笔记