├── .gitignore ├── .vscode └── settings.json ├── README.md ├── index.html └── script.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "javascript.implicitProjectConfig.checkJs": true 3 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JavaScript Camera 2 | 3 | Example code showing how to access device cameras via JavaScript (no external libraries needed) 4 | 5 | See the post: https://www.webdevdrops.com/en/how-to-access-device-cameras-with-javascript/ 6 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | JavaScript Camera 8 | 9 | 10 | 11 | 12 | 13 |
14 |
15 |
16 |
17 |

18 | JavaScript Camera 19 |

20 | 21 | 26 | 31 | 36 | 42 |
43 |
44 |

Screenshots

45 |
46 |
47 |
48 |
49 |
50 | 51 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /script.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | if ( 3 | !"mediaDevices" in navigator || 4 | !"getUserMedia" in navigator.mediaDevices 5 | ) { 6 | alert("Camera API is not available in your browser"); 7 | return; 8 | } 9 | 10 | // get page elements 11 | const video = document.querySelector("#video"); 12 | const btnPlay = document.querySelector("#btnPlay"); 13 | const btnPause = document.querySelector("#btnPause"); 14 | const btnScreenshot = document.querySelector("#btnScreenshot"); 15 | const btnChangeCamera = document.querySelector("#btnChangeCamera"); 16 | const screenshotsContainer = document.querySelector("#screenshots"); 17 | const canvas = document.querySelector("#canvas"); 18 | const devicesSelect = document.querySelector("#devicesSelect"); 19 | 20 | // video constraints 21 | const constraints = { 22 | video: { 23 | width: { 24 | min: 1280, 25 | ideal: 1920, 26 | max: 2560, 27 | }, 28 | height: { 29 | min: 720, 30 | ideal: 1080, 31 | max: 1440, 32 | }, 33 | }, 34 | }; 35 | 36 | // use front face camera 37 | let useFrontCamera = true; 38 | 39 | // current video stream 40 | let videoStream; 41 | 42 | // handle events 43 | // play 44 | btnPlay.addEventListener("click", function () { 45 | video.play(); 46 | btnPlay.classList.add("is-hidden"); 47 | btnPause.classList.remove("is-hidden"); 48 | }); 49 | 50 | // pause 51 | btnPause.addEventListener("click", function () { 52 | video.pause(); 53 | btnPause.classList.add("is-hidden"); 54 | btnPlay.classList.remove("is-hidden"); 55 | }); 56 | 57 | // take screenshot 58 | btnScreenshot.addEventListener("click", function () { 59 | const img = document.createElement("img"); 60 | canvas.width = video.videoWidth; 61 | canvas.height = video.videoHeight; 62 | canvas.getContext("2d").drawImage(video, 0, 0); 63 | img.src = canvas.toDataURL("image/png"); 64 | screenshotsContainer.prepend(img); 65 | }); 66 | 67 | // switch camera 68 | btnChangeCamera.addEventListener("click", function () { 69 | useFrontCamera = !useFrontCamera; 70 | 71 | initializeCamera(); 72 | }); 73 | 74 | // stop video stream 75 | function stopVideoStream() { 76 | if (videoStream) { 77 | videoStream.getTracks().forEach((track) => { 78 | track.stop(); 79 | }); 80 | } 81 | } 82 | 83 | // initialize 84 | async function initializeCamera() { 85 | stopVideoStream(); 86 | constraints.video.facingMode = useFrontCamera ? "user" : "environment"; 87 | 88 | try { 89 | videoStream = await navigator.mediaDevices.getUserMedia(constraints); 90 | video.srcObject = videoStream; 91 | } catch (err) { 92 | alert("Could not access the camera"); 93 | } 94 | } 95 | 96 | initializeCamera(); 97 | })(); 98 | --------------------------------------------------------------------------------