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

摄像头与麦克风:从权限到 MediaStream

getUserMedia、Constraints、Track 与生命周期

在明确点击后申请设备权限,查看 MediaStreamTrack 设置,并学习如何可靠停止采集。

LEARNING GOALS

先明确本课目标

1

用约束请求音视频 Track

2

读取 settings 与 capabilities

3

停止 Track 并释放摄像头和麦克风

MENTAL MODEL · 再建立心智模型

getUserMedia 不是拿到一段文件,而是取得一组持续产生数据的 Track;权限、设备和 Track 生命周期必须被产品明确管理。

MINIMAL EXAMPLE

为什么设备请求必须由界面明确触发?

摄像头和麦克风属于高敏感权限。getUserMedia 只能在安全上下文中使用,浏览器还会显示授权提示和设备占用指示,产品必须让请求意图可理解。

最小例子javascript
const stream = await navigator.mediaDevices.getUserMedia({
  video: { width: { ideal: 1280 } },
  audio: false,
});

video.srcObject = stream;
// 使用结束后真正释放设备
stream.getTracks().forEach((track) => track.stop());
  1. 声明媒体约束 ideal 是偏好,exact 会把条件变成必须满足。
  2. 绑定实时媒体流 srcObject 直接接收 MediaStream,不需要先生成 URL。
  3. 停止全部轨道 Track.stop 才会释放底层设备占用。

用户能主动开始和停止采集,界面也能展示当前真正活跃的 Track。

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

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

展开⌄
LIVE EXPERIMENT · 先获得反馈

边改边运行

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

本课挑战

做一个支持切换前后摄像头、显示设备状态并可一键释放资源的采集面板。

DEEP DIVE · 实验之后

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

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

CORE IDEA

核心讲解

01

约束是偏好与要求的组合

ideal 表示尽量满足,exact/min/max 可能让请求直接失败。先请求宽松能力,再依据 settings 调整体验通常更稳健。

02

停止元素不等于停止设备

清空 video.srcObject 只断开显示;要让系统真正释放摄像头指示灯,必须对每条 Track 调用 stop()。

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

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

展开⌄
API COMPARISON

文件资源有确定边界,实时 Track 则持续产生数据并受外部设备影响。

WebGL

MediaStreamTrack 连接真实设备,受权限、拔插、静音与 stop 状态影响。

WebGPU

文件或 URL 可以重复加载、定位和缓存,生命周期主要由播放器控制。

把设备占用状态做成界面中的显式状态,不要把它隐藏在 video.srcObject 后面。