移动端mediarecorder视频录制关键在于源头控制采集质量、适配设备能力及规避中断陷阱:通过getusermedia约束(ideal/max+aspectratio)调控分辨率,优先vp8或avc baseline编码,规避ios/android权限与后台中断,并验证实际采集参数。

在移动端用 MediaRecorder 录制视频,关键不是“强行压分辨率”,而是从源头控制采集质量 + 适配设备能力 + 避开常见中断陷阱。iOS 和 Android 对 getUserMedia 的约束支持、后台行为、音频混入限制各不相同,低分辨率只是结果,不是起点。
一、明确移动端的分辨率控制逻辑
移动端不支持直接设置输出视频的编码分辨率(如 encoder.width),只能通过 getUserMedia 的 constraints 影响采集源。浏览器会从设备支持的分辨率中选最接近你指定值的组合,且优先保障流畅性而非精度。
- 用
width和height的ideal+max双约束,例如:{ video: { width: { ideal: 640, max: 720 }, height: { ideal: 480, max: 540 } } } - 避免写死
exact,否则在 iPhone 或部分安卓机上会直接报错或回退到最低可用分辨率(如 320×240) - 可加
aspectRatio: { ideal: 1.777 }提示横屏偏好,提升兼容性
二、强制启用低码率与轻量编码格式
分辨率降了,但若编码器仍用高比特率或 H.264 High Profile,文件体积和发热依然大。需主动指定更友好的 mimeType:
- 优先尝试:
video/webm; codecs=vp8(Android 全系支持,iOS 16.4+ 支持) - 备选(iOS 更稳):
video/mp4; codecs="avc1.42E01E"(Baseline Profile,Level 3.0,明确禁用 B-frame 和 CABAC) - 创建 MediaRecorder 时传入:
new MediaRecorder(stream, { mimeType: mime }),并用MediaRecorder.isTypeSupported(mime)检查
三、规避移动端特有中断与权限问题
移动端录制极易被系统打断(切后台、锁屏、来电),且首次调用常因静音/autoplay 策略失败:
-
<video></video>标签必须带playsinline autoplay muted属性,否则 iOS Safari 拒绝播放流 - 录制按钮点击后立即调用
getUserMedia,不能延迟或放异步队列里——Safari 对非用户手势触发的媒体请求直接拒绝 - 监听
visibilitychange事件,页面不可见时主动stop()并释放 track:stream.getTracks().forEach(t => t.stop()) - 对 iOS,建议默认关闭音频录制(
{ video: true, audio: false }),因系统禁止捕获 App 内部声音,开启反而增加失败概率
四、验证与兜底:确保低分辨率真正生效
光设 constraints 不够,得确认最终流确实按预期采集:
- 录制前获取轨道信息:
const videoTrack = stream.getVideoTracks()[0];<br>console.log(videoTrack.getSettings());
检查输出的width/height是否落在你设定的范围内 - 若发现始终是 1920×1080,说明设备不支持你指定的约束,应降级到更宽松值(如
max: 480)并重试 - 真机测试必做:Android 各厂商 WebView 差异大,华为/小米常拦截无 UI 的媒体请求;iOS Safari 对
getDisplayMedia完全不支持,录屏方案在移动端基本不可用
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











