ToolAct工具行动

摄像头测试

测试摄像头设备,实时预览画面、拍照截图、查看设备信息

未开始

实时预览

开始测试后显示摄像头画面

什么是摄像头测试?

摄像头测试用于确认浏览器能否访问笔记本内置摄像头、外接 USB 摄像头或其它视频输入设备,并实时显示画面。它适合在视频会议、在线课堂、远程面试、直播、录课和内容拍摄前使用,提前排查选错设备、权限被拦截、黑屏、分辨率过低、灯光不足等问题。工具会请求浏览器摄像头权限,展示网页实际能打开的视频流,并可截取本地快照用于检查清晰度和取景。它能帮助确认设备选择、分辨率、帧率、宽高比和基础画质,但不能修复驱动或硬件故障。如果没有画面,应继续检查系统隐私设置、是否被其它应用占用、线缆连接和驱动状态。

使用方法

使用方法

  1. 点击「开始测试」并允许浏览器访问摄像头
  2. 观察实时摄像头预览画面
  3. 点击「拍照」按钮拍摄照片
  4. 可切换不同摄像头或测试不同分辨率

提示

  • 如果预览画面无法显示,请检查浏览器是否已授予摄像头权限
  • 检查摄像头是否被其他应用程序占用
  • 检查是否选择了正确的摄像头设备
  • 检查系统设置中是否禁用了摄像头

使用场景

通话前验证浏览器摄像头访问是否正常启动摄像头以确认权限状态、选中的设备 ID、实时预览、实际分辨率、帧率、宽高比以及前置或后置模式。在面试、课程、直播或客服会话之前,提前发现画面卡住、选错镜头或回退到 640x480 等问题,是在其他参与者面前避免尴尬排查的最省事方式。
探测摄像头实际支持的分辨率运行内置的 QVGA、VGA、720p、1080p、1440p 和 4K 检测。页面会对每种分辨率使用明确的约束条件调用 getUserMedia,标记浏览器和传感器是否接受,从而暴露规格表声称支持 4K 但 UVC 描述符实际上限为 1080p 的情况。
拍摄本地快照作为凭证使用 Canvas drawImage API 从实时视频中截取 PNG 快照,下载有用的帧并删除不需要的。在记录对焦错误、红外切换条纹、镜头畸变、取景问题或需要发送给厂商、制造商 RMA 表单或线上维权的硬件故障时很有帮助。
在前置、后置和外接摄像头之间切换当笔记本有内置摄像头和外接 USB 或虚拟摄像头时,在摄像头选择器中选择不同的设备 ID,这样通话软件就能指向正确的镜头,无需进入系统设置。OBS 虚拟摄像头、Elgato 采集卡和 macOS 的连续互通摄像头都会显示为独立设备,页面会展示它们的标签,方便在开播前发现选错设备。
诊断黑屏或画面卡住的问题当预览画面黑暗或冻结时,页面会展示 getUserMedia 的权限状态、设备标签和应用的分辨率。先排查系统隐私设置、其他占用摄像头的应用(Zoom、OBS、FaceTime)以及近期的 USB 或驱动变更,再假设传感器本身故障,因为大多数黑屏问题都是由另一个进程独占设备导致的。

技术原理

