Index
怎样在浏览器中调用摄像头?介绍一下相关API,给出多个示例代码
问题,这正是 Web 多媒体 API 的核心能力之一。现在主流浏览器里调用摄像头,标准、可靠、唯一正确姿势基本就是:
👉 MediaDevices + getUserMedia(再配合 <video>、<canvas> 等)
我按「从入门到进阶」给你捋一遍,顺手上多段可直接跑的示例代码。 https://chatgpt.com/share/69845e4e-8d88-800f-a217-b2a96257782d
https://chatgpt.com/c/698452d8-7a48-8331-9f4f-a29b572933a6
一、核心 API 全景图(先有个地图)
1️⃣ 关键对象
| API | 作用 |
|---|---|
navigator.mediaDevices |
设备入口 |
getUserMedia() |
请求摄像头 / 麦克风 |
MediaStream |
摄像头输出的流 |
<video> |
播放摄像头画面 |
<canvas> |
截图 / 处理画面 |
enumerateDevices() |
列出所有摄像头 |
MediaRecorder |
录像 |
二、最基础:打开摄像头并显示到 <video>
HTML
<video id="camera" autoplay playsinline></video>
JS(最小可用版)
```js async function openCamera() { const stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: false });
const video = document.getElementById('camera');
video.srcObject = stream;
}
openCamera();
```
### ⚠️ 注意事项(很重要)
* **必须 https**(或 `localhost`)
* 用户会看到 **浏览器权限弹窗**
* 手机端要加 `playsinline`,否则会强制全屏
---
## 三、进阶 1:指定分辨率 / 前后摄像头
### 1️⃣ 分辨率约束
```js
navigator.mediaDevices.getUserMedia({
video: {
width: { ideal: 1280 },
height: { ideal: 720 }
}
});
```
### 2️⃣ 手机前后摄像头
```js
navigator.mediaDevices.getUserMedia({
video: {
facingMode: { exact: "environment" } // 后置
}
});
```
| 值 | 含义 |
| ------------- | ----- |
| `user` | 前置摄像头 |
| `environment` | 后置摄像头 |
---
## 四、进阶 2:列出所有摄像头并让用户选择
### 获取设备列表
```js
const devices = await navigator.mediaDevices.enumerateDevices();
const cameras = devices.filter(d => d.kind === 'videoinput');
console.log(cameras);
```
返回示例:
```js
[
{ deviceId: "abc", label: "HD Webcam", kind: "videoinput" },
{ deviceId: "def", label: "USB Camera", kind: "videoinput" }
]
```
### 选择指定摄像头
```js
navigator.mediaDevices.getUserMedia({
video: {
deviceId: { exact: selectedDeviceId }
}
});
```
👉 **多摄像头设备(笔电 + USB)必备**
---
## 五、进阶 3:拍照(摄像头截图)
### HTML
```html
<video id="camera" autoplay></video>
<canvas id="shot" width="640" height="480"></canvas>
<button id="snap">拍照</button>
```
### JS
```js
const video = document.getElementById('camera');
const canvas = document.getElementById('shot');
const ctx = canvas.getContext('2d');
document.getElementById('snap').onclick = () => {
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
};
```
你现在已经可以:
* 人脸识别
* 扫码
* OCR
* 特效滤镜
---
## 六、进阶 4:录像(MediaRecorder)
### 开始录像
```js
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const recorder = new MediaRecorder(stream);
const chunks = [];
recorder.ondataavailable = e => chunks.push(e.data);
recorder.start();
```
### 停止并导出
```js
recorder.stop();
recorder.onstop = () => {
const blob = new Blob(chunks, { type: 'video/webm' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'record.webm';
a.click();
};
```
---
## 七、常见坑(踩过的人都懂)
### ❌ 1. HTTP 页面
```
DOMException: Only secure origins are allowed
```
✅ 解决:
* 用 `https`
* 或 `http://localhost`
---
### ❌ 2. iOS Safari 黑屏
解决方案:
```html
<video autoplay muted playsinline></video>
```
---
### ❌ 3. 用户拒绝权限
```js
try {
await navigator.mediaDevices.getUserMedia({ video: true });
} catch (e) {
alert("你拒绝了摄像头权限");
}
```
---
## 八、你已经能做什么了?
用这些 API,你可以直接做出:
* 📷 网页相机
* 🎥 Web 录像工具
* 🧠 AI 摄像头(人脸 / 手势 / OCR)
* 📱 H5 扫码支付
* 🎮 Web AR / WebXR
---
## 九、如果你想继续「黑客级玩法」
我可以继续带你玩:
* ✅ Web + OpenCV.js 实时处理
* ✅ WebRTC 摄像头推流
* ✅ Three.js + 摄像头贴图
* ✅ 权限劫持 & 反指纹(安全研究视角 😈)
你想往 **实战应用** 还是 **安全 / 底层原理** 继续?