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

相关推荐
Larry_Yanan1 小时前
QML学习笔记(十七)QML的属性变更信号
javascript·c++·笔记·qt·学习·ui
真的想不出名儿2 小时前
vue项目引入字体
前端·javascript·vue.js
胡楚昊2 小时前
Polar WEB(1-20)
前端
吃饺子不吃馅2 小时前
AntV X6图编辑器如何实现切换主题
前端·svg·图形学
余防3 小时前
XXE - 实体注入(xml外部实体注入)
xml·前端·安全·web安全·html
jump_jump3 小时前
前端部署工具 PinMe
运维·前端·开源
Baklib梅梅4 小时前
优秀文档案例解析:打造高效用户体验的最佳实践
前端·ruby on rails·前端框架·ruby
慧一居士4 小时前
VUE、jquery、React、Ant Design、element ui、bootstrap 前端框架的 功能总结,示例演示、使用场景介绍、完整对比总结
前端
GISer_Jing4 小时前
0926第一个口头OC——快手主站前端
开发语言·前端·javascript
MediaTea5 小时前
Jupyter Notebook:基于 Web 的交互式编程环境
前端·ide·人工智能·python·jupyter