摄像头测试工具基于 W3C Media Capture and Streams 规范构建,通过 navigator.mediaDevices.getUserMedia(constraints) 访问摄像头。constraints 参数是一个类似 JSON 的对象,可指定分辨率(宽度、高度)、帧率、朝向模式和设备 ID 的理想值、精确值、最小值和最大值。浏览器的约束求解器会将这些参数与摄像头固件报告的 UVC(USB 视频类)描述符进行协商;当精确约束无法满足时,调用会以 OverconstrainedError 拒绝——这正是分辨率支持检测器的工作机制,它对每种分辨率使用 { exact } 约束进行探测并标记失败项。 获取视频流后,视频轨道会暴露 getSettings()(协商后实际应用的值)、getCapabilities()(硬件支持的全部范围)和 getConstraints()(原始请求的内容)。实际应用的分辨率、帧率、宽高比和朝向模式从 getSettings() 读取并显示。实时预览通过将 video 元素的 srcObject 设置为 MediaStream 来渲染;浏览器的媒体管道负责解码、色彩空间转换和 GPU 加速渲染,无需 JavaScript 进行像素操作。 静态拍摄时,CanvasRenderingContext2D.drawImage(videoElement, 0, 0) 将当前解码的视频帧快照到隐藏画布上,toDataURL('image/png') 将其序列化为 PNG 数据 URL。enumerateDevices() 列出所有可用的媒体输入设备——注意设备标签在用户至少授权一次摄像头权限之前为空字符串,这是防止指纹追踪的保护措施。调用 track.stop() 释放摄像头硬件并关闭指示灯;设置 videoElement.srcObject = null 断开渲染管道。getUserMedia 需要安全上下文(HTTPS 或 localhost)并会触发按源的权限提示;摄像头指示灯在操作系统层面强制执行,网页无法绕过。

  • 约束协商:浏览器求解器将 ideal/exact/min/max 值与 UVC 硬件描述符匹配——当传感器无法提供请求的分辨率时,{ exact } 探测会以 OverconstrainedError 失败,分辨率支持网格正是通过这种方式填充的。
  • 轨道自省:getSettings() 返回协商后实际应用的分辨率、帧率、宽高比和 facingMode——当 USB 带宽或传感器能力受限时,这些值可能与请求的理想值不同。
  • enumerateDevices 隐私机制:设备标签在每个源至少获得一次 getUserMedia 权限之前为空字符串——这是规范强制的反指纹追踪措施,也意味着设备选择器在首次访问时只显示通用名称。
  • Canvas 静态拍摄:drawImage() 将解码后的视频帧从 GPU 合成器复制到 2D 像素缓冲区,无需重新编码;toDataURL('image/png') 将其序列化为无损 PNG——帧数据不会离开浏览器内存。
  • 朝向模式:VideoFacingModeEnum 从 track.getSettings().facingMode 读取('user' 为前置,'environment' 为后置,'left'/'right' 为外部)——并非所有桌面 USB 摄像头都报告方向信息,因此该字段可能显示为 'unknown'。
  • 流生命周期:track.stop() 释放摄像头硬件并关闭操作系统级指示灯;srcObject = null 断开渲染管道——两者都需要调用才能完全释放设备,使其他应用可以获取。
  • 安全模型:getUserMedia 需要安全上下文(HTTPS 或 localhost),会触发按源的权限对话框,摄像头指示灯在操作系统/内核级别强制执行——网页无法绕过这三道防线。

示例

基础测试流程

1. 点击「开始测试」并授权摄像头权限
2. 观察实时预览的清晰度、对焦和帧率
3. 按下「拍照」按钮抓取一帧测试画面
4. 查看设备信息(分辨率、前后置、帧率)
用途:在视频会议、面试或直播之前先测一遍

分辨率测试

1. 展开「支持的分辨率」面板
2. 在每个分辨率旁点击「测试」(如 1080p、720p、480p)
3. 看看你的硬件实际支持哪些档位
4. 选择你的使用场景下能稳定运行的最高分辨率

多摄像头切换

1. 打开顶部的设备下拉菜单
2. 选择另一个摄像头(前置/后置、外接 USB 摄像头)
3. 对比画质、色彩还原和弱光表现
4. 进入会议前确认选中的是正确的设备

常见问题

摄像头测试会检查哪些内容?

包括浏览器是否能访问摄像头、所支持的分辨率、实时预览效果以及基本的截图功能(拍照保存为图片)。在视频通话之前用一下,可以确认选择了正确的摄像头,并且画面方向、曝光都正常。

为什么我的摄像头无法显示?

常见原因有:浏览器需要授予摄像头权限(查看地址栏的权限图标);其他应用正在占用摄像头(关闭 Zoom、Teams、OBS);操作系统隐私设置阻止了浏览器访问摄像头(检查 Windows 隐私设置或 macOS 摄像头权限);硬件开关关闭了摄像头。

可以在前置和后置摄像头之间切换吗?

如果你的设备同时具备两个摄像头就可以。页面通过 navigator.mediaDevices.enumerateDevices() 列出可用的摄像头,可以从下拉菜单中选择想用的那一个。在手机上,user 表示前置摄像头,environment 表示后置摄像头。

支持哪些分辨率?

取决于摄像头和浏览器对外暴露的能力。常见档位:320×240、640×480、1280×720、1920×1080。分辨率越高,对带宽(实时使用时)和 CPU 的要求也越高。页面默认选用最高分辨率;如果网络较慢,可以手动选择较低档位。

我的摄像头画面会被上传吗?

不会。视频流仅在本地渲染,截取的画面也只保留在浏览器中。需要注意的是,摄像头权限是按来源(站点)授予的,所以本站任意一个打开的标签页都可以访问,直到你主动撤销权限。用完后请关闭标签页。

为什么视频是镜像的?

浏览器会在前置摄像头的实时预览中做镜像处理,符合人们看「镜子」时的直觉。但截取下来的快照不一定是镜像的,两种视图都需要确认一下。CSS 的 transform: scaleX(-1) 可以切换是否镜像。

如果摄像头权限被永久拒绝怎么办?

在 Chrome 中,点击地址栏的摄像头图标 → 选择「始终允许」。必要时可在 chrome://settings/content/camera 中重置。其他浏览器有类似的权限设置。授权之后刷新页面即可。