getSettings() 返回当前 MediaStreamTrack 实际生效的媒体参数字面量对象,如 width、height、frameRate 等,但 frameRate 在 Safari 和部分安卓 WebView 中常为 undefined,且仅在 track 处于 live 状态时有效。

getSettings 返回的是什么,不是所有参数都能拿到
getSettings() 返回一个字面量对象,包含当前 MediaStreamTrack 实际生效的媒体参数,比如 width、height、frameRate、aspectRatio 等。但要注意:它只反映浏览器最终协商/适配后的结果,不是你调用 getUserMedia() 时传的 constraints;而且某些字段(如 frameRate)在部分浏览器或设备上可能为 undefined,尤其是 macOS Safari 或某些安卓 WebView。
必须 track 处于 live 状态才能获取有效值
如果 track 已 stop()、尚未添加到 MediaStream、或还没触发 ontrack 回调,getSettings() 可能返回空对象或缺失关键字段。实操中建议:
- 在
track.onunmute或stream.onaddtrack后再调用,确保轨道已激活 - 对视频 track,可结合
track.readyState === 'live'做守卫 - 避免在
getUserMedia()的then回调里立刻调用——有些浏览器需要微任务延迟,例如:setTimeout(() => console.log(videoTrack.getSettings()), 0);
frameRate 在不同平台表现差异大
frameRate 是最不稳定的字段:
- Chrome 桌面版通常能返回数值(如
30),但若摄像头被其他应用占用或系统节能限制,可能回落到15或更低,getSettings()会如实反映 - Safari(macOS/iOS)基本不提供
frameRate,返回undefined;iOS WebKit 甚至不支持该字段 - 部分安卓厂商定制浏览器(如华为、小米)可能返回
null或完全忽略frameRate约束 - 不要依赖
getSettings().frameRate做逻辑分支,更适合用于日志记录或调试比对
和 getConstraints()、getCapabilities() 配合使用才完整
getSettings() 是“结果”,而 getConstraints() 是“请求”,getCapabilities() 是“设备支持范围”。三者缺一不可:
立即学习“前端免费学习笔记(深入)”;
-
getConstraints()查你传了什么(但可能已被浏览器修改) -
getCapabilities()查摄像头硬件真能干啥(如width: {min: 640, max: 1920}) -
getSettings()查现在实际跑成啥样(唯一可信的运行时快照) - 典型调试链路:
console.log('capa:', track.getCapabilities());<br>console.log('constraints:', track.getConstraints());<br>console.log('settings:', track.getSettings());
分辨率字段(width/height)相对可靠,但若页面缩放或 video 元素设置了 object-fit: cover,注意这不影响 getSettings() ——它只管媒体流本身,不管渲染层。



















