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给的总结:

相关推荐
油丶酸萝卜别吃8 分钟前
前端转全栈学习路线
前端·学习
浮生望23 分钟前
前端路由进阶:History API原理与手写HistoryRouter
前端
陆枫Larry44 分钟前
JavaScript 中的竞态是什么,为啥会有竟态?
前端
上海安当技术3 小时前
半天接入:USBKey RESTful API + C 动态库,Web 和 C/S 两套集成路径实战
前端·后端·restful·集成·usbkey
DevUI团队3 小时前
从“即兴创作”到“规格先行”,华为云码道(CodeArts)代码智能体持续深耕企业级规范驱动开发能力
前端·人工智能·后端
weixin_431600444 小时前
NestJS 入门(3):Guard 如何挡住未登录请求?
前端·后端·学习·nest.js
avi91114 小时前
[AI教做人]AI平台做2项目;一个3D模型展示,另一个框架多人
javascript·人工智能·ai·3d模型·3d引擎·顶点和法线
kyriewen5 小时前
我用Claude Code两天干完了团队两周的排期——周报发出去那一刻我就后悔了
前端·javascript·ai编程
IT_陈寒5 小时前
JavaScript类型转换把我坑惨了,这破玩意真该早点搞明白
前端·人工智能·后端
用户938515635075 小时前
Type vs Interface:读完这篇就没有面试官能难倒你了
前端·面试·typescript