Webcam Test
Check that your camera works and find out what it can actually do: resolution, frame rate and exposure, entirely on your own machine.
This test asks for a device
Your browser will ask for permission when you press Start. Nothing is opened before that, and nothing leaves your machine.
The video stays on this page. Nothing is uploaded, recorded or sent anywhere.
- Delivered size
- —
- Measured fps
- ·
- Driver fps
- —
- Avg brightness
- ·
- Clipped white
- ·
- Crushed black
- ·
- Median interval
- ·
Start the camera to read exposure and check that frames are really changing.
Frame rate is measured over a rolling two-second window and is capped by your display: the browser only hands this page a frame when it paints one.
The preview is not mirrored, so it shows exactly what the other end of a call sees. Video-call apps mirror your self-view, which is why text looks backwards in them.
Camera names stay hidden until you allow access once. That is a browser privacy rule, not a fault.
Privacy: the stream is attached to the preview above and analysed from a 64 × 48 pixel copy held in memory. Nothing from your camera is uploaded, recorded or sent anywhere. The camera is stopped when you press Stop, when you switch to another tab, and when you leave the page.
Resolution sweep, requested versus delivered
This asks the camera for each of the four common sizes in turn and prints what it actually handed back. The gap between the two columns is where most 1080p webcam claims fall apart.
Start the camera first. The sweep re-opens the stream four times, so the preview will flicker and take a few seconds.
| Requested | Delivered | FPS | Resize mode |
|---|---|---|---|
| 640 × 480The floor. Every camera has this mode. | · | · | · |
| 1280 × 720What this page opens with, and what most calls use. | · | · | · |
| 1920 × 1080The number on the box. Often crop-and-scale. | · | · | · |
| 3840 × 2160Rare on a webcam. Usually refused or substituted. | · | · | · |
resizeMode: none means those pixels came off the sensor at that size. crop-and-scale means the browser took a different native mode and resized or cropped it: the image is soft and no bitrate will fix it. Firefox and Safari do not report this field at all.
What the camera reports about itself
Two different claims: what the track is doing right now, and what the driver says it could do.
Live track settings (getSettings)
- status
- camera off
Capability ranges (getCapabilities)
- status
- camera off
Capabilities are what the driver says the camera could do. Settings are what it is doing right now.
How to use it
- Start the camera. Press Start camera and allow the prompt. The light next to the lens should come on within a second. If the browser never asks, the site is already blocked: click the camera icon in the address bar and set it to Allow.
- Pick the right camera. Laptops with an infrared face-unlock sensor expose two or three video devices, and the infrared one looks washed-out grey and is normally useless for calls. Switch devices in the dropdown until the picture is right.
- Read the delivered size. Delivered size is what track.getSettings() reports right now, not what was asked for. The first request on this page is a plain 1280 × 720.
- Run the sweep. It requests 640 × 480, 1280 × 720, 1920 × 1080 and 3840 × 2160 in turn and records each answer. Any row where Delivered differs from Requested is a mode your camera does not have, and a row that matches but says crop-and-scale is one it is only pretending to have.
- Watch the frame rate change with light. Note the fps in normal room light, then turn a lamp on and point it at your face. On a typical USB webcam it climbs from 10 to 15 fps up to 30 fps within a couple of seconds. That single test explains most complaints about looking choppy on calls.
- Check the liveness badge. It should read Live. Frozen means byte-identical frames are arriving, which is a stalled driver or a virtual camera with no source. Stalled means no new frame arrived for 2.5 seconds at all.
- Save a snapshot if you want a full-resolution still to compare cameras or to send to support. It is drawn on your machine and goes straight to your downloads folder.
- Press Stop and watch the light go out. That is the part worth doing every time: it confirms the browser really released the device.
What is actually being measured
A resolution request is a suggestion, not a command
The constraints this page sends are ideal constraints: { width: { ideal: 1920 }, height: { ideal: 1080 } }. The browser walks the camera's supported mode list, picks whatever is closest, and resolves successfully. It never tells you that it substituted something. That is deliberate in the spec, and it is why a video-call app can look like it is running 1080p while quietly sending 640 × 480. Only getSettings() tells you the truth, and that is the number in the Delivered column.
resizeMode is the field that catches fakes
Chromium reports resizeMode alongside width and height. none means the sensor produced that frame at that size. crop-and-scale means the capture layer took a different native mode and stretched, shrank or cropped it to satisfy your request. A 1920 × 1080 stream marked crop-and-scale is usually a 1280 × 720 sensor being upscaled: it costs you bandwidth and buys you nothing, and it is the single most common reason a 1080p webcam looks worse than a 720p one. Firefox and Safari omit the field, so the column reads not reported there. That is a browser limitation, not a camera fault.
Frame rate is really a lighting measurement
A UVC webcam publishes a list of frame intervals per format, and the driver picks one based on how long the sensor needs to expose each frame. In a dim room the auto-exposure algorithm stretches the exposure to gather light. An exposure of 1/15 s cannot physically be repeated thirty times a second, so the driver drops to 15 fps, or 10, or 7.5. Nothing is broken: the camera is trading motion for brightness, and it will do it silently. This is why calls from a bedroom at night look like a slideshow and calls from an office do not. Add light in front of you and watch the number here climb back.
Why the measured fps can be lower than the driver's
The browser only lets a page observe a video frame when it composites one. This test counts frames through requestVideoFrameCallback where it exists, and through a requestAnimationFrame loop watching video.currentTime where it does not. Both are clocked by the display. On a 60 Hz monitor a 120 fps camera can only ever be observed at 60 fps. The driver fps readout next to it is getSettings().frameRate, the driver's own claim, so a clean 2x gap between the two is your display, not a fault. The fallback path is labelled as an estimate on screen because currentTime updates coarsely and can merge two fast frames into one observation.
The frame-difference check
Every 400 ms, and only when a genuinely new frame has arrived, the current frame is drawn into a 64 × 48 offscreen canvas and compared pixel by pixel with the previous sample as a mean absolute luma difference. A working sensor is never byte-identical between frames: thermal and read noise alone put the difference somewhere above zero even when the camera is pointed at a blank wall. A value of essentially zero across several consecutive samples means you are being served a duplicate. In practice that is a wedged driver, a virtual camera whose source has gone away, or a corporate privacy tool substituting a still. If no new frame arrives at all for 2.5 seconds the badge reads Stalled instead.
Exposure readout
Average brightness is the mean Rec. 709 luma of that same 64 × 48 sample, printed as a percentage of full scale, alongside the share of pixels clipped to white and crushed to black. It is a rough gauge, not a light meter, because it is the whole frame including the background. It is still enough to separate the three failure modes that matter: too dark overall, backlit (large clipped areas with a dark subject), and blown out. Under about 18% is where exposure starts stealing frame rate. Under about 7% the frame is effectively black, and at that point a closed privacy shutter or a lens cap is far more likely than a dark room.
When the picture is wrong rather than missing
The camera opens, the light is on, and the image is still no good. These six cover almost all of it.
- Black preview, no error, indicator light onA physical privacy shutter or a strip of tape. Many ThinkPads and Dells also have an Fn camera-kill key that leaves the device listed but blind.
- Green, purple or striped imageA format mismatch between the driver and the capture layer, usually after a Windows update. Reinstall or roll back the camera driver in Device Manager.
- Preview is sharp but frozenA virtual camera is selected. Check the device dropdown for names like OBS Virtual Camera or NVIDIA Broadcast, and pick the real hardware instead.
- Works here but not in one specific appThat app has its own permission. On Windows: Settings, Privacy and security, Camera, and make sure "Let desktop apps access your camera" is on as well as the per-app toggle.
- Works on one USB port, not anotherA 1080p stream is uncompressed on many cheap cameras and saturates a shared hub. Plug straight into the machine, and prefer a port that is not shared with an external drive.
- Nothing at all on a work laptopManaged devices can disable the camera by policy. It will not appear in the device list, and no browser setting will bring it back.
And when it will not open at all
Every way getUserMedia can refuse, what each one means, and the fix. This page names the error rather than printing a console message.
| Error | What it means | What to do |
|---|---|---|
| NotAllowedError | Permission was refused, by the browser or by the operating system. | Click the camera icon in the address bar and set this site to Allow. On Windows also check Settings, Privacy and security, Camera. On macOS, System Settings, Privacy and Security, Camera, with your browser ticked. |
| NotFoundError | The browser can see no video input device at all. | Plug the webcam into a port on the machine rather than a hub. For a built-in camera, check it is not disabled in Device Manager, switched off by an Fn key or a hardware slider, or blocked by a workplace policy. |
| NotReadableError | The camera is open somewhere else, or the driver refused to start it. | Quit Teams, Zoom, Discord, OBS, NVIDIA Broadcast and the Camera app completely: they hold the device even while minimised to the tray. A wedged driver gives the same error, and unplugging the camera clears it. |
| OverconstrainedError | No supported mode satisfied the request, usually because the chosen camera vanished. | Re-pick the camera from the dropdown and start it again. |
| SecurityError | A permissions policy, an enterprise policy or an extension is blocking camera access. | Try a normal, unmanaged browser profile with extensions disabled. |
| AbortError | The system handed the device over and then aborted, which usually means a driver crash. | Unplug and replug the camera, or reboot, then try again. |
Questions
Why does my webcam say 1080p but this test shows 1280 × 720?
Two things cause it. Many cameras advertise 1080p for still photos while their video pipeline only streams 720p, and getUserMedia never fails on a size request: it silently picks the closest mode the driver offers. Check the resize mode column in the sweep. none means the sensor really produced those pixels, crop-and-scale means the browser resized a different native mode to fit what was asked for.
Why is my webcam only running at 15 fps?
Almost always lighting. In a dim room the sensor needs a longer exposure to gather enough light, and an exposure of one fifteenth of a second physically cannot be repeated 30 times per second, so the driver halves the frame rate. Point a lamp at your face and the rate usually jumps straight back to 30. USB bandwidth, a busy hub and heavy CPU load can force the same drop.
The browser says the camera is already in use. How do I fix it?
On Windows a camera can normally only be opened by one application at a time, so Teams, Zoom, Discord, OBS, NVIDIA Broadcast or the Camera app will lock it out even while minimised to the system tray. Quit them completely and press Start camera again. That is the NotReadableError this page reports; unplugging and replugging the camera clears a wedged driver.
Does this page upload or record my video?
No. The camera stream is attached straight to a video element on this page, and every number here, frame rate, brightness and the frame-difference check, is computed locally in your browser. There is no upload, no recording, and no request that carries your video or any of these numbers anywhere. Snapshots are drawn to a canvas on your own machine and saved directly to your downloads folder.
Why is the measured frame rate capped at my monitor refresh rate?
The browser only hands a page a video frame when it paints one, so this measurement counts frames that reach the screen rather than frames that leave the camera. On a 60 Hz display a 120 fps camera can only ever be observed at 60 fps. Compare the measured figure with the frame rate the driver reports next to it. A gap that size is the display, not a fault.
How do I know the camera light really went off?
Press Stop and watch the indicator next to the lens: it should go out within a second, and the recording dot on the browser tab should disappear too. This page stops every track when you press Stop, when you switch to another tab, and when you leave the page. If the light stays on after all that, a different application is still holding the camera.