applyconstraints未生效主因是设备不支持所设约束,需先用getcapabilities()查能力、getsettings()看当前值,并await捕获overconstrainederror;ios safari等平台对分辨率约束支持极弱,应优先在getusermedia阶段设置。

applyConstraints 调用后没生效?先确认 track 是否支持约束
直接调用 applyConstraints 却发现分辨率没变,大概率是摄像头根本不支持你传的 { width: { ideal: 1280 }, height: { ideal: 720 } }。浏览器不会报错,但会静默忽略不支持的约束。
正确做法是:先用 getCapabilities() 查设备真实能力,再用 getSettings() 看当前实际生效值:
const videoTrack = stream.getVideoTracks()[0];
console.log('capabilities:', videoTrack.getCapabilities());
console.log('current settings:', videoTrack.getSettings());
- 如果
getCapabilities().width是空对象或undefined,说明该设备不报告分辨率能力(常见于部分 macOS Safari 或老旧 USB 摄像头) -
ideal不保证生效,exact才强制,但失败会抛OverconstrainedError - 某些 Android WebView 或 Electron 旧版 Chromium 中,
applyConstraints对已激活 track 的分辨率调整可能完全被忽略
动态切换分辨率时必须 await applyConstraints() 并捕获错误
很多人写成 track.applyConstraints({...}) 就以为完事了,其实它返回 Promise,且失败不会 throw,而是 reject —— 不 await + catch 就等于“调了但不知道成没成功”。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
典型错误写法:track.applyConstraints({ width: 640 }); // 忘记 await,后续立刻 getSettings() 还是旧值
- 必须
await track.applyConstraints(constraints),否则后续读取getSettings()拿到的仍是旧配置 - 捕获
OverconstrainedError:说明约束冲突或硬件不支持,比如同时设width: { exact: 2560 }和frameRate: { max: 15 },但设备只支持 30fps@2560 - 某些浏览器(如 Chrome 115+)在后台标签页中会降级分辨率,即使约束 applied 成功,实际输出也可能被自动缩放
移动端 iOS Safari 的硬限制:无法通过 applyConstraints 设置高于 1280×720 的分辨率
iOS Safari(包括 WKWebView)对 MediaStreamTrack 的约束支持极弱。即使 getCapabilities() 返回了 { width: { max: 1920 } },applyConstraints({ width: 1920 }) 也大概率静默失败或回落到 1280×720。
- 实测 iOS 17.5 中,所有前置/后置摄像头通过
getUserMedia获取的 track,applyConstraints仅对frameRate和focusMode有效,分辨率类约束基本无效 - 想获得更高清画面,唯一可靠方式是在
getUserMedia阶段就传入分辨率约束:{ video: { width: 1920, height: 1080 } } - 注意:iOS 上
getUserMedia的约束同样受制于页面是否在前台、是否触发了用户手势(如 click)、以及是否启用了「相机高清模式」系统设置
别忽略 track.readyState 和 ended 状态导致的 applyConstraints 失败
一个常被忽视的坑:track 可能已 ended(比如用户手动关闭摄像头、系统休眠唤醒后设备断连),此时调用 applyConstraints 会立即 reject 并报错 InvalidStateError。
- 每次调用前检查:
if (track.readyState !== 'live' || track.ended) return; - 监听
track.onended做清理,避免在已结束 track 上反复尝试约束 - Chrome 120+ 中,若 track 因权限被拒或设备被其他进程占用而处于
readyState === 'ended',applyConstraints会直接失败,不给重试机会
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










