ToolActToolAct

Camera Test

Test your camera with real-time preview, photo capture, and device info

Not Started

Live Preview

Start testing to see the camera preview

What is Camera Test?

A camera test checks whether a browser can access a webcam, external USB camera, or built-in laptop camera and display a live preview. Run it before video meetings, online classes, interviews, livestreams, recordings, or any situation where the wrong camera, blocked permission, black preview, low resolution, or poor lighting would cause trouble. The tool uses browser camera permission, shows the actual stream the page can open, and can capture a local snapshot for visual inspection. It helps verify device selection, resolution, frame rate, aspect ratio, and basic image quality without uploading video frames. It cannot fix driver failures or hardware faults; if no stream appears, system privacy settings, other apps using the camera, cables, and drivers should be checked.

How to Use

How to use

  1. Click "Start Test" and allow browser access to the camera
  2. Observe the live camera preview
  3. Click "Capture" to take a photo
  4. You can switch between cameras or test different resolutions

Tips

  • If the preview doesn't show, please check whether the browser has granted camera permission
  • Whether the camera is being used by another application
  • Whether the correct camera device is selected
  • Whether the camera is disabled in system settings

Use Cases

Verify browser camera access before a callStart the camera to confirm permission state, the selected deviceId, live preview, actual resolution, frame rate, aspect ratio, and front or back facing mode. Catching a stuck stream, wrong lens, or 640x480 fallback ahead of an interview, class, livestream, or support session is the cheapest way to avoid an embarrassing troubleshooting moment in front of other participants.
Probe which resolutions a camera really supportsRun the built-in checks for QVGA, VGA, 720p, 1080p, 1440p, and 4K. The page calls getUserMedia with explicit constraints for each resolution and marks whether the browser and sensor accept it, exposing cases where a spec sheet claims 4K but the UVC descriptor actually tops out at 1080p.
Capture local snapshots as evidenceTake PNG snapshots from the live video with the Canvas drawImage API, download useful frames, and delete unwanted ones. This is helpful when documenting focus errors, IR-cut banding, lens distortion, framing problems, or a hardware fault you need to send to a vendor, manufacturer RMA form, or online listing dispute.
Switch between front, rear, and external camerasPick a different deviceId in the camera selector when a laptop has a built-in webcam and an external USB or virtual camera, so call software can be pointed at the right lens without OS settings. OBS virtual cameras, Elgato capture cards, and Continuity Camera on macOS each show up as separate devices, and the page surfaces their labels so the wrong one is easy to spot before going live.
Diagnose a black or stuck previewWhen the preview is dark or frozen, the page surfaces the getUserMedia permission state, device label, and the applied resolution. Cross-check OS privacy settings, competing apps holding the camera (Zoom, OBS, FaceTime), and a recent USB or driver change before assuming the sensor itself has failed, since most black previews are caused by another process holding the device exclusive.

Technical Principle

