核心是 navigator.mediadevices.getusermedia(),返回 promise 获取 mediastream;需处理权限请求、设备选择和错误捕获,确保安全上下文,并正确释放轨道资源。

调用摄像头和麦克风,核心是 navigator.mediaDevices.getUserMedia(),它返回一个 Promise,成功后得到包含音视频轨道的 MediaStream 对象。权限请求、设备选择、错误处理这三块必须写牢,否则在 Chrome、Safari 或移动端容易静默失败或报错。
基础调用与权限逻辑
浏览器首次访问媒体设备会弹出权限提示,用户拒绝后再次调用不会重试,需引导手动开启。调用前应先检查 navigator.mediaDevices 是否可用,并确保页面处于安全上下文(https:// 或 localhost)。
- 直接传入约束对象,如
{ video: true, audio: true }表示同时启用摄像头和麦克风 - 若只想要视频,设为
{ video: true };仅音频则用{ audio: true } - 约束可细化:例如
{ video: { width: { ideal: 1280 }, height: { ideal: 720 } } }指定期望分辨率
设备枚举与动态切换
通过 navigator.mediaDevices.enumerateDevices() 可获取当前可用的摄像头、麦克风、扬声器列表。注意该方法返回 Promise,且不触发权限请求——适合在已有权限后做设备发现。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 结果中每个设备有
deviceId、label、kind(如"videoinput"或"audioinput") - 将
deviceId填入getUserMedia的约束中,即可指定使用某台物理设备,例如:{ video: { deviceId: { exact: "abc123..." } } } - 切换设备时,应先
track.stop()停止旧流的轨道,再用新deviceId请求新流并替换<video></video>的srcObject
错误捕获与常见问题应对
Promise 拒绝原因多样,不能只靠 catch 打印 error.message。需根据 name 字段区分类型,针对性处理:
-
"NotAllowedError":用户点“拒绝”或系统级禁用(如 macOS 系统偏好设置里关了摄像头权限) -
"NotFoundError":约束条件过于严格(如指定不存在的deviceId),或设备被占用(如 Zoom 正在使用摄像头) -
"NotReadableError":设备被其他进程独占,或驱动异常(Windows 常见) - 建议统一加一层判断:若错误名含
"NotAllowed"或"PermissionDenied",提示用户去设置页开启权限
实际渲染与生命周期管理
拿到 MediaStream 后,赋给 <video></video> 或 <audio></audio> 元素的 srcObject 即可播放。但要注意资源释放和页面卸载场景:
- 不再需要流时,遍历所有
stream.getTracks()并调用track.stop(),避免后台持续采集 - 监听
beforeunload或visibilitychange,自动停止轨道防止耗电或隐私泄露 - 移动端 Safari 对自动播放限制严格,即使有用户手势触发
getUserMedia,也建议在video.play()失败时捕获NotAllowedError并提示点击播放
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










