阶段 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 返回。
javascripttry {
await audio.play();
console.log('已经开始播放');
} catch (error) {
console.log('需要用户点击后再播放', error);
}- 发出播放请求 调用 play() 不等于声音已立即输出。
- 等待真实状态 Promise fulfilled 后才适合把按钮改成“暂停”。
- 处理策略拒绝 失败时保留明确的播放按钮,让用户主动重试。
播放器界面与浏览器真实播放状态保持一致,不会出现按钮显示播放但实际静音。
OPTIONAL · 按需查阅完整术语表与概念边界遇到陌生术语时再展开,不打断主线实验。
展开⌄
音视频基础HTMLMediaElementaudio 与 video 共享的播放接口,负责资源加载、缓冲、解码、播放头、事件和基础控制。音视频基础Object URL用 URL.createObjectURL 为 Blob 提供的临时本地地址,使用结束后应通过 revokeObjectURL 释放。音视频基础readyStateHTMLMediaElement 当前已获得多少媒体信息和可播放数据的状态值,从 HAVE_NOTHING 到 HAVE_ENOUGH_DATA。音视频基础Playback PromiseHTMLMediaElement.play() 返回的 Promise,用来确认播放是否真正获准开始或因自动播放策略等原因被拒绝。音视频基础Autoplay Policy浏览器限制未经用户手势启动有声媒体或 AudioContext 的策略;静音播放和已获许可场景可能有不同规则。音视频基础Blob浏览器中带 MIME Type 的不可变二进制数据对象,可表示录制片段、文件内容或网络响应体。
LIVE EXPERIMENT · 先获得反馈
边改边运行
浏览器加载后会激活代码编辑器、独立运行环境与实时输出。
本课挑战
给播放器增加缓冲进度、倍速和可访问的键盘控制。
回到原理,解释刚才发生了什么
先用结果建立反馈,再按运行流程、核心原理和知识关系逐层深入。
CORE IDEA
核心讲解
播放是异步请求
play() 返回 Promise,因为浏览器可能要等待数据、解码器或用户手势。失败必须被捕获,不能假定一次调用立即产生声音。
事件比轮询更可靠
加载、时长、缓冲、播放和结束都有明确事件。界面应由媒体状态驱动,而不是用定时器猜测播放器当前处境。
OPTIONAL · 迁移时查阅Web 与原生实现对照主线实验完成后,再用完整映射处理跨平台或跨 API 迁移。
展开⌄
声明式播放器解决“播起来”,可编程管线解决“改造成什么”。
WebGL
可编程 API 让应用插入分析、效果、逐帧变换或自定义编码阶段。
WebGPU
媒体元素内建加载、缓冲、解码、时钟、字幕、控件和无障碍语义。
先让媒体元素承担可靠播放,再把真正需要加工的支路接入可编程 API。