The camera test tool is built on the W3C Media Capture and Streams specification, using navigator.mediaDevices.getUserMedia(constraints) to access the camera. The constraints parameter is a JSON-like object specifying ideal, exact, min, and max values for resolution (width, height), frame rate, facing mode, and device ID. The browser's constraint solver negotiates these against the UVC (USB Video Class) descriptors reported by the camera firmware; when an exact constraint cannot be met, the call rejects with an OverconstrainedError — this is the mechanism behind the resolution support checker, which probes each resolution with { exact } constraints and marks failures. Once the stream is acquired, the video track exposes getSettings() (the actual applied values after negotiation), getCapabilities() (the hardware's full supported ranges), and getConstraints() (what was originally requested). The applied resolution, frame rate, aspect ratio, and facing mode are read from getSettings() and displayed. The live preview renders by setting the video element's srcObject to the MediaStream; the browser's media pipeline handles decoding, colorspace conversion, and GPU-accelerated rendering without JavaScript pixel manipulation. For still captures, CanvasRenderingContext2D.drawImage(videoElement, 0, 0) snapshots the current decoded video frame onto a hidden canvas, and toDataURL('image/png') serializes it as a PNG data URL. enumerateDevices() lists all available media input devices — note that device labels are empty strings until the user has granted camera permission at least once, a fingerprinting-prevention measure. Calling track.stop() releases the camera hardware and turns off the indicator light; setting videoElement.srcObject = null detaches the rendering pipeline. getUserMedia requires a secure context (HTTPS or localhost) and triggers a per-origin permission prompt; the camera indicator light is enforced at the OS level and cannot be bypassed by the page.

  • Constraint negotiation: The browser solver matches ideal/exact/min/max values against UVC hardware descriptors — { exact } probes fail with OverconstrainedError when the sensor cannot deliver the requested resolution, which is how the resolution support grid is populated.
  • Track introspection: getSettings() returns the actually applied resolution, frame rate, aspect ratio, and facingMode after negotiation — these may differ from the requested ideal values when USB bandwidth or sensor capabilities are constrained.
  • enumerateDevices privacy: Device labels are empty strings until getUserMedia permission is granted at least once per origin — a spec-mandated anti-fingerprinting measure that also means the device selector shows generic names on first visit.
  • Canvas still capture: drawImage() copies the decoded video frame from the GPU compositor into a 2D pixel buffer without re-encoding; toDataURL('image/png') then serializes it as a lossless PNG — the frame never leaves the browser's memory.
  • Facing mode: The VideoFacingModeEnum is read from track.getSettings().facingMode ('user' for front, 'environment' for rear, 'left'/'right' for external) — not all desktop USB cameras report orientation, so the field may show 'unknown'.
  • Stream lifecycle: track.stop() releases the camera hardware and turns off the OS-level indicator light; srcObject = null detaches the rendering pipeline — both are needed to fully release the device so other applications can acquire it.
  • Security model: getUserMedia requires a secure context (HTTPS or localhost), triggers a per-origin permission dialog, and the camera indicator is enforced at the OS/kernel level — the page cannot circumvent any of these three gates.

Examples

Basic test flow

1. Click Start Test and grant camera permission
2. Observe the live preview for clarity, focus, and frame rate
3. Press the Photo button to capture a test frame
4. Review device info (resolution, facing mode, frame rate)
Use: run before any video meeting, interview, or livestream

Resolution testing

1. Expand the Supported Resolutions panel
2. Click Test next to each resolution (e.g. 1080p, 720p, 480p)
3. Check which ones your hardware actually supports
4. Choose the highest stable resolution for your use case

Multi-camera switching

1. Open the device dropdown at the top
2. Select a different camera (front/rear, external webcam)
3. Compare video quality, color balance, and low-light performance
4. Confirm the correct device is selected before joining the call

FAQ

What does the camera test check?

Whether your browser can access the camera, the resolution it offers, the live preview, and basic capture (snapshot to image). Useful before a video call to confirm the right camera is selected and the image is the right way up and exposed correctly.

Why doesn't my camera show up?

Common causes: the browser needs camera permission (check the address-bar permission icon); another app is holding the camera (close Zoom, Teams, OBS); the OS privacy setting blocks browser camera access (check Windows Privacy / macOS Camera permissions); a hardware switch is disabling the camera.

Can it switch between front and back cameras?

Yes if your device has both. The page enumerates available cameras via navigator.mediaDevices.enumerateDevices(); pick the one you want from the dropdown. On phones, 'user' is front-facing and 'environment' is back-facing.

What resolutions are supported?

Whatever the camera and browser expose. Common ranges: 320×240, 640×480, 1280×720, 1920×1080. Higher resolutions need more bandwidth (for live use) and CPU. The page picks the highest by default; pick lower if your network is slow.

Is my camera feed uploaded?

No. The video stream is rendered locally; capture frames stay in the browser. Be aware that camera permission is granted at the origin level, so any open tab from this site can access it until you revoke it. Close the tab when done.

Why is the video mirrored?

Browsers mirror the front camera in the live preview to match the 'mirror' look people expect. Captured snapshots may or may not be mirrored - check both views. CSS transform: scaleX(-1) toggles the mirror.

What if my camera permission is permanently denied?

In Chrome, click the camera icon in the address bar → 'Always allow'. Reset under chrome://settings/content/camera if needed. Other browsers have similar permission settings. After granting, refresh the page.