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
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.