当前位置: 首页 > news >正文

webRtc麦克风摄像头检测

最近在做webRtc相关音视频项目,碰到了很多用户不知道自己设备是否被支持发起webRtc,所以特意总结相关实用方法;

HTML
/*id方便一会把媒体流赋值过去, autoPlay: 自动播放 */
<audio id="devDetectionMicroRef" autoPlay></audio>
/*video建议知道宽高, autoPlay: 自动播放 */
<video id="devDetectionVideoRef" autoPlay width="640" height="480"></video>
检测麦克风相关
/* 全局变量 */
const audioSteam = {current: null
}
// 获取音视频轨道流
handleMicrophoneDetection(){navigator.mediaDevices.getUserMedia({audio: true}).then(stream => {audioSteam.current = stream;// 获取当前采集麦克风名称handleStreamGetMicroName();// 处理播放handleAudioPlay();}).catch(error => {let errorMessage = error + '';if (errorMessage.includes('Permission denied')) {errorMessage = '请开启麦克风权限';} else if (errorMessage.includes('Requested device not found')) {errorMessage = '请检测麦克风是否插入';};console.log('error', errorMessage)});
},
// 处理播放
handleAudioPlay(){const stream = audioSteam.current;const elm: HTMLVideoElement | any = document.getElementById('devDetectionMicroRef');if (elm) {elm.srcObject = stream;}
}
// 获取麦克风名
handleStreamGetMicroName(){if (audioSteam.current) {const audioTrack = audioSteam.current.getAudioTracks()[0];console.log(audioTrack.label);}
}
// 停止麦克采集
stopAudioSteam() {if (audioSteam.current) {audioSteam.current.getTracks().forEach((sender: any) => {sender.stop();});}
}
检测摄像头相关
/*全局变量*/
const videoSteam = {current: null
}
// 摄像头检测
handleCameraDetection() {navigator.mediaDevices.getUserMedia({video: true}).then((stream) => {videoSteam.current = stream;// 获取摄像头名称handleStreamGetCameraName();// 播放handleVideoPlay();}).catch((error) => {let errorMessage = error + '';if (errorMessage.includes('Permission denied')) {errorMessage = '请开启摄像头权限';} else if (errorMessage.includes('Requested device not found')) {errorMessage = '请检测摄像头是否插入';};console.log('error', errorMessage);})
}
// 播放
handleVideoPlay() {const stream = videoSteam.current;const elm: HTMLVideoElement | any = document.getElementById('devDetectionVideoRef');if (elm) {elm.srcObject = stream;}
}
// 根据stream获取摄像头名称
handleStreamGetCameraName() {if (videoSteam.current) {const videoTrack = videoSteam.current.getVideoTracks()[0];setGatherCameraName(videoTrack.label);}
}
// 停止摄像头采集
stopVideoSteam() {if (videoSteam.current) {videoSteam.current.getTracks().forEach((sender: any) => {sender.stop();});}
}
获取默认采集设备
handleDefaultDeviceId(type: number) {switch(type) {case 1: // 获取默认音频设备{navigator.mediaDevices.getUserMedia({audio: true}).then((stream) => {const tracks = stream.getTracks();for (let i in tracks) {// 获取音频默认采集设备idlet deviceId = tracks[i].getSettings().deviceId + '';tracks[i].stop();}}).catch((error) => {console.log('error', error);})}break;case 2: // 获取默认视频设备{navigator.mediaDevices.getUserMedia({video: true}).then((stream) => {const tracks = stream.getTracks();for (let i in tracks) {// 获取视频默认采集设备idlet deviceId = tracks[i].getSettings().deviceId + '';tracks[i].stop();}}).catch((error) => {console.log('error', error);})}break;}
},

相关文章:

  • mysql基础2多表查询
  • php搭建websocket
  • mybatis实践篇(二)
  • OSPF-1类Router LSA学习
  • 2024 年广西职业院校技能大赛高职组《云计算应用》赛项赛题第 2 套
  • Java设计模式之单例模式(多种实现方式)
  • 手撕算法-删除链表的倒数第 N 个结点
  • 抖音IP属地怎么更改
  • pta-洛希极限
  • PostgreSQL关系型数据库介绍与部署
  • [AIGC] Redis基础命令集详细介绍
  • Git——IDEA中的使用详解
  • 【Android 内存优化】Koom核心内存指标分析
  • C++一维数组练习oj(3)
  • Android kotlin全局悬浮窗全屏功能和锁屏页面全屏悬浮窗功能二
  • 【css3】浏览器内核及其兼容性
  • Angular 响应式表单 基础例子
  • javascript数组去重/查找/插入/删除
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Koa2 之文件上传下载
  • Map集合、散列表、红黑树介绍
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • python学习笔记 - ThreadLocal
  • React16时代,该用什么姿势写 React ?
  • React系列之 Redux 架构模式
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • 反思总结然后整装待发
  • 工作中总结前端开发流程--vue项目
  • 前端面试总结(at, md)
  • 三栏布局总结
  • 手写一个CommonJS打包工具(一)
  • 与 ConTeXt MkIV 官方文档的接驳
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (12)Linux 常见的三种进程状态
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一)UDP基本编程步骤
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .net framework4与其client profile版本的区别
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .Net程序帮助文档制作
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • @在php中起什么作用?
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [ 数据结构 - C++] AVL树原理及实现
  • [] 与 [[]], -gt 与 > 的比较
  • [Android]使用Git将项目提交到GitHub
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)