Visual LabINTERACTIVE LEARNING
阶段 5 · 媒体基础入门18 分钟

媒体元素:把资源交给浏览器播放管线

HTMLMediaElement、Source、事件与播放策略

用程序生成的音频理解媒体元素的资源加载、播放状态、事件与浏览器自动播放限制。

LEARNING GOALS

先明确本课目标

1

理解 HTMLMediaElement 状态机

2

监听 loadedmetadata、play、pause、ended

3

正确处理 play() Promise 与自动播放策略

MENTAL MODEL · 再建立心智模型

audio/video 元素像一台自带解码、缓冲、时钟和控制面板的播放器;JavaScript 主要观察状态并发出控制意图。

MINIMAL EXAMPLE

为什么 play() 需要 await 和 catch?

播放可能依赖用户手势、解码器、数据缓冲和系统音频状态,因此浏览器把 play() 建模为异步请求;策略拒绝会通过 Promise rejection 返回。

最小例子javascript
try {
  await audio.play();
  console.log('已经开始播放');
} catch (error) {
  console.log('需要用户点击后再播放', error);
}
  1. 发出播放请求 调用 play() 不等于声音已立即输出。
  2. 等待真实状态 Promise fulfilled 后才适合把按钮改成“暂停”。
  3. 处理策略拒绝 失败时保留明确的播放按钮,让用户主动重试。

播放器界面与浏览器真实播放状态保持一致,不会出现按钮显示播放但实际静音。

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

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

展开⌄
LIVE EXPERIMENT · 先获得反馈

边改边运行

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

本课挑战

给播放器增加缓冲进度、倍速和可访问的键盘控制。

DEEP DIVE · 实验之后

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

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

CORE IDEA

核心讲解

01

播放是异步请求

play() 返回 Promise,因为浏览器可能要等待数据、解码器或用户手势。失败必须被捕获,不能假定一次调用立即产生声音。

02

事件比轮询更可靠

加载、时长、缓冲、播放和结束都有明确事件。界面应由媒体状态驱动,而不是用定时器猜测播放器当前处境。

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

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

展开⌄
API COMPARISON

声明式播放器解决“播起来”,可编程管线解决“改造成什么”。

WebGL

可编程 API 让应用插入分析、效果、逐帧变换或自定义编码阶段。

WebGPU

媒体元素内建加载、缓冲、解码、时钟、字幕、控件和无障碍语义。

先让媒体元素承担可靠播放,再把真正需要加工的支路接入可编程 API。