WebRTC API调用外部摄像头(PC端)

最近帮人解决了一个关于WebRTC调用指定摄像头的问题,将问题和解决过程记录下来。

起因是朋友负责的项目需要调用外部摄像头,使用网上查询的方法制作的demo一直获取不到外部摄像头,只有默认摄像头。

使用的是navigator.mediaDevices.enumerateDevices。

由于主包也没做过摄像头相关的内容,只好百度和gpt双管齐下~

gpt告诉主包可以用navigator.MediaDevices.getUserMedia(),试了一下发现也获取不到摄像头列表。(已验证过谷歌浏览器能识别到外接的摄像头)主包又去质问gpt,排除了gpt列出的可能的原因。

此时主包已经意识到事情并不简单,为了在朋友面前装一个大的,只好硬着头皮继续研究。查询其他技术帖明确知道浏览器允许以下几种条件下调用摄像头:

1.https

2.localhost、127.0.0.1本地服务

3.file

此时主包灵机一动,计上心来,刚好电脑跑着vue项目,就在localhost服务下调用了enumerateDevices()和getUserMedia()并且打印结果,在第一次授权允许使用摄像头之后,成功打印出了所以摄像头。

到此已经确认file协议和localhost协议下浏览器表现有区别。

总结:1.enumerateDevices()是获取设备、不会触发用户授权、不授权的情况下label为空; 2.getUserMedia()是获取媒体流,直接打开设备的。会触发用户授权,授权之后就能拿到的label。

因此,在localhost下,先调getUserMedia再调enumerateDevices,就能打印出所有摄像头,从而打开指定摄像头。

在file协议下,虽然可以授权打开摄像头,但是权限行为仅单次使用,不做缓存。

通过对比浏览器的反应,应该是file有限制,授权没有缓存。

最后放一个gpt给的总结:

相关推荐
只一10 分钟前
拿捏大模型输出随机性:Temperature、Top-K 原理 + LangChain 工程落地实战
javascript·langchain
大卫陈12 分钟前
微信小程序虚拟支付实战:从「支付能力被限制」到沙箱调通的全过程
前端·后端
武子康12 分钟前
vLLM 0.25.1:服务没有报错,为什么仍会生成垃圾 Token(5 级正确性门禁 + 自动回滚条件)
前端·人工智能·后端
jyp2012110716 分钟前
Vue3 Diff 算法
前端·vue.js
胡萝卜术20 分钟前
抽象的三级跳:从原生 DOM 到 React 组件树,我们到底在解决什么问题?
前端·javascript·面试
黄敬峰23 分钟前
从零理解React:事件、组件与响应式——一个WebGPU Demo的前端笔记
前端·面试
jun_bai24 分钟前
Orthanc for Windows版PACS服务器安装教程
javascript·扩展屏应用开发
GuWen_yue30 分钟前
Cursor黑盒拆解!1套LangChain.js手写Mini编程Agent,自动生成React项目,效率提升60%
javascript·react.js·langchain
用户2986985301435 分钟前
React 项目中灵活管理 Excel 工作表:增删与移动
javascript·react.js·excel
weedsfly37 分钟前
从类继承到自定义 Hook:模板方法模式的前端演进
前端·javascript·面试