Record video from your webcam and microphone directly in the browser, then download the file -- no upload, no server.
Record video from your webcam and microphone directly in the browser, then download the file -- no upload, no server. Record video from your webcam and microphone directly in the browser, then download the file -- no upload, no server.
Your browser does not support getUserMedia or MediaRecorder. Try a recent version of Chrome, Firefox, Edge, or Safari over HTTPS.
Recording in the browser is a three-step pipeline. First, getUserMedia()
captures a MediaStream from the camera and microphone after you grant
permission -- browsers always ask, and they require a secure context
(HTTPS or localhost). Second, a MediaRecorder consumes that stream and
encodes incoming frames into a container format such as WebM, chopping the
data into chunks as it goes. Third, when you stop, the chunks are assembled
into a single Blob that can be played back and downloaded. Nothing is
transmitted: the encoding happens on your device, which is why a browser
recorder can produce a file even with the network turned off.
Containers and codecs
The container and codec depend on your browser and platform. WebM with VP8
or VP9 video and Opus audio is the safest bet and works in Chrome, Firefox,
Edge, and Safari. MP4 is offered when the browser reports support for it,
which is increasingly common on newer devices but not universal. If you pick
a format the browser cannot encode, this page falls back to WebM
automatically. When the recording finishes, the download button appears with
the correct extension (.webm or .mp4) matching what was actually produced.
Privacy and permissions
Before the stream starts, the browser shows a permission prompt that lets you
choose which camera and microphone to share -- the device dropdowns on this
page are populated from enumerateDevices(), and you can switch devices and
re-open the stream. All processing is local: the video bytes never leave your
machine, and nothing is stored by the page itself. When you stop recording,
the camera indicator light turns off and the stream's tracks are released,
so no resource stays held after you finish. On some systems the camera light
remains on as long as the page holds any stream, even when muted.
Practical notes
Preview mirrors correctly (muted playback avoids echo), and the timer tracks
elapsed time while recording. For long recordings, note that in-memory chunks
grow with duration, so very long sessions use more memory. If you need to
record the screen instead of the camera, that requires a different API
(getDisplayMedia) and is out of scope here. If the permission prompt was
denied once, browsers usually lock the choice until you clear site settings.
Frequently asked questions
Why does the page ask for camera/microphone permission?
getUserMedia() always requires explicit user consent for privacy. The browser shows a prompt listing exactly which devices will be shared; you can grant it once and the stream starts immediately after.
Why is my recording saved as .webm?
WebM (VP8/VP9 + Opus) is the container every major browser can encode natively. MP4 is only offered where the browser reports support; otherwise the page falls back to WebM automatically.
Is my video uploaded to a server?
No. Encoding happens locally via MediaRecorder and the result is a Blob in your browser's memory. Nothing is transmitted and the page stores nothing; you can record with the network off.
Why does the camera light stay on?
The light indicates that the page holds a live camera stream. It turns off when you stop recording and the tracks are released. Some systems keep the light on while any stream is active, even if muted or not recording.
Can I change devices mid-session?
Yes. Pick a different camera or microphone in the dropdowns and start a new recording; the page re-negotiates the stream with the new device selection on the next start.
What do I need for the recorder to work?
A browser that supports getUserMedia and MediaRecorder (all modern browsers), a camera and microphone, and a secure context: HTTPS or localhost. The page shows a notice instead of the controls if support is missing.