在现代 Web 应用中,调用摄像头 已经成为常见需求,比如视频会议、扫码登录、人脸识别等场景。浏览器本身提供了相应的 Web API,让开发者无需安装插件即可直接访问摄像头和麦克风。本文将从 原理、使用方式 到 实战案例,带你全面了解如何在浏览器中使用摄像头,并配合示意图和截图。
浏览器访问摄像头的能力主要依赖于 WebRTC(Web Real-Time Communication) 标准,其中最关键的 API 是 MediaDevices.getUserMedia()。
下面是一个简化的原理示意图:
┌───────────────┐ ┌─────────────┐
│ 用户设备 │ │ 浏览器 │
│ 摄像头/麦克风 │──────▶│ getUserMedia│
└───────────────┘ └─────┬───────┘
│
▼
┌─────────────┐
│ MediaStream│
└───────┬─────┘
│
┌──────────▼─────────┐
│ <video>/<canvas> │
└────────────────────┘简而言之:摄像头 →
getUserMedia→MediaStream→<video>/<canvas>。
navigator.mediaDevices.getUserMedia({ video: true, audio: false })
.then(stream => {
const videoElement = document.querySelector("video");
videoElement.srcObject = stream;
})
.catch(error => {
console.error("无法访问摄像头:", error);
});我们实现一个“拍照应用”,点击按钮即可将摄像头画面截图保存。
<video id="video" autoplay playsinline></video>
<button id="snap">拍照</button>
<canvas id="canvas"></canvas>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);
});👉 实际效果:
<video> 播放实时画面。<canvas> 会显示截图。示意图:
┌───────────────┐ 点击拍照 ┌───────────────┐
│ 摄像头视频 │────────────▶│ 拍摄的照片 │
│ <video> │ │ <canvas> │
└───────────────┘ └───────────────┘getUserMedia 需要在 HTTPS 或 localhost 环境下才能使用。facingMode 参数:"user" → 前置摄像头"environment" → 后置摄像头(扫码常用)navigator.mediaDevices.enumerateDevices() 获取设备列表,再指定 deviceId。NotAllowedError,需要提示用户手动开启权限。jsQR 实现二维码识别。navigator.mediaDevices.getUserMedia<video> 用于播放,<canvas> 用于截图和处理只要理解了原理和 API,用浏览器摄像头开发各种功能都很简单。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。