Private Webcam
Test

Test your camera instantly with a live preview, resolution, FPS, and quality scoring. Take snapshots, switch cameras, overlay test patterns, and export a diagnostic reportโ€”all 100% private.

Camera & Settings

On

Flipped like a mirror

Off

As others see you

Live Preview

Camera is off

Click "Start Camera" below to begin your private webcam test. Your video never leaves your device.

Private Webcam Testing
100% Local & Secure

Test your webcam with complete privacy. No uploads, no cloud storage, no recording, no trackingโ€”your video stream stays entirely on your device. The camera turns off the moment you close the page.

Check resolution, frame rate, and aspect ratio in real time. Switch between multiple cameras, toggle mirror view, overlay test patterns for calibration, apply color filters, and capture high-resolution PNG snapshotsโ€”all processed locally in your browser with zero data transmission.

How Webcam Test Works

Simple Steps:

  1. 1Click 'Start Camera' and grant browser permission when promptedโ€”your video appears instantly in the live preview
  2. 2Check the live stats: resolution (e.g., 1920ร—1080), measured FPS, aspect ratio, and the quality score
  3. 3Toggle Mirror View to compare how you look mirrored (like a mirror) vs. unmirrored (as others see you)
  4. 4Take snapshots to verify image quality, focus, and lightingโ€”download them as high-resolution PNG files
  5. 5Switch between multiple cameras using the dropdown to compare devices or test a new webcam
  6. 6Export a diagnostic JSON report with all measurements for support tickets or sharing

Pro Tips:

  • If your camera is in use by another app (Zoom, Teams), close it first โ€” browsers cannot share cameras with other applications
  • Use the mirror toggle to see yourself as others see you (unmirrored) or as you see yourself in a mirror (mirrored)
  • Check the measured FPS: 30 FPS is standard for most webcams, 60 FPS indicates a high-frame-rate camera
  • Take snapshots to verify image quality, focus, and lighting before important video calls
  • If the image looks grainy, clean your lens and improve lighting โ€” most webcam quality issues are lighting-related
  • Switch between multiple cameras (built-in laptop cam, external USB cam, virtual cameras) using the dropdown
  • Use the test pattern overlay (grid or color bars) to verify your camera is rendering accurate geometry and colors
  • Toggle grayscale or sepia to see how you look on different platforms that apply filters

Common Use Cases

Video Call Preparation

Check your camera works correctly before important Zoom, Teams, or Google Meet meetings. Verify framing, lighting, and image quality in seconds.

Example:

Job Interview Setup

Test your webcam before online job interviews. Make sure you are centered, well-lit, and your camera delivers a professional-quality image.

Example:

Hardware Troubleshooting

Diagnose webcam problems: check if the camera is detected, verify resolution and FPS capabilities, and identify driver or permission issues.

Example:

New Webcam Testing

Just bought a new webcam? Test it instantly without installing any software. Check maximum resolution, frame rate, and image quality.

Example:

Profile Photo Capture

Take quick snapshots for profile pictures, avatars, or ID photos. Download high-resolution PNG images directly from your camera.

Example:

Streaming Setup Check

Streamers and content creators: verify camera positioning, background, and quality before going live on Twitch, YouTube, or Kick.

Example:

Frequently Asked Questions

๐Ÿ”งTechnical Details & Camera Architecture

Camera Access Pipeline

Data Flow:

Permission โ†’ getUserMedia โ†’ MediaStream โ†’ Video Element โ†’ Local Display
100% client-side | Zero uploads | Private by design

Every stage runs inside your browser's sandbox. Video frames never leave your device's rendering pipeline โ€” there is no server, no upload, and no recording unless you explicitly click "Take Snapshot", which is held in your browser's memory until you download or delete it.

