-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcamera.js
More file actions
49 lines (44 loc) · 1.39 KB
/
camera.js
File metadata and controls
49 lines (44 loc) · 1.39 KB
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
class Camera {
constructor(videoElement, options) {
this.video = videoElement;
this.onFrame = options.onFrame || (() => { });
this.width = options.width || 640;
this.height = options.height || 480;
this.stream = null;
this.isRunning = false;
}
async start() {
if (this.isRunning) return;
try {
this.stream = await navigator.mediaDevices.getUserMedia({
video: {
facingMode: 'user',
width: { ideal: this.width },
height: { ideal: this.height }
},
audio: false
});
this.video.srcObject = this.stream;
this.video.onloadedmetadata = () => {
this.isRunning = true;
this.video.play();
this.loop();
};
} catch (error) {
console.error("Camera access error:", error);
alert("Camera access failed. Please ensure HTTPS is enabled and permissions granted.");
}
}
async loop() {
if (!this.isRunning) return;
await this.onFrame();
requestAnimationFrame(this.loop.bind(this));
}
stop() {
this.isRunning = false;
if (this.stream) {
this.stream.getTracks().forEach(track => track.stop());
this.stream = null;
}
}
}