在现代 Web 应用中,调用摄像头 已经成为常见需求,比如视频会议、扫码登录、人脸识别等场景。浏览器本身提供了相应的 Web API,让开发者无需安装插件即可直接访问摄像头和麦克风。本文将从 原理、使用方式 到 实战案例,带你全面了解如何在浏览器中使用摄像头,并配合示意图和截图。
一、原理解析浏览器访问摄像头的能力主要依赖于 WebRTC(Web Real-Time Communication) 标准,其中最关键的 API 是 MediaDevices.getUserMedia()。
下面是一个简化的原理示意图:
代码语言:txt复制 ┌───────────────┐ ┌─────────────┐
│ 用户设备 │ │ 浏览器 │
│ 摄像头/麦克风 │──────▶│ getUserMedia│
└───────────────┘ └─────┬───────┘
│
▼
┌─────────────┐
│ MediaStream│
└───────┬─────┘
│
┌──────────▼─────────┐
│
└────────────────────┘简而言之:摄像头 → getUserMedia → MediaStream →
二、使用方式基本调用代码语言:javascript复制navigator.mediaDevices.getUserMedia({ video: true, audio: false })
.then(stream => {
const videoElement = document.querySelector("video");
videoElement.srcObject = stream;
})
.catch(error => {
console.error("无法访问摄像头:", error);
});三、实战案例:拍照功能我们实现一个“拍照应用”,点击按钮即可将摄像头画面截图保存。
HTML代码语言:html复制
JavaScript代码语言:javascript复制const video = document.getElementById("video");
const canvas = document.getElementById("canvas");
const snapBtn = document.getElementById("snap");
const ctx = canvas.getContext("2d");
navigator.mediaDevices.getUserMedia({ video: true })
.then(stream => { video.srcObject = stream; })
.catch(err => { console.error("摄像头打开失败:", err); });
snapBtn.addEventListener("click", () => {
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
const dataURL = canvas.toDataURL("image/png");
console.log("拍摄的图片:", dataURL);
});👉 实际效果:
左边
代码语言:txt复制 ┌───────────────┐ 点击拍照 ┌───────────────┐
│ 摄像头视频 │────────────▶│ 拍摄的照片 │
│
└───────────────┘ └───────────────┘四、常见问题与解决方案为什么在本地打不开?
getUserMedia 需要在 HTTPS 或 localhost 环境下才能使用。如何切换前后摄像头?
使用 facingMode 参数:"user" → 前置摄像头"environment" → 后置摄像头(扫码常用)多摄像头选择
通过 navigator.mediaDevices.enumerateDevices() 获取设备列表,再指定 deviceId。用户拒绝权限
浏览器会返回 NotAllowedError,需要提示用户手动开启权限。五、进阶应用场景扫码应用:结合 jsQR 实现二维码识别。人脸识别:配合 TensorFlow.js 或 Face API。视频会议:WebRTC PeerConnection 实现实时通话。滤镜/特效:结合 WebGL / Three.js 实现 AR 效果。六、总结核心 API:navigator.mediaDevices.getUserMedia运行环境:HTTPS / localhost