You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

enumerateDevices()无法枚举Logitech C920 HD Pro摄像头

问题根因

你的代码存在核心逻辑遗漏:现代浏览器(MacOS端Chrome表现尤其明显)的安全策略规定,网页未获得摄像头实时流访问授权时,调用enumerateDevices()无法返回完整的视频输入设备列表,只会返回无标签的占位项,部分外接摄像头甚至会直接从返回结果中隐藏。
你仅开启了Mac系统级的Chrome摄像头权限,但没有在网页上下文中主动触发摄像头授权申请,因此同设备的麦克风因为之前可能授予过音频权限可以正常枚举,C920摄像头条目会被浏览器过滤隐藏。Zoom作为本地客户端不受浏览器沙箱权限限制,因此可以正常识别设备,和网页端的权限逻辑不互通。

修复代码

需要先调用getUserMedia()申请摄像头+麦克风的访问权限,拿到授权、初始化流成功之后再执行设备枚举,就能拿到完整的设备列表。注意枚举完成后要关闭临时申请的流,避免长时间占用摄像头设备。

// 先申请音视频访问权限,触发网页端授权弹窗
navigator.mediaDevices.getUserMedia({ video: true, audio: true })
  .then(function(stream) {
    // 授权通过后再枚举设备
    return navigator.mediaDevices.enumerateDevices().then(function(devices) {
      // 关闭临时流,释放摄像头占用
      stream.getTracks().forEach(track => track.stop());
      return devices;
    });
  })
  .then(function (devices) {
    for (var i = 0; i < devices.length; i++) {
      if (devices[i].kind == "videoinput") {   
        console.log("Video Device is : "+devices[i].label);
      } else if( devices[i].kind === "audioinput"  ) {
        console.log("Audio Device is : "+devices[i].label);  
      }
    }
  })
  .catch(function(err) {
    console.error("设备访问异常:", err);
  });
排查步骤

如果替换代码后仍然无法识别C920,按以下顺序排查:

  • 确认运行环境符合安全上下文要求:测试页面必须是https://协议,本地调试可使用localhost或127.0.0.1,非安全上下文下媒体设备API会被浏览器直接禁用。
  • 检查站点级摄像头权限:不要仅依赖系统隐私设置,打开Chrome当前测试站点的权限配置,确认摄像头权限设置为「允许」或「询问」,系统权限开启但站点权限被拦截时,同样无法获取视频设备列表。
  • 排查设备占用:测试前完全退出Zoom、会议类软件、其他打开的视频网页,这类程序如果独占了C920摄像头,Chrome会无法枚举到该视频设备。
  • 检查Chrome全局摄像头配置:地址栏输入chrome://settings/content/camera,确认全局没有设置「不允许网站使用摄像头」,同时当前测试域名不在禁止访问摄像头的站点列表中。
  • 处理外设连接异常:拔掉C920的USB线重新插接,重启浏览器后重试,部分场景下Chrome没有及时捕获USB设备热插拔事件,会导致设备列表不同步。

内容的提问来源于stack exchange,提问作者Yella Goud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:03:19