Under the hood
How the webcam test works
The webcam test is a page of client-side JavaScript talking directly to your browser's camera API. There's no account, no app to install, and no server processing your video. This page explains what happens when you click each button, in plain terms, so you know exactly what you're allowing when your browser asks for camera access.
The permission prompt
Every browser gates camera access behind a permission prompt the first time a page asks for it, using the getUserMedia() API. Clicking "Start webcam test" on the webcam test page triggers that request. If you click Allow, the browser hands this page a live video stream object; if you click Block, the request fails immediately and the page shows a plain-language explanation instead of a blank screen.
That permission is scoped to this exact site and remembered by your browser, not by this page. Clearing it, revoking it, or resetting it later is done in your browser's own site settings, not on the webcam test page itself.
What happens after you click Allow
Once permission is granted, three things happen almost instantly.
- The video stream is attached directly to an on-page video element, which is what produces the live preview.
- The camera's current settings (width, height, and its self-reported frame rate) are read from the stream's video track and shown as the "resolution" and "reported frame rate" numbers.
- A frame counter starts running in the background to measure the frame rate you're actually receiving, shown as "measured frame rate".
How the measured frame rate is calculated
Reading a camera's self-reported frame rate is easy: it's just a number the driver publishes and browsers can query directly. Measuring what's actually arriving is more useful, because the reported number is a ceiling, not a live reading.
In Chrome, Edge, and Safari, this page uses the browser's video frame callback API, which fires once per decoded video frame with an accurate timestamp. The page keeps a rolling one-second window of those timestamps and counts how many landed in the last second, updating on every new frame. In Firefox, which doesn't expose that callback yet, the page instead watches the video's playback position on every animation frame and counts how often it actually changes, which gives an equivalent, if very slightly less precise, result. Either way, what you see is frames that were genuinely decoded and displayed, not a number copied from a spec sheet.
The camera picker
If your device has more than one camera, a dropdown appears above the preview once permission is granted (the list of camera names is only available after permission, for privacy reasons built into the browser itself, not a choice this page makes). Choosing a different camera stops the current stream and starts a fresh request for the one you picked, so the resolution and frame rate numbers always reflect the camera actually selected. For the full breakdown of what this page does and doesn't do with that stream, see the privacy policy.
Mirror, fullscreen, and take photo
These three controls only change what you see or save locally; none of them involve a network request.
- Mirror flips the preview horizontally using a CSS transform, the same way a bathroom mirror would, which is usually the more natural way to see yourself while you're the one moving.
- Fullscreen asks the browser to expand just the video area using the standard Fullscreen API, useful for checking framing and lighting on a larger screen.
- Take photo draws the current video frame onto an off-screen canvas and immediately triggers a PNG download to your device. The image is generated and saved entirely on your machine; the test page never sees the resulting file after the download starts.
The copy report button
Clicking "Copy report" builds a short plain-text summary (camera name, resolution, measured and reported frame rate, browser, and a timestamp) and copies it to your clipboard using the browser's Clipboard API, with an older-browser fallback if that API isn't available. It's meant for pasting into a support chat, an email to IT, or a bug report, so you don't have to retype numbers off the screen by hand. Nothing is sent anywhere automatically; the text only goes wherever you paste it yourself.
Stopping the test
Clicking "Stop webcam" calls stop() on every track in the camera stream, which turns off the camera hardware indicator immediately, the same one your operating system shows whenever any app is using the camera. Closing the browser tab does the same thing automatically, even if you forget to click Stop.
Frequently Asked Questions
Does this page use a webcam plugin or Flash?
Why does the camera list stay empty until I allow access?
Is the measured frame rate ever wrong?
Can this page tell if my internet connection is the problem?
Try it yourself
Run the live webcam test and see your own resolution and frame rate.
Open the webcam testFree. No sign-up.