Visual LabINTERACTIVE LEARNING
阶段 4 · 播放链路进阶32 分钟

完整播放链路:从网络字节到屏幕与扬声器

I/O → Buffer → Demux → Decode → Sync → Render / Audio Output

把前面的概念连成一条端到端播放管线,观察每个队列的输入输出、线程边界、缓冲目标和失败模式。

LEARNING GOALS

先明确本课目标

1

说出完整播放阶段及数据形态

2

理解 Packet Queue 与 Frame Queue

3

定位卡顿、花屏、音画不同步分别可能发生在哪层

MENTAL MODEL · 再建立心智模型

播放器是一组用时间戳连接的生产者—消费者队列:网络生产字节,Demux 生产 Packet,Decoder 生产 Frame,时钟决定何时消费。

MINIMAL EXAMPLE

为什么播放器不能收到一个包就一路同步处理到底?

网络、解复用、音频解码、视频解码和设备输出拥有不同速度与抖动。有限队列让各阶段解耦并提供缓冲,同时需要上限形成背压。

最小例子javascript
async function decodeLoop() {
  while (!stopped) {
    const packet = await videoPacketQueue.pop();
    const frames = await decoder.decode(packet);
    for (const frame of frames) {
      await videoFrameQueue.push(frame); // 满时等待
    }
  }
}
  1. 等待上游 Packet 队列为空代表数据尚未准备,不应忙循环。
  2. 解码产生零到多帧 一个 Packet 与输出 Frame 不保证一一对应。
  3. 满队列形成背压 下游过慢时暂停生产,避免内存无限增长。

各阶段可在不同线程或异步任务运行,同时由有限队列控制内存、吞吐和延迟。

本课概念
OPTIONAL · 按需查阅完整术语表与概念边界

遇到陌生术语时再展开,不打断主线实验。

展开⌄
LIVE EXPERIMENT · 先获得反馈

边改边运行

浏览器加载后会激活代码编辑器、独立运行环境与实时输出。

本课挑战

为点播、直播和视频通话各设计一组缓冲目标与降级策略。

DEEP DIVE · 实验之后

回到原理,解释刚才发生了什么

先用结果建立反馈,再按运行流程、核心原理和知识关系逐层深入。

CORE IDEA

核心讲解

01

每层都改变数据形态

网络层是字节,Demux 后是压缩 Packet,Decode 后是视频 Frame/PCM,Render 后才成为屏幕像素和声卡缓冲。日志必须标明当前层。

02

队列在吞吐和延迟间取舍

缓冲越深越能抵抗网络与解码抖动,却增加启动和端到端延迟。直播、通话和点播会选择不同目标。

OPTIONAL · 迁移时查阅Web 与原生实现对照

主线实验完成后,再用完整映射处理跨平台或跨 API 迁移。

展开⌄
API COMPARISON

浏览器提供托管播放器,原生允许替换每一层;两者背后的数据形态和时钟完全相同。

WebGL

FFmpeg + 平台 Codec + Audio/Graphics API 组合成显式多线程播放器。

WebGPU

audio/video 元素覆盖 URL 到输出全链路;MSE/WebCodecs/Web Audio/Canvas 可逐层接管。

先把每一层输入、输出、队列和时钟画出来,再决定 Web 或原生由谁托管。