How frames come out of an MP4 as JPGs
This is a frame exporter rather than a format converter. The video is decoded on your own device and frames are sampled at the rate you choose, from one frame per second up to thirty. Each frame is written at the full video resolution, so a 1080p source produces 1920 by 1080 stills, and the whole set is bundled into a single ZIP with sequential file names.
Everything runs locally. The video is written into an in-memory filesystem inside the browser tab, ffmpeg decodes it there, and the JPGs are encoded there too. A private recording stays private, and a large file costs no upload time because there is no upload.
The pipeline has one detail worth knowing. Frames come out of ffmpeg as PNG and are then re-encoded to JPG on an HTML canvas at high quality. That extra hop exists because the JPEG encoder in this WebAssembly ffmpeg build is unreliable, and the canvas path is deterministic. The practical effect is that JPG output is a second encode of a lossless intermediate, which is why the stills stay clean.
- Choose one video or drop it on the page
- Pick a frame rate between 1 and 30 fps, and optionally a time range
- Download one ZIP of numbered JPG stills
Picking a sampling rate without drowning in files
Choose the rate by the number of images you want to end up with, because the count grows faster than people expect. Duration in seconds times frames per second is the whole formula. One frame per second turns a two-minute clip into 120 images, which is plenty for finding a thumbnail or building a contact sheet. Thirty per second turns the same clip into 3,600 images.
High rates exist for frame-by-frame inspection of short moments: checking an animation, finding the exact frame where something went wrong, pulling a sequence for a flipbook. They are not meant for whole videos. Combine a high rate with a narrow start and end range instead, which is both faster and far kinder to memory.
The two-pass approach works well for finding a single perfect still. Export at 1 fps first, scroll the ZIP to find the right second, then re-run a two-second range at 30 fps and pick the best of the sixty frames that come back.
JPG against PNG, and what the stills inherit
JPG is the right format when you want many small stills, which is the normal case for thumbnails, contact sheets, and quick review. The same tool can write PNG instead, which is worth choosing when the frames are heading into precise editing, or when they contain sharp text or flat UI where JPG artifacts around edges would show.
Frames inherit the source exactly. Resolution matches the video, nothing is upscaled, and nothing is sharpened. Motion blur lives in the footage: a blurry frame was blurry in the video, and the fix is a different nearby frame rather than any setting here. Color and exposure come across as the decoder produced them.
One structural limit is worth stating. There is no per-frame preview and no picker, so you get the whole sampled set rather than choosing individual frames in the interface. That is what makes the narrow-range, high-rate second pass the practical way to isolate one image.
- JPG for many small stills, PNG for editing and sharp text
- Stills match the video resolution exactly, with no upscaling
- There is no in-page frame picker, so narrow the time range instead