在你的getUserMedia()开始运行的那一瞬间,就会遇到各种各样的错误: 1. 用户没有摄像头,只有一个麦克风;或者麦克风/摄像头都没有 2. 用户在你的getUserMedia()代码已经初始化之后才将摄像头/麦克风插到电脑上 4. 媒体设备已经被其他的应用所占用了 5. TypeError 当传递给getUserMedia()的约束对象为空或者将所有轨道(音轨,视频轨,或者两者)被设置为false的时候就会出现这个问题。 Chrome会出现一条“TypeError:无法在‘MediaDevices’上执行‘getUserMedia’:必须至少请求一个音频和视频”。 解决这些错误 使用基于新的promise的getUserMedia()处理这些错误就很简单了。你可以使用下面的代码:
新版本Chrome中getUserMedia接口在http下不再支持,请使用https来访问 比较兼容的就是需要判断一下 var media=(navigator.getUserMedia media){ return ; } var getUserMedia = media.bind
详细的,可以看下这篇文章Common getUserMedia() Errors 设置网站权限,可以这么做。 点击网址前面的标识图标,弹出网站相关安全信息,可点击网站设置进行设置。
我们不能直接给对象设置 getUserMedia // 因为这样可能会覆盖已有的属性。这里我们只会在没有getUserMedia属性的时候添加它。 if (navigator.mediaDevices.getUserMedia === undefined) { navigator.mediaDevices.getUserMedia = function(constraints) { // 首先,如果有getUserMedia的话,就获得它 var getUserMedia = getUserMedia) { return Promise.reject( new Error("getUserMedia is not implemented in this browser") ); } // 否则,为老的navigator.getUserMedia方法包裹一个Promise
第一步是检查浏览器是否支持此 API: if ("mediaDevices" in navigator && "getUserMedia" in navigator.mediaDevices) { 捕获视频流 要捕获由摄像机生成的视频流,我们使用 mediaDevices 对象的 getUserMedia 方法。这个方法接收一个对象,其中包含我们要请求的媒体类型(视频或音频)和一些要求。 const videoStream = await navigator.mediaDevices.getUserMedia({ video: true }); 此调用将询问用户是否允许访问摄像机。 ideal: 1080, max: 1440, }, }, }; const videoStream = await navigator.mediaDevices.getUserMedia 访问手机的前后摄像头 默认情况下,getUserMedia 将使用系统默认的视频录制设备。如果是有两个摄像头的手机,它使用前置摄像头。
getUserMedia getUserMedia主要用于获取视频和音频信息 RTCPeerConnection 用于浏览器之间的数据交换。 RTCDataChannel `用于浏览器之间的数据交换。 `` 这边目前我只使用到了getUserMedia WebRTC兼容性 这边通过阅读相关文章了解到,目前兼容性情况如下: 由于苹果的安全机制问题,iOS设备任何浏览器都不支持getUserMedia() 最终数据展示,Android设备下,有99.45%的设备在微信是支持getUserMedia()的,98.05%的设备在手Q是支持getUserMedia()的。 实现步骤 目前我的demo的实现步骤如下: 通过WebRTC的API来实现获取通过浏览器网页拉起摄像头操作 // 获取相应的浏览器内核的getUserMedia navigator.getUserMedia ; // 调用getUserMedia方法 function getMedia() { if (navigator.getUserMedia) { navigator.getUserMedia
{ navigator.mediaDevices = {}; } if (navigator.mediaDevices.getUserMedia // 首先,如果有getUserMedia的话,就获得它 var getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia getUserMedia) { return Promise.reject(new Error('getUserMedia is not implemented in this browser')); } // 否则,为老的navigator.getUserMedia方法包裹一个 let v = document.getElementById('v'); let promise = navigator.mediaDevices.getUserMedia
Apple的WebRTC实现仅允许一次捕获一个getUserMedia 如果您的应用程序从多个“getUserMedia()”请求中获取媒体流,则可能会出现iOS问题。 从我的测试中,这个问题可以总结如下:如果“getUserMedia()”请求在先前请求的媒体类型“getUserMedia()”,先前请求媒体轨道的“静音” 属性设置为true,并没有以编程方式取消静音 removeTrack() 用于从全局流创建/操作其他流,而无需再次调用getUserMedia()。 这最终归结为将“deviceId”作为约束传递给“getUserMedia()”。 不幸的是,作为开发人员,作为Webkit安全协议的一部分,在每个新页面加载时为所有设备生成随机“deviceId”。 实际上,这意味着您需要在 调用“enumerateDevices()”之前进行 “getUserMedia()” 调用 。
window.URL = window.URL || window.webkitURL || window.msURL || window.oURL; // Normalizes navigator.getUserMedia navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia|| navigator.mozGetUserMedia accessLocalWebCam(id) { try { // Tries it with spec syntax navigator.getUserMedia } catch (err) { // Tries it with old spec of string syntax navigator.getUserMedia
|| navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia) { //调用用户媒体设备, 访问摄像头 getUserMedia({video: {width: width, height: height}}, success, error); } else { alert('不支持访问用户媒体'); } //访问用户媒体设备的兼容方法 function getUserMedia(constraints , success, error) { if (navigator.mediaDevices.getUserMedia) { //最新的标准API ) { //旧版API navigator.getUserMedia(constraints, success, error);
getUserMedia() 是一个 JavaScript API,允许你访问用户的音频和视频设备(如摄像头和麦克风)。 在不同的浏览器中,它的实现略有不同,但是你可以使用以下代码来实现一个最兼容的版本: //兼容的getUserMedia function getCompatibleUserMedia(constraints , successCallback, errorCallback) { var media = (navigator.getUserMedia || navigator.webkitGetUserMedia 如果浏览器支持 getUserMedia,则使用 call() 方法调用它,并将 navigator 对象、约束、成功回调和错误回调作为参数传递。如果不支持,则在控制台中输出一条错误消息。 type: 'error', message: "Your browser does not support the getUserMedia
,如果存在 var getUserMedia = (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia getUserMedia) { return Promise.reject(new Error('getUserMedia is not implemented in this browser-getUserMedia是不是在这个浏览器实现')); } // 否则,调用包在一个旧navigator.getusermedia承诺 . // 在这里,我们就要错过添加getUserMedia财产。. if (navigator.mediaDevices.getUserMedia === undefined) { navigator.mediaDevices.getUserMedia
function() { const video = this.getSubNode("H5").dom; navigator.mediaDevices.getUserMedia RenderTrigger: function() { this.boxing().initCamera(); } }});二、技术点深度解析2.1 媒体设备访问机制核心依赖Web API getUserMedia 实现摄像头数据流捕获:navigator.mediaDevices.getUserMedia({ video: true }) .then(stream => video.srcObject = 1280:640 } } }; // 重新初始化摄像头 }}3.4 跨浏览器兼容性前缀处理:针对旧浏览器提供兼容性封装const getUserMedia = navigator.mediaDevices.getUserMedia getUserMedia) { this.getSubNode("H5").html("您的浏览器不支持摄像头功能");}特性检测:提前检查浏览器支持情况四、快速扩展指南4.1 添加拍照按钮//
基础代码 navigator.mediaDevices.getUserMedia({ audio: false, video: true }).then(async (stream) => { 开发遇到的各种问题 浏览器控制台提示mediaDevices.getUserMedia is not a function 由于受浏览器的限制,navigator.mediaDevices.getUserMedia 最开始想到的是,getUserMedia在摄像头拔出时可能会通过catch报错。 然而经过多次的实验,getUserMedia在摄像头拔出时,不会响应找不到摄像头的错误,想通过catch直接监控这种方法并不可行。 在几乎没有思路的时候,在getUserMedia文档上看到了这么一句话: getUserMedia返回一个 Promise , 这个Promise成功后的回调函数带一个 MediaStream 对象作为其参数
=== undefined) { navigator.mediaDevices.getUserMedia = function (constraints) { // 首先, 如果有getUserMedia的话,就获得它 var getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia getUserMedia) { return Promise.reject(new Error('getUserMedia is not implemented in this browser ')); } // 否则,为老的navigator.getUserMedia方法包裹一个Promise return new Promise(function (resolve, reject) { getUserMedia.call(navigator, constraints, resolve, reject); })
一、原理解析浏览器访问摄像头的能力主要依赖于 WebRTC(Web Real-Time Communication) 标准,其中最关键的 API 是 MediaDevices.getUserMedia( ┐ │
) { //最新标准API navigator.mediaDevices.getUserMedia(constraints).then(success).catch(error firefox浏览器 navigator.mozGetUserMedia(constraints, success, error); } else if (navigator.getUserMedia ) { //旧版API navigator.getUserMedia(constraints, success, error); } } 通过此函数, 获取当前浏览器支持的getUserMedia 对象 开启浏览器摄像头/语音权限 getUserMediaToPhoto({ video: { width: 480, height: 320 },audio : true }, success, error); 具体文档可查看:https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia
▷getUserMedia getUserMedia主要用于获取视频和音频信息 ▷RTCPeerConnection 用于浏览器之间的数据交换。 这边目前我只使用到了getUserMedia 05 WebRTC兼容性 这边通过阅读相关文章了解到,目前兼容性情况如下: 由于苹果的安全机制问题,iOS设备任何浏览器都不支持getUserMedia() 最终数据展示,Android设备下,有99.45%的设备在微信是支持getUserMedia()的,98.05%的设备在手Q是支持getUserMedia()的。 而我们之前测试机型里面,本机浏览器、QQ浏览器对getUserMedia()都有不同程度的支持。
—— MDN-WebRTC_API 核心API 核心的API为:navigator.mediaDevices.getUserMedia 特注:这里还有一个旧有的 API Navigator.getUserMedia search=GetUserMedia 本瓜结合网上代码,小做修改,放到了线上。 (constraints, success, error) { if (navigator.mediaDevices.getUserMedia) { //最新的标准API ) { //旧版API navigator.getUserMedia(constraints, success, error); } } let , 访问摄像头 getUserMedia({ video: { width: 480, height: 320 } }, success, error); } else {
1、getUserMedia :getUserMedia主要用于获取视频和音频信息 2、RTCPeerConnection :用于浏览器之间的数据交换。 3、RTCDataChannel :用于浏览器之间的数据交换 这边目前我只使用到了getUserMedia WebRTC兼容性 这边通过阅读相关文章了解到,目前兼容性情况如下: 由于苹果的安全机制问题, iOS设备任何浏览器都不支持getUserMedia()。 最终数据展示,Android设备下,有99.45%的设备在微信是支持getUserMedia()的,98.05%的设备在手Q是支持getUserMedia()的。 而我们之前测试机型里面,本机浏览器、QQ浏览器对getUserMedia()都有不同程度的支持。