Pipeline Stages:

  1. Permission prompt โ€” the browser asks you to allow camera access; a denial surfaces as NotAllowedError
  2. getUserMedia() โ€” the tool sends its constraints: the selected deviceId (exact) plus 1920ร—1080 as an ideal target
  3. MediaStream โ€” the browser returns a live stream object with one video track (plus an audio track if the level meter is on)
  4. Negotiation check โ€” track.getSettings() reports the actual resolution and frame rate the hardware agreed to
  5. Local rendering โ€” the stream is attached to the <video> element and painted straight by the browser compositor
  6. Release โ€” stopping the test calls track.stop(), which frees the hardware and switches the camera LED off

Why This Pipeline Is Private:

No server round-trip

Video is rendered directly into the page by the GPU/compositor. No pixel is ever serialized to the network.

Permission is scoped

The grant is per-site and revocable at any time from the address bar โ€” stopping the test releases the camera immediately.

Snapshots stay local

Snapshots are PNG data URLs held in browser memory only; they vanish when the tab closes unless you saved them.

Resolution Negotiation (Ideal vs Exact Constraints)

How the Tool Talks to Your Camera:

Request: { deviceId: { exact: selected }, width: { ideal: 1920 }, height: { ideal: 1080 } }
Answer: track.getSettings() โ†’ actual width / height / frameRate / deviceId
"ideal" = best effort, never a hard requirement | "exact" = must match, else OverconstrainedError

The tool asks for 1080p as an ideal, not an exact, target. This is deliberate: if a camera cannot deliver 1080p, the browser silently picks the closest supported mode instead of failing the whole request. The stats you see come from getSettings() โ€” the hardware's answer, not the request โ€” so the numbers always describe the real stream.

๐Ÿ†4K UHD

โ‰ฅ 3840ร—2160 (8.3 MP)
Pro streaming, detail close-ups

๐ŸŽฏFull HD

โ‰ฅ 1920ร—1080 (2.1 MP)
The tool's ideal request target

๐Ÿ’ปHD

โ‰ฅ 1280ร—720 (0.9 MP)
Typical laptop webcam default

๐Ÿ“ผSD or lower

โ‰ฅ 640ร—480 (0.3 MP)
Old webcams, virtual cameras

๐Ÿ’กA stream is labelled by whichever dimension crosses a tier threshold first โ€” e.g. 2560ร—720 reads as QHD-class because its width qualifies, and QHD (2560ร—1440) streams are labelled automatically too.

Frame Rate Measurement (rVFC vs Reported FPS)

Measurement Logic:

Modern path: requestVideoFrameCallback โ†’ count frames the compositor presents โ†’ FPS = frames รท elapsed seconds (sampled every ~1 s)
Fallback path: no rVFC support โ†’ FPS = track.getSettings().frameRate (camera-reported)
The lighting sample piggybacks on the same 1-second timer

๐Ÿ“‹Reported FPS

What the camera promises: the mode its driver negotiated. It stays fixed even when the system struggles โ€” a 30 FPS camera reports "30" whether or not it is keeping up.

โฑ๏ธMeasured FPS

What you actually get: real presented frames per second. It drops when the CPU is loaded, another app holds the USB bandwidth, or the browser throttles a backgrounded tab.

Performance Ratio Thresholds (Measured รท Reported):

โ‰ฅ 0.95
Score 100 โ€” smooth
0.85โ€“0.95
Score 90 โ€” minor dips
0.70โ€“0.85
Score 70 โ€” noticeable
< 0.70
Score 40 โ€” under load

Quality Scoring Algorithm

The Weighted Formula:

Score = (0.35 ร— Resolution) + (0.30 ร— Frame Rate) + (0.20 ร— Performance) + (0.15 ร— Lighting)
Each factor scores 0โ€“100 before weighting; the weighted sum is rounded to a whole number.
๐Ÿ“ Resolution (35%)
โ‰ฅ 1920ร—1080 (2,073,600 px) โ†’ 100
โ‰ฅ 1280ร—720 (921,600 px) โ†’ 80
โ‰ฅ 640ร—480 (307,200 px) โ†’ 50
anything smaller โ†’ 25
๐ŸŽฌ Frame Rate (30%)
โ‰ฅ 60 FPS โ†’ 100
โ‰ฅ 30 FPS โ†’ 90
โ‰ฅ 24 FPS โ†’ 70 | โ‰ฅ 15 โ†’ 50
below 15 FPS โ†’ 25
โšก Performance (20%)

