js调取摄像头并且识别二维码

二维码识别使用的是jsqrcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
html,body{
padding: 0;
margin: 0;
}
video{
display: none;
}
canvas{
position: absolute;
top: -99999px;
left: -9999px;
z-index: -999;
}
</style>
</head>
<body>

<button id="start">拍照</button>
<video id="video" autoplay muted playsinline></video>
<canvas id="canvas"></canvas>

<script src="https://webqr.com/llqrcode.js"></script>

<script>
var timer = null
var stream = null
var video = document.querySelector("#video")
var canvas = document.querySelector("#canvas")
canvas.style.width = window.innerWidth;
canvas.style.height = window.innerHeight;
document.querySelector("#start").addEventListener("click", async function() {
try {
stream = await navigator.mediaDevices.getUserMedia({ video: { facingMode: 'environment' }, audio: false });
}
catch(error) {
alert(error.message);
return;
}
video.requestFullscreen();
video.srcObject = stream;
video.style.display = 'block';

clearInterval(timer)
timer = setInterval(function() {
canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);
var image_data_url = canvas.toDataURL('image/jpeg');
qrcode.decode(image_data_url)
qrcode.callback = function(msg){
if(!msg.match(/^error/)) {
clearInterval(timer)
document.exitFullscreen();
alert(msg)
}
}
}, 500)
})

document.addEventListener("fullscreenchange", function(event) {
// 关闭全屏时还原
if (!document.fullscreenElement) {
clearInterval(timer)
video.srcObject = null;
video.style.display = 'none';
stream.getTracks().forEach(track => track.stop())
}
});
</script>
</body>
</html>