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

相关推荐
小码哥_常11 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
蜗牛攻城狮13 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
她说可以呀14 小时前
Vue插槽
前端·javascript·vue.js
qq_4480111614 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
aixingpan15 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
2601_9583529015 小时前
23.5×19mm 换掉一整条音频链?|A-68 集成了什么:ADC / DAC / 24.576MHz 时钟 / AEC / 波束降噪,主控仅需 6 根线
前端·音视频·ai降噪·回声消除·语音模块
志尊宝16 小时前
AI原生前端开发(039):AI辅助的Nuxt 4全栈开发
前端·vue.js·ai-native
FRing0317 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript
excel17 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放17 小时前
Python基础语法练习题(73)
java·前端·python