iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >HTML5如何通过navigator.mediaDevices.getUserMedia调用手机摄像头
  • 940
分享到

HTML5如何通过navigator.mediaDevices.getUserMedia调用手机摄像头

2023-06-09 11:06:41 940人浏览 薄情痞子
摘要

这篇文章主要介绍了HTML5如何通过navigator.mediaDevices.getUserMedia调用手机摄像头,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。navi

这篇文章主要介绍了HTML5如何通过navigator.mediaDevices.getUserMedia调用手机摄像头,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

navigator.mediaDevices.getUserMedia

项目要求,需要实现移动端app嵌入H5页面完成实人认证的功能。打开getUserMedia文档,链接如下:
https://developer.mozilla.org/zh-CN/docs/WEB/api/MediaDevices/getUserMedia
看上去很简单,最终却写的怀疑人生。

API环境

问题一:(为什么不管怎么配置都显示前置摄像头)

想正常使用API必须在Https环境下进行,否则你会发现不管怎么写,都只能调用默认的摄像头(大部分都是前置,只有少部分是后置)
前端开发者可以将文件上传至"码云"仓库,获取https链接然后在手机上预览
链接:码云仓库入口

问题二:(API在安卓和ios效果一样吗?)

根据官方文档,目前navigator.mediaDevices.getUserMedia在iOS上只支持11版本以上,且只能在safari正常运行。安卓目前没有发现版本限制,需要兼容的代码如下

if (navigator.mediaDevices === undefined) {    navigator.mediaDevices = {}; }if (navigator.mediaDevices.getUserMedia === undefined) {    navigator.mediaDevices.getUserMedia = function (constraints) {    var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia || navigator.oGetUserMedia;if (!getUserMedia) {    return Promise.reject(new Error('getUserMedia is not implemented in this browser'));}return new Promise(function (resolve, reject) {getUserMedia.call(navigator, constraints, resolve, reject);});  }}

问题三:(第一次启用成功调用前置摄像头,第二次需要调用后置却黑屏或者失败)

失败的原因很多,列举两个一开始我遇到的问题
1.前置摄像头调用后,摄像功能需要关闭后才能正常执行第二次调用,否则会报错:设备被占用。解决方法,在每次执行调用方法前,先关闭摄像设备。

if (window.stream) {    window.stream.getTracks().forEach(track => {          track.stop();    });}

亲测有用,别的找了很多停止的方法都没有效果。
2.调用后置API的方法还是无法唤醒后置摄像头,于是我找到另外一个方法,通过查看手机摄像头ID,来直接唤醒后置。

var deviceInfoId="", //摄像头ID    num = 0, //摄像头数量    carema = []; //摄像头ID数组    //在页面加载完成后获得设备ID数组window.onload = navigator.mediaDevices.enumerateDevices().then(GotDevices);function gotDevices(deviceInfos) {        for (let i = 0; i < deviceInfos.length; ++i) {            if (deviceInfos[i].kind === 'videoinput') {                carema.push(deviceInfos[i].deviceId)              }        }        deviceInfoId = carema[后置位置];}            var constraints = {                audio: false,                video: {                    deviceId: deviceInfoId,                    //放在app里面需要下面配置一下                    "permissions": {                        "audio-capture": {                            "description": "Required to capture audio using getUserMedia()"                        },                        "video-capture": {                            "description": "Required to capture video using getUserMedia()"                        }                    }                }            };            navigator.mediaDevices.getUserMedia(constraints)                .then(function (stream) {                    var video = document.getElementById('video');                    try {                        window.stream = stream;                        video.srcObject = stream;                    } catch (error) {                        video.src = window.URL.createObjectURL(stream);                    }                    this.localMediaStream = stream;                    // video.play();   这个加不加好像没有影响                })                .catch(function (err) {                    console.log(err.name + ": " + err.message);                });

如果只是一部手机可以这样,但是测试了多部手机发现摄像头数组毫无规律可循,这个方法慎用。
如果页面上添加选择摄像设备的按钮的话,这个方法还是不错的。查看设备能调用几个摄像头链接如下:https://webrtc.GitHub.io/samples/src/content/devices/input-output/
由于我们的项目页面不希望出现切换按钮,面对后置出现的众多BUG,最终选择放弃,使用input调用摄像头。

 <input class="card_input" v-on:change="appCapture($event)" type="file" accept="image/*" capture="camera" />

成功调用后用canvas实现成像并适应屏幕大小

