Visual LabINTERACTIVE LEARNING
阶段 8 · 采集编码基础24 分钟

MediaRecorder:把实时媒体流封装成文件

captureStream、Chunk、Blob 与录制状态

录制一个程序生成的 Canvas 媒体流,收集数据块并生成可回放、可下载的 WebM 文件。

LEARNING GOALS

先明确本课目标

1

从 Canvas 创建 MediaStream

2

收集 dataavailable Chunk

3

处理 start、stop 与 MIME 能力检测

MENTAL MODEL · 再建立心智模型

MediaRecorder 像一台面向 MediaStream 的录像机:Track 持续送入帧,Recorder 编码并周期性吐出 Chunk,最后由 Blob 封装。

MINIMAL EXAMPLE

为什么录制结果要先收集 Chunk?

MediaRecorder 在录制过程中异步编码 MediaStream,并通过 dataavailable 事件交付一个或多个 Blob 片段;停止后再组合可得到完整结果。

最小例子javascript
const chunks = [];
const recorder = new MediaRecorder(stream);
recorder.ondataavailable = ({ data }) => {
  if (data.size) chunks.push(data);
};
recorder.onstop = () => {
  const recording = new Blob(chunks, { type: recorder.mimeType });
  video.src = URL.createObjectURL(recording);
};
recorder.start(1000);
  1. 准备片段数组 每次 dataavailable 都可能交付一个新的编码片段。
  2. 设置 timeslice start 参数可要求浏览器周期性产生 Chunk,时间并非严格保证。
  3. 停止后封装 用 Recorder 实际 mimeType 创建 Blob,再生成回放 URL。

一段实时媒体流被转成浏览器可回放的录制文件,同时保留分片上传的可能。

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

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

展开⌄
LIVE EXPERIMENT · 先获得反馈

边改边运行

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

本课挑战

把摄像头 Track 与 Web Audio 处理后的音频 Track 合并成一段录制。

DEEP DIVE · 实验之后

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

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

CORE IDEA

核心讲解

01

录制输入永远是流

MediaRecorder 接受 MediaStream,因此摄像头、麦克风、Canvas 捕获或组合 Track 都能走同一录制流程。

02

Chunk 不是立即可播放的承诺

dataavailable 提供编码数据片段,通常在 stop 后组合成 Blob。具体 MIME 与 Codec 必须通过 isTypeSupported 检测。

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

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

展开⌄
API COMPARISON

MediaRecorder 交付完整录制流程,WebCodecs 交付可组合的底层编码零件。

WebGL

WebCodecs 直接接收 VideoFrame/AudioData,允许精确控制队列、时间戳和编码配置。

WebGPU

Recorder 直接接收 MediaStream,处理编码细节并输出可组合的 Blob Chunk。

常规录制优先 MediaRecorder;只有帧级控制成为核心需求时才下沉到 WebCodecs。