Extractor · No upload

Video to frames and stills, without uploading the video

Load a video from your device, scrub to the moment you want and save that still — or dump frames across a clip at a set interval. Frames come out at the video's own resolution as PNG or JPEG. Everything runs inside your browser: the video never travels anywhere, and the network meter below proves it live.

Statusidle File Resolution Duration Source frame ratenot measurable in browser Preview position FormatPNG Frames exported0 Network since file read

One still image — scrub to the moment, save as PNG or JPG

Many frames — sample across a clip

92

How this frame extractor works

When you choose a video from your device, the browser's File API hands this page the bytes in memory — no transfer happens, because the file is already on your machine. Your browser's own media engine does the decoding: the same machinery that plays video on any web page loads your clip into the preview above, and this page draws whatever frame is showing onto a canvas at the video's measured width and height. The canvas then writes a PNG or a JPEG, which is also the browser's own code. Unlike this site's HEIC, MP3 and GIF tools, this page downloads no library at all — there is nothing to fetch after the page itself, so the network meter's zero covers the whole session. The methodology page shows how to verify that for yourself.

Everything the readout and the result rows show is a measurement, not an assumption. The resolution is the width and height the browser reports for your file, and it is what the frames are written at — nothing is scaled up or down. The timestamp on each row and in each file name is the position the video actually landed on, not the one that was requested: browser seeking is keyframe-dependent, so asking for 3.000 seconds can land a few hundredths away, and both numbers are printed side by side. If two sampled positions resolve to the same decoded frame, the row says so instead of quietly dropping one, and if your browser writes a PNG when JPEG was asked for, the file is named for what it actually produced and the substitution is reported.

The honest limits: what your browser can't decode, this page can't read — MP4, MOV and WebM are dependable, while MKV and AVI generally are not, and a file that fails gets an error naming both the file and the container rather than a silent skip. A web page is given no way to read a video's true frame rate and no way to step to a specific frame number, so the readout says the source frame rate is not measurable and the frames-per-second control is a rate this tool asks for, sampled by timestamp. A run stops at 120 frames, and stops earlier if the collected frames reach a 512 MB memory guard; both are stated here and reported on the run whenever they apply. Sampling many frames at native resolution takes real time and memory on your device.

Frequently asked questions

Is my video uploaded anywhere?
No. The browser reads the file from your disk, its own media engine decodes it in this tab, and the frames are written to PNG or JPEG by the browser's own canvas. This page downloads no library at all — there is nothing to fetch after the page itself, which is why the readout's network meter can count every request from the moment your file is read and stay at zero. The methodology page shows how to verify that independently, including the airplane-mode test.
Why is the exported timestamp different from the one I asked for?
Because browser seeking is keyframe-dependent: asking for 3.000 seconds moves playback to the nearest position the decoder can actually produce, which may be a few hundredths of a second away, and how far depends on how the video was encoded. This tool reports the position it actually landed on rather than the one you requested — every result row shows both, and the file name carries the actual timestamp. If a run asks for frames closer together than the video can supply, two rows can land on the same decoded frame; that is reported on the row too, not quietly removed.
What size are the exported frames?
The video's native resolution, whatever that is — there is no scaling step. The readout shows the measured width and height as soon as the file loads, and every result row repeats it, so you can see what you are getting rather than assume it. PNG is the default because a still pulled from a video is usually going to be cropped, annotated or compared, and PNG adds no second round of compression on top of the video's own. JPEG is offered with a quality dial when file size matters more.
Which video files does this work with?
Whatever your browser can decode, because it is the browser doing the decoding. MP4, MOV and WebM cover phone footage, screen recordings and camera clips and decode reliably in every current browser. MKV and AVI generally do not: browsers ship no demuxer for them, and a file that cannot be read gets an error naming that file and naming the container rather than a wrong result. Trying a different browser genuinely helps for codec cases, since support differs.
Can I get every single frame of the video?
Not exactly, and it is worth knowing why. A web page is given no way to read a video's true frame rate and no way to step to a specific frame number — so the frames-per-second control here is a rate this tool asks for, not a measurement of your file, and it samples by timestamp. On top of that, a run stops at 120 frames, because frames come out at native resolution and a long dump would exhaust the tab's memory; the cap is reported whenever it applies. For a handful of exact moments, the scrub-and-export mode is the better tool.

Related tools