Webcam Test
Check that your camera works and find out what it can actually do — resolution, frame rate, exposure — entirely on your own machine.
Camera names stay hidden until you allow access once — that is a browser privacy rule, not a fault.
The preview is not mirrored by default, 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 is off.
Frame rate is measured over a rolling 2-second window and is capped by your display: the browser only hands this page a frame when it paints one.
Start the camera to read exposure and check that frames are really changing.
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 only requests this page makes at all are for its own stylesheet, script and icons, and none of them carry any of this.
Resolution sweep — requested vs 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 “my webcam is 1080p” 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 |
|---|
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
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 LED next to the lens should light up 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 IR face-unlock sensor expose two or three video devices; 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–15 fps to 30 fps within a couple of seconds. That single test explains most “why do I look choppy on calls” complaints.
- Check the liveness badge. It should read Live. Frozen means byte-identical frames are arriving — 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 LED 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 will read 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 stat next to it is getSettings().frameRate, the driver's own claim, so a clean 2× 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 frames means you are being served a duplicate. In practice that is a wedged driver, a virtual camera (OBS Virtual Camera, NVIDIA Broadcast, ManyCam) 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 — it is the whole frame including the background — but it is 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
- Black preview, no error, LED on: a physical privacy shutter or a strip of tape. Many ThinkPads and Dells also have an Fn camera-kill key that leaves the device enumerable but blind.
- Green, purple or striped image: a 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 frozen: a virtual camera is selected. Check the device dropdown for names like OBS Virtual Camera or NVIDIA Broadcast and pick the real hardware instead.
- Camera works here but not in one specific app: the app has its own permission. On Windows, Settings → Privacy & 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 another: a 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 laptop: managed devices can disable the camera by policy. It will not appear in the device list, and no browser setting will bring it back.
FAQ
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, 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.