我这里的代码是取video的宽高然后复制给canvas,这样可以让canvas和video保持一致,只用给video设置宽度100%,高度调节成合适的值,就实现了适应手机屏幕。

  var video = document.getElementById('video');            var canvas = document.getElementById('canvas'),                ctx = canvas.getContext('2d'),                CHeight = video.clientHeight, //获取屏幕大小让canvas自适应                CWidth = video.clientWidth;            canvas.width = CWidth;            canvas.height = CHeight;            //localMediaStream 在data里定义一个{}            if (localMediaStream) {                ctx.drawImage(video, 0, 0, CWidth, CHeight);                var dataURL = canvas.toDataURL('image/jpeg'); //dataURL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA'                img.src = dataURL;

video成像镜像问题

API唤醒的前置摄像头是相反的,很不舒服很不舒服。
之后用CSS处理一下给video添加 transfORM: rotate(180deg),可以实现反转,但是还是没有达到和手机一样的效果。
这时候可以选择通过设备ID调用前置摄像头,前置摄像头的laval一直都是“default”,也有的是空值,但是也能实现。
配置代码如下:

 var constraints = window.constraints = {                audio: false,                video: {                    sourceId: 'default',                    facingMode:  { exact: "user" }                 }              };

完美调用自己手机的前置摄像头!!!

完整代码如下:
页面代码:

<div @click='moveToCameraAVG()' v-cloak>     <img v-if="imginfo!==''" :src="imginfo" />     <div class="warm_title2">点击自拍一张头像</div></div><video id="video" class="pic_video" playsinline autoplay x5-video-player-type="h6" style='object-fit:fill'></video><canvas id="canvas" class="canvas_pic" style='margin: 0;padding: 0;'></canvas><div class="bottom_div">    <div>拍照</div>    <img src='images/pic_btn.png' class="capture-btn" @click='captureAvg' /></div>
 // 头像相机        moveToCameraAVG() {            var self = this;            if (navigator.mediaDevices === undefined) {                navigator.mediaDevices = {};            }            if (navigator.mediaDevices.getUserMedia === undefined) {                navigator.mediaDevices.getUserMedia = function (constraints) {                    var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia || navigator.oGetUserMedia;                    if (!getUserMedia) {                        return Promise.reject(new Error('getUserMedia is not implemented in this browser'));                    }                    return new Promise(function (resolve, reject) {                        getUserMedia.call(navigator, constraints, resolve, reject);                    });                }            }            if (window.stream) {                window.stream.getTracks().forEach(track => {                    track.stop();                });            }            var constraints = window.constraints = {                audio: false,                video: {                    sourceId: 'default',                    facingMode:  { exact: "user" }                 }              };            navigator.mediaDevices.getUserMedia(constraints)                .then(function (stream) {                    var video = document.getElementById('video');                    try {                        window.stream = stream;                        video.srcObject = stream;                    } catch (error) {                        video.src = window.URL.createObjectURL(stream);                    }                    self.localMediaStream = stream;                    video.play();                })                .catch(function (err) {                    alert(err.name + ": " + err.message);                });        },        //停止摄像机        stopCapture: function () {            var video = document.getElementById('video');            if (!video.srcObject) return            let stream = video.srcObject            let tracks = stream.getTracks();            tracks.forEach(track => {                track.stop()            })        },        // 头像照片        captureAvg() {            var vm = this;            var video = document.getElementById('video');            var canvas = document.getElementById('canvas'),                ctx = canvas.getContext('2d'),                CHeight = video.clientHeight, //获取屏幕大小让canvas自适应                CWidth = video.clientWidth;            canvas.width = CWidth;            canvas.height = CHeight;            if (vm.localMediaStream) {                ctx.drawImage(video, 0, 0, CWidth, CHeight);                var dataURL = canvas.toDataURL('image/jpeg'); //dataURL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA'                vm.imginfo = dataURL;                // 停止摄像机                video.pause();                this.stopCapture();            }        },

感谢你能够认真阅读完这篇文章,希望小编分享的“html5如何通过navigator.mediaDevices.getUserMedia调用手机摄像头”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: HTML5如何通过navigator.mediaDevices.getUserMedia调用手机摄像头

