Extractor · No upload

Save frames from a video on your device

Save one frame of a video as a PNG or JPG, or sample a clip at an interval and download the frames as a ZIP.

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

Many frames: sample across a clip

92
Statusidle File— Resolution— Duration— Source frame ratenot measurable in browser Preview position— Format settingPNG Frames exported0 Network since file read—

Frame-callback times can differ from requests. Without a callback timestamp, the browser target stands in: row “position not measured”, readout “not measured”. Duplicate notes can miss fallback repeats. Runs stop at 120 frames or 512 MB; JPEG quality stays within 60–100, with limits reported. One video at a time. Takes .mp4, .m4v, .mov, .webm, .mkv, .avi, .ogv and .3gp.

How this frame extractor works

When you choose a video, the browser's File API gives this page access to its bytes. The browser's own media engine loads the clip into the preview, and the page draws the frame on screen onto a canvas at the video's reported width and height. The browser then encodes that canvas as PNG or JPEG. Unlike this site's HEIC, MP3 and GIF tools, this page downloads no extra library. The methodology page explains the meter's coverage and how to run separate network and offline checks.

The readout shows the duration and dimensions the browser reports, and each result row gives the output dimensions and file size. The sampling interval and FPS are requested settings that decide when the page asks for a frame, and the progress total is the planned number of samples. JPEG q92 in the readout, a row or a file name means encoder setting 92, not a measured quality score. On a measured row, the timestamp and filename use the browser's reported frame-callback time. That time can differ from the request, including falling after it; the browser's currentTime can simply echo the request. When this page's scrubber or time box supplies a request, the row shows both times. The video's own controls supply no separate request from this page, so its row shows the reported frame time alone. Chrome can deliver a frame callback before or after its seek-completion event. The reported timestamp does not verify that the saved picture matches the requested instant. If no frame callback is available, no new frame is presented, the tab is hidden or the callback wait times out, the browser target stands in: the readout says “not measured” and the row says “position not measured”. Repeating a seek or starting a run at the preview's current position can use this fallback. Such rows can share a picture without a duplicate note; matching reported timestamps are marked rather than dropped. If the browser encodes PNG when JPEG was requested, the file is named for the format it produced and the substitution is reported.

A saved frame holds the decoded video pixels, so detail the video codec discarded is not there, and this canvas path reduces HDR to 8-bit output. This tool does not measure the source frame rate or seek by frame number: the frames-per-second control asks for timestamp sampling, and the Source frame rate row says the rate is not measurable. A clip end past the video is clamped to its duration and JPEG quality is held to 60–100, and each adjustment is reported. Sampling many frames at native resolution takes time and memory on your device.

Frequently asked questions

Is my video uploaded anywhere?
No. The browser reads and decodes the video, and its canvas encodes each frame as PNG or JPEG in this tab. The meter counts resource-timing entries after the first file read; it does not see the page's earlier loads or every network channel.
Why is the exported timestamp different from the one I asked for?
A requested time such as 3.000 seconds can fall inside a frame's display interval. The tool records the timestamp the browser reports for the frame it presented, which can be earlier or later than the request. The browser's currentTime can echo the request, and Chrome can deliver the callback before or after its seek-completion event. For requests from this page's scrubber or time box, rows show the requested and reported times and use the reported time in the filename. The video's own controls supply no separate request from this page, so the row shows the frame time or a labeled browser target. When no callback is available, the tab is hidden, the wait times out or a repeated seek presents no new frame, the browser target is used: the readout says “not measured” and the row says “position not measured”. Pause the preview and let a seek settle before exporting or starting a run.
What size are the exported frames?
Native resolution: the width and height reported by the decoder, with no scaling step. The readout and each row report those dimensions. PNG, the default, adds no second lossy compression; it still carries the canvas colour and bit-depth limits and cannot restore detail the video codec discarded. JPEG, with its quality setting, gives smaller files.
Which video files does this work with?
The page accepts MP4, MOV, WebM, MKV and AVI files, among others, and reads the ones your browser can decode. The codec inside the file matters as much as the extension: MP4, MOV and WebM are the common choices, while MKV and AVI support varies. A file that cannot be read gets an error naming the file and its container. A different browser can help with some codec problems.
Can I get every single frame of the video?
No. The tool samples the timestamps you request and does not step through the video by frame number, so the frames-per-second setting is a sampling rate. A run stops at 120 frames, or earlier when the collected frames reach the 512 MB memory guard, and the page reports which limit applied. To save a few chosen moments, scrub to each one and export it.

Related tools