html打开摄像头拍照,微信公众号H5拉起前置摄像头

前言

1、实现html网页拍照效果,可以用于人脸识别(PC端不限制)。
2、微信公众号H5页面打开前置摄像头拍照/人脸识别(必须https协议)。
3、兼容安卓和iOS。

效果

在这里插入图片描述

实现

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>H5摄像头(新版浏览器https)(兼容老版浏览器)</title>
</head>
<body>
	<!-- 说明:将网页更改为https访问才行 否者报错:
	NotSupportedError Only secure origins are allowed (see: https://goo.gl/Y0ZkNV). -->
	
	<!-- video用于显示媒体设备的视频流,自动播放;属性:https://zhuanlan.zhihu.com/p/535917105 -->
	<video id="video" autoplay webkit-playsinline="true" playsinline="true"
		style="width: 500px;height: 400px;transform: rotateY(180deg);display:none;"></video>
		<!-- transform: rotateY(180deg); 镜像解决 -->
	<!-- 可以通过画布canvas渲染,获取使用默认的video也行 -->
	<canvas id="canvas" width="500" height="400" style="transform: rotateY(180deg);"></canvas>
	<!-- 拍照按钮 -->
	<div><button id="capture" style="color: blue;">拍照</button></div>
	<!-- 描绘video截图 -->
	<img id="img" alt="" src="">
	
	<script type="text/javascript">
		var video = document.getElementById("video");
		var img = document.getElementById("img");
		var canvas = document.getElementById("canvas");
		var context = canvas.getContext("2d");
		var v_t_w = 500, v_t_h = 400;
		
		// 访问用户媒体设备的兼容方法
		function getUserMedia(constrains, successFun, errorFun){
			//like12 modified,20210628,bug,navigator.mediaDevices为空会导致后面卡死
			if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia){
				//最新标准API(新版浏览器https)
				navigator.mediaDevices.getUserMedia(constrains).then(successFun).catch(errorFun);
			} else if (navigator.webkitGetUserMedia){
				//like12 modified,20210628,不是这种调用方法 应该为后者
				//webkit内核浏览器(老版浏览器)
				//navigator.webkitGetUserMedia(constrains).then(successFun).catch(errorFun);
				navigator.webkitGetUserMedia({ "video": true }, successFun, errorFun);
			} else if (navigator.mozGetUserMedia){
				//Firefox浏览器
				navagator.mozGetUserMedia(constrains).then(successFun).catch(errorFun);
			} else if (navigator.getUserMedia){
				//旧版API
				navigator.getUserMedia(constrains).then(successFun).catch(errorFun);
			}
		}
		
		// 成功的回调函数
		function successFun(stream){
			//like12 modifed,20210618,Chrome升级后,新版本不再支持该用法
			//摄像头视频流显示报错Failed to execute 'createObjectURL' on 'URL'
			//研究即时通信的过程中需要调用摄像头,发现报错,原来是谷歌弃用了这个方法,根据官方提示修改即可
			//所以原先的代码:video.src = URL.createObjectURL(stream);
			//需要被修改为:video.srcObject = stream;
			//(新版浏览器https)
			if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia){
				video.srcObject = stream;
			}
			//(老版浏览器)
			else{
				//兼容webkit内核浏览器
				var CompatibleURL = window.URL || window.webkitURL;
				//将视频流设置为video元素的源
				//此处的代码将会报错  解决的办法是将video的srcObject属性指向stream即可
				video.src = CompatibleURL.createObjectURL(stream);
			}
			// 播放视频
			video.play();
			// 可以通过画布canvas渲染,获取使用默认的video也行
			setInterval(function(){
				canvas.width = v_t_w;
		        canvas.height = v_t_h;
				context.drawImage(video, 0, 0, v_t_w, v_t_h);
			}, 10);
		}
		
		// 异常的回调函数
		function errorFun(error){
			console.log("访问用户媒体设备失败:", error.name, error.message);
			alert("访问用户媒体设备失败:" + error.name + " " + error.message);
		}
		
		// 注册拍照按钮的单击事件-截图
		document.getElementById("capture").addEventListener("click",function(){
			var base64Img = canvas.toDataURL('image/jpg');
			//var base64 = canvas.toDataURL('image/jpeg',0.5);// 图片质量0.5
			img.src = base64Img;
		});
		
		// 开始调用摄像头
		//like12 modified,20210628,bug,navigator.mediaDevices为空会导致后面卡死
		if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia
				|| navigator.getUserMedia
				|| navigator.webkitGetUserMedia
				|| navigator.mozGetUserMedia){
			// 调用用户媒体设备,访问摄像头
			getUserMedia({
				video:{width:v_t_w, height:v_t_h}
			}, successFun, errorFun);
		} else {
			alert("你的浏览器不支持访问用户媒体设备");
		}
		
	</script>
</body>
</html>

参考1:https://blog.csdn.net/tanzongbiao/article/details/118314864
参考2:https://blog.csdn.net/weixin_35959554/article/details/118220438
获取手机拍照和相册,官方:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#16
微信小程序拉取前摄像头参考:https://blog.csdn.net/LzzMandy/article/details/107005056

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值