本文链接: https://www.lsjlt.com/news/255736.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • HTML5如何通过navigator.mediaDevices.getUserMedia调用手机摄像头
    这篇文章主要介绍了HTML5如何通过navigator.mediaDevices.getUserMedia调用手机摄像头,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。navi...
    99+
    2023-06-09
  • python中如何通过opencv调用摄像头
    这篇文章主要为大家展示了“python中如何通过opencv调用摄像头”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中如何通过opencv调用摄像头”这篇文章吧。实例源码:#pip3...
    99+
    2023-06-15
  • html5如何实现调用摄像头
    小编给大家分享一下html5如何实现调用摄像头,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!html是什么html的全称为超文本标记语言,它是一种标记语言,包含了...
    99+
    2023-06-09
  • Html5中如何调用手机摄像头并实现人脸识别
    这篇文章主要介绍了Html5中如何调用手机摄像头并实现人脸识别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。需求混合App开发,原生壳子+webApp,在web部分调用原生摄...
    99+
    2023-06-09
  • Android调用手机摄像头的方法
    本文实例为大家分享了Android调用手机摄像头的具体代码,供大家参考,具体内容如下 根据<第一行代码>进行改写: 布局文件,只有一个按钮,和一个Imageview,im...
    99+
    2024-04-02
  • 怎么用HTML5实现调用手机摄像头拍照功能
    本篇内容介绍了“怎么用HTML5实现调用手机摄像头拍照功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • Android相机调用-CameraX【外接摄像头】【USB摄像头】
    Android相机调用有原生的Camera和Camera2,我觉得调用代码都太复杂了,CameraX调用代码简洁很多。 说明文档:https://developer.android.com/jetpack/androidx/releases...
    99+
    2023-10-22
    数码相机 android
  • 怎么在html5中调用摄像头
    本篇文章给大家分享的是有关怎么在html5中调用摄像头,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。调用摄像头第一种方法navigator.getUserMedia用法详见md...
    99+
    2023-06-09
  • Android如何实现调用手机摄像头录像限制录像时长
    小编给大家分享一下Android如何实现调用手机摄像头录像限制录像时长,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体内容如下因为服务器空间有限,所以视频时长必须有所限制。在xml中先布局一个按钮,点击开始录频。布局一个...
    99+
    2023-06-29
  • VS2022如何调试通过海康摄像头烟火识别SDK
    这篇文章主要介绍VS2022如何调试通过海康摄像头烟火识别SDK,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!下面是我根据海康官方文档代码,放到VS 2022 版本中调试通过后的代码:#include &l...
    99+
    2023-06-29
  • JS如何调用安卓手机摄像头扫描二维码
    小编给大家分享一下JS如何调用安卓手机摄像头扫描二维码,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!项目要求:使用H5模仿微信扫一扫付款功能经过一系列的查找最后发现可以使用 JS调用手机摄...
    99+
    2024-04-02
  • Android如何调用外置摄像头
    这篇文章主要介绍了Android如何调用外置摄像头的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android如何调用外置摄像头文章都会有所收获,下面我们一起来看看吧。布局文件<xml vers...
    99+
    2023-06-29
  • 关于Python如何调用摄像头
    完整代码 import cv2 cap = cv2.VideoCapture(0) while(cap.isOpened()): retval, frame = cap.re...
    99+
    2023-05-16
    Python 摄像头 Python 调用摄像头
  • Android实现调用手机摄像头录像限制录像时长
    本文实例为大家分享了Android实现调用手机摄像头录像限制录像时长的具体代码,供大家参考,具体内容如下 因为服务器空间有限,所以视频时长必须有所限制。 在xml中先布局一个按钮,点...
    99+
    2024-04-02
  • Python如何实现调用摄像头拍摄照片
    本文小编为大家详细介绍“Python如何实现调用摄像头拍摄照片”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python如何实现调用摄像头拍摄照片”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。步骤用opencv...
    99+
    2023-07-02
  • Android调用手机摄像头拍照和录音功能
    本文实例为大家分享了Android调用手机摄像头拍照和录音功能的具体代码,供大家参考,具体内容如下 调用摄像头拍照: public class MainActivity extend...
    99+
    2024-04-02
  • 如何实现HTML5 Canvas+JS控制电脑或手机上的摄像头
    这篇文章主要介绍“如何实现HTML5 Canvas+JS控制电脑或手机上的摄像头”,在日常操作中,相信很多人在如何实现HTML5 Canvas+JS控制电脑或手机上的摄像头问题上存在疑惑,小编查阅了各式资料...
    99+
    2024-04-02
  • win10电脑usb如何连接手机摄像头
    电脑usb连接手机摄像头?由于手机摄像头的技术越来越高端,质量不断提高,一些手机摄像头现在配备了前后1300万像素,远高于电脑摄像头。很多人想用手机摄像头代替电脑摄像头以改善自身形象,然而他们缺乏相关操作指导。那么win10电脑如何使用us...
    99+
    2023-07-10
  • 使用javacv怎么调用本机摄像头
    本篇文章给大家分享的是有关使用javacv怎么调用本机摄像头,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各...
    99+
    2023-06-14
  • vue实现调取手机摄像头和相册功能
    本文实例为大家分享了vue实现调取手机摄像头和相册的具体代码,供大家参考,具体内容如下 自己总结的手机端拍照和相册原生的方法 HTML代码 <div> //要显示的图...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作