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 分钟前
chrome使用手机调试触屏web
前端·chrome
Aphasia31139 分钟前
模式验证库——zod
前端·react.js
lexiangqicheng1 小时前
es6+和css3新增的特性有哪些
前端·es6·css3
拉不动的猪2 小时前
都25年啦,还有谁分不清双向绑定原理,响应式原理、v-model实现原理
前端·javascript·vue.js
烛阴2 小时前
Python枚举类Enum超详细入门与进阶全攻略
前端·python
孟孟~2 小时前
npm run dev 报错:Error: error:0308010C:digital envelope routines::unsupported
前端·npm·node.js
孟孟~2 小时前
npm install 报错:npm error: ...node_modules\deasync npm error command failed
前端·npm·node.js
狂炫一碗大米饭2 小时前
一文打通TypeScript 泛型
前端·javascript·typescript
wh_xia_jun3 小时前
在 Spring Boot 中使用 JSP
java·前端·spring boot
二十雨辰3 小时前
[HTML5]快速掌握canvas
前端·html