必须先获取有效mediastream,再调用new mediarecorder(stream);stream须来自用户授权的媒体设备,且含启用的音视频轨道,否则报typeerror;start()后必须监听dataavailable事件收集blob数据。

MediaRecorder API 录制前必须获取有效的 MediaStream
直接调用 new MediaRecorder(stream) 会报错,前提是 stream 必须来自用户主动授权的媒体设备(如摄像头、麦克风),且不能是空流或仅含音频/视频但被静音/禁用的流。
常见错误现象:TypeError: Failed to construct 'MediaRecorder': The stream has no audio and no video tracks 或录制无声/无画面。
- 务必用
navigator.mediaDevices.getUserMedia({video: true, audio: true})显式请求权限,不能只传{}或依赖旧版getUserMedia写法 - 检查流中实际 track 状态:
stream.getAudioTracks()[0]?.enabled === true,stream.getVideoTracks()[0]?.readyState === 'live' - 移动端需注意:Safari 16.4+ 才支持视频录制;iOS Safari 默认禁用自动播放音频,可能影响录制后回放体验
start() 后必须监听 dataavailable 事件才能拿到 Blob 数据
MediaRecorder.start() 只是启动录制,不会自动生成文件。真正拿到音视频数据靠的是 dataavailable 事件触发时的 event.data —— 它是一个 Blob,类型由 options.mimeType 决定。
容易踩的坑:只监听 stop 事件却没处理 dataavailable,导致录制完成但无数据可保存。
- 必须在
recorder.ondataavailable = e => { ... }中收集e.data,建议用数组暂存:chunks.push(e.data) - 若未指定
timeslice,dataavailable仅在stop()时触发一次;设为1000毫秒则每秒触发一次,适合大文件分片上传 - 注意 MIME 类型兼容性:
video/webm;codecs=vp9,opus在 Chrome 支持好,但 Safari 不支持 VP9,推荐video/webm(自动选默认编码)或audio/webm(纯音频)
stop() 和 pause()/resume() 的行为差异很关键
stop() 是终止录制并立即触发 dataavailable 和 stop 事件;而 pause() 会暂停采集但不中断编码器状态,再次 resume() 时时间戳连续、无新初始化开销——但并非所有浏览器都完整支持 pause。
典型问题:调用 pause() 后 resume() 失败,或录制文件出现音画不同步。
- Safari 目前(v17.5)完全不支持
pause/resume,调用会抛NotSupportedError - Chrome 和 Firefox 支持,但
pause()后首次resume()可能有 100–300ms 延迟,不适合高精度剪辑场景 - 如需“分段录制”,更可靠的做法是多次
start()/stop()并合并Blob数组,而非依赖pause
导出 Blob 为可下载文件需注意 URL 生命周期
把 new Blob(chunks) 转成下载链接,要用 window.URL.createObjectURL(blob),但这个 URL 是临时的,页面卸载或显式 revokeObjectURL 后即失效。
常见疏漏:生成链接后没做清理,导致内存泄漏;或点击下载时 URL 已被回收,下载为空文件。
- 创建 a 标签并触发下载后,应尽快调用
window.URL.revokeObjectURL(url),尤其在单页应用中反复录制时 - 不要在
click事件外提前生成 URL 并长期缓存,避免因页面跳转或组件销毁导致失效 - 文件名扩展名要匹配 MIME 类型:
video/webm→.webm,audio/webm→.weba或.webm(规范允许),否则某些系统无法识别
dataavailable 事件的必接逻辑——很多 demo 直接跳过这两步,一到真实环境就静音或黑屏。浏览器对媒体设备策略越来越严,不能假设 getUserMedia 返回的流一定可用。大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











