在现代 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 删除。