Measured รท reported FPS ratio. Exposes CPU load, USB bandwidth contention and throttled background tabs: โ‰ฅ 0.95 โ†’ 100, โ‰ฅ 0.85 โ†’ 90, โ‰ฅ 0.70 โ†’ 70, below โ†’ 40.

๐Ÿ’ก Lighting (15%)

Frame brightness on a 0โ€“100 scale (Rec. 601 luma), sampled once per second from a 64ร—48 downsampled frame. Dark rooms drag the score down.

Excellent
85+
Good
65โ€“84
Fair
40โ€“64
Poor
below 40

Lighting Analysis & Audio Metering Internals

๐ŸŒ—Lighting Sample

frame โ†’ downsample to 64ร—48 canvas โ†’ getImageData
Luma = 0.299ยทR + 0.587ยทG + 0.114ยทB (Rec. 601)
Lighting % = round(avgLuma รท 255 ร— 100)

Sampling only 3,072 pixels keeps the cost negligible; it runs once per second on the same timer as the FPS meter. The sample reads the camera feed, so the tool's color filters and overlays never skew the measurement.

๐ŸŽ™๏ธAudio Level Meter

AnalyserNode (fftSize = 512) โ†’ time-domain samples
RMS = โˆš( ฮฃ(deviationยฒ) รท N ), deviation = value โˆ’ 128
Level = min(100, round(RMS ร— 200)) โ€” every animation frame (~60ร—/s)

The meter tracks amplitude only โ€” no audio is recorded, buffered, or stored. The microphone track is requested alongside the camera only when you switch the meter on, and both tracks stop together.

๐Ÿ’กIf the lighting percentage stays low even in a bright room, check for a privacy shutter, a flipped lens cover, or an exposure lock left over from another app.

Browser Compatibility

โœ“Fully Supported

  • โ€ข Chrome/Edge (v74+): Full getUserMedia + frame-callback FPS metering + audio metering (Chromium browsers like Brave and Opera inherit this)
  • โ€ข Firefox (v36+): Full getUserMedia support; FPS falls back to the camera-reported value where frame callbacks are unavailable
  • โ€ข Safari (v11+): macOS supported; iOS requires Safari 14.3+ for reliable in-browser camera access

โš Requirements

  • โ€ข HTTPS required โ€” camera access is restricted to secure contexts (localhost exempt for dev)
  • โ€ข Microphone permission is requested only when the audio level meter is switched on
  • โ€ข Device labels stay blank in the dropdown until permission is granted (a browser privacy measure)
  • โ€ข Camera permission is per-site and can be revoked any time from the address bar

โœ—Not Supported

  • โ€ข Internet Explorer and Legacy Edge โ€” no getUserMedia implementation
  • โ€ข Plain-HTTP origins โ€” the API is unavailable outside secure contexts by design
  • โ€ข iOS Safari below 14.3 โ€” in-browser camera capture is not exposed
  • โ€ข Cameras disabled at OS level (macOS: Privacy & Security โ†’ Camera; Windows: Settings โ†’ Privacy โ†’ Camera) or blocked by enterprise policy

Error Codes Decoded:

NotAllowedError / PermissionDeniedError

Access was denied. Click the camera/lock icon in the address bar, allow the camera, and retry.

NotReadableError / TrackStartError

Another app (Zoom, Teams, OBSโ€ฆ) holds the camera exclusively. Close it and retry.

NotFoundError / DevicesNotFoundError

No camera detected. Check the connection and that the device is enabled in system settings.

OverconstrainedError

The hardware cannot satisfy a requested setting. Try a different camera from the dropdown.

SecurityError

The page is not on HTTPS. Reopen the tool over a secure connection.

AbortError

The camera hardware failed to start. Reconnect the device and reload the page.

Was this tool helpful?

Help us improve by sharing your experience