mediarecorder无丢包补偿能力,需通过分片录制、轨道事件监听、安全收尾及web audio缓冲增强来预防和降低损失。

MediaRecorder 本身不提供“丢包补偿”能力,它没有重传、纠错或帧内插值机制。所谓“补偿”,实际是通过分片录制、前置预警和资源管理,在丢包发生前降低损失,而非事后修复。
用 timeslice 主动切分数据流
依赖 MediaRecorder.stop() 最终生成一个 Blob 是高风险做法——一旦出错,全部白忙。必须改用分片策略:
- 初始化时指定
{ timeslice: 1000 }(每秒触发一次ondataavailable) - 每次事件中立即将
event.data推入数组:recordedChunks.push(event.data) - 即使录制中途崩溃,已收集的多个小 Blob 仍可拼接上传或回放
- 避免设置过长的 timeslice(如 5 秒以上),否则单次丢失代价太大
监听轨道事件提前干预
很多“丢包”本质是媒体流中断,而 MediaRecorder.error 往往来得太晚。应优先捕获更早信号:
- 对每个音视频轨道绑定
track.onmute:系统静音、设备被占用时会先触发 - 监听
track.onended:若track.readyState === 'ended',说明流已失效,需立即停录并请求新流 - 检测
track.enabled === false且无法恢复时,主动提示用户检查麦克风/摄像头权限
错误发生后的安全收尾
error 事件不是补救入口,而是终止确认点。此时重点是防止二次损坏:
- 先判断状态:
if (mediaRecorder.state !== 'inactive') mediaRecorder.stop() - 手动停止所有轨道:
stream.getTracks().forEach(t => t.stop()) - 清空
recordedChunks外的 Blob 引用,避免内存泄漏 - 不要在 error 回调里尝试重启录制——应交由上层逻辑统一决策
配合 Web Audio 做底层缓冲增强
对音频敏感场景(如语音会议),仅靠 MediaRecorder 不够稳定。可叠加 AudioWorklet 实现缓冲层:
- 用
AudioContext.createMediaStreamDestination()将采集流接入 Web Audio 图 - 在 AudioWorkletProcessor 中维护环形缓冲区,记录采样时间戳与连续性
- 当检测到帧间隔突增(> 2 倍正常间隔),标记为潜在丢帧,并触发本地补偿(如静音填充或插值)
- 最终将处理后的流传给 MediaRecorder,提升输入质量稳定性
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











