How to pull frames from an mp4 locally
- Step 1Load the MP4 — Drop the MP4 (or MOV/MKV/WebM/AVI) onto the tool. It stays in the browser tab — no upload, no server copy. One file per run.
- Step 2Pick the interval for your job — Set Interval (seconds) —
1for a dense dataset/highlight pass,5–30for sparser sampling. Range is 1–120s. Remember frame count ≈ ceil(duration ÷ interval), so plan for ZIP size. - Step 3Choose JPG or PNG — JPG keeps datasets compact; PNG is lossless for cases where compression artifacts would taint training or compositing. JPG is fixed at
-q:v 2, PNG at-q:v 0— there's no separate quality slider. - Step 4Run extraction locally — FFmpeg.wasm decodes the MP4 in-tab and writes one frame per interval. Big files and tight intervals run longer because there are more frames to decode and zip.
- Step 5Download the frame ZIP — Output is
<yourvideo>-thumbnails.zipof native-resolution frames in capture order, ready to ingest into a pipeline or asset store. - Step 6Need cut-aligned or resized frames? — For frames at scene boundaries (not a clock), get cut timestamps from scene-detector. For smaller frames, downscale the MP4 first with video-resizer — there's no resize step in this tool.
Sampling type — what this tool is and isn't
Important for highlight/ML use: this is uniform time sampling, not keyframe or scene-based extraction. Verified against the implementation.
| Sampling type | This tool? | How to get it |
|---|---|---|
| Uniform time interval (every N s) | Yes | fps=1/interval, interval 1–120s |
| Keyframe-only (I-frames) | No | Not a control here; the fps filter samples decoded frames on a time grid |
| Scene-cut aligned | No | Detect cuts with scene-detector, then sample around them |
| Resized / fixed dimensions | No | Native resolution only; pre-shrink with video-resizer |
Interval by job, and rough output size
Pick interval by goal; watch the frame count on long files. Native-resolution PNG frames are large — JPG keeps datasets compact.
| Job | Interval | Format | Note |
|---|---|---|---|
| Dense ML dataset | 1s | jpg | Maximum sample density; compact files |
| Balanced training set | 2–5s | jpg | Reduces near-duplicate frames |
| Highlight candidate pull | 2–3s | jpg | Enough coverage to spot good moments |
| Ad-creative stills (clean) | 1–2s | png | Lossless for heavy editing afterward |
| Long MP4 overview | 30–60s | jpg | Keeps frame count and ZIP small |
Cookbook
Interval recipes for highlights, ML data, and ad creative, with the FFmpeg command the tool runs locally. No upload, no quota.
Build a 1-fps image dataset from a 5-minute MP4
Uniform 1-second sampling gives a balanced set of ~300 stills to label and train on, all local.
Settings: interval = 1, format = jpg FFmpeg (in browser): ffmpeg -i source.mp4 -vf fps=1/1 -q:v 2 frame_%04d.jpg Result: source-thumbnails.zip frame_0001.jpg ... frame_0300.jpg → dataset
Reduce near-duplicates for training
1 fps from slow footage produces lots of near-identical frames. Widen to 3s to cut redundancy while keeping variety.
Settings: interval = 3, format = jpg FFmpeg: ffmpeg -i clip.mp4 -vf fps=1/3 -q:v 2 frame_%04d.jpg Result: ~1 frame / 3s — fewer near-duplicate samples
Lossless PNG ad-creative stills
Stills will be cut out and composited for ads. PNG avoids stacking JPEG artifacts through the design work.
Settings: interval = 2, format = png FFmpeg: ffmpeg -i master.mp4 -vf fps=1/2 -q:v 0 frame_%04d.png Result: lossless native-resolution stills
Highlight pull, then go dense on the best section
Sweep a long MP4 for highlights, then re-extract densely on the winning section after trimming.
Pass 1 — interval = 10 on full MP4 → ~candidates
Pass 2 — lossless-trimmer cut the highlight → hl.mp4
thumbnail-extractor interval = 1 on hl.mp4
ffmpeg -i hl.mp4 -vf fps=1/1 -q:v 2 frame_%04d.jpgKeep a big MP4 fully offline
A 6 GB client MP4 can't go to a cloud API. On Pro (10 GB cap) it processes entirely in-tab with no upload.
Tier: Pro (10 GB file cap) Settings: interval = 5, format = jpg (file never uploaded — FFmpeg.wasm runs locally) ffmpeg -i client.mp4 -vf fps=1/5 -q:v 2 frame_%04d.jpg
Edge cases and what actually happens
You expected I-frame / keyframe-only output
By designDespite 'keyframe' in some search terms, this tool samples decoded frames on a uniform time grid via fps=1/N — it does not filter to I-frames. The result is evenly spaced stills, not codec keyframes.
Frames don't land on scene changes
ExpectedSampling is clock-based, so a frame can fall mid-shot. For scene-cut-aligned frames, detect cuts with scene-detector and sample around each cut.
1 fps creates thousands of near-duplicate dataset frames
ExpectedSlow or static footage at interval 1 yields highly similar frames that add little to a dataset and bloat the ZIP. Widen the interval to 3–5s to reduce redundancy.
PNG dataset ZIP is enormous
By designNative-resolution PNG frames are large. For a compact dataset use JPG; only use PNG when losslessness matters. To shrink frames, downscale the MP4 first with video-resizer.
MP4 exceeds your tier's file-size cap
Rejected over limitFree is 1 GB; Pro 10 GB; Pro-media/Developer 100 GB. A larger file is rejected before extraction. Trim with lossless-trimmer or upgrade. There is no minutes cap — only size.
Browser OOM on a dense pull from a big file
Memory limitDecoding and zipping thousands of native-resolution frames in a tab can exhaust memory, especially on mobile. Widen the interval, split the source, or use a desktop browser with more RAM.
Unsupported codec inside the MP4 container
Decode errorAn MP4 wrapping a codec the WASM FFmpeg build lacks fails the decode with a log tail. Transcode to H.264 first (e.g. with video-transcoder) and retry.
Interval pushed past 120s for a sparse overview
ClampedMaximum interval is 120 seconds (one frame every two minutes). For an even sparser overview, you'd trim/segment the source rather than widen further.
Frequently asked questions
Does this extract only keyframes (I-frames)?
No — despite the name some users search, it samples frames on a uniform time grid with fps=1/N, not codec keyframes. The output is evenly spaced stills. For scene-cut-aligned frames, pair it with scene-detector.
Is the MP4 uploaded to a server?
No. FFmpeg.wasm runs in your browser tab; the file never leaves your machine. There are no rate limits or quotas because no API is involved.
What quality are the frames?
Native resolution, full quality. JPG uses FFmpeg -q:v 2 (near-top quality); PNG is lossless (-q:v 0). There's no quality slider — switch format to control compression.
How dense can I sample for an ML dataset?
Down to one frame per second (interval 1). For finer-than-1s sampling you'd need a different approach; this tool's densest is 1 fps. Widen the interval to cut near-duplicates.
How big a file can I process?
Up to 1 GB on Free, 10 GB on Pro, 100 GB on Pro-media and Developer. The limit is file size, not length — there's no minutes cap.
Why are there so many near-identical frames?
Uniform sampling on slow/static footage captures similar frames. Increase the interval (e.g. 3–5s) to reduce redundancy, or de-duplicate downstream in your pipeline.
Can I get frames at exact scene cuts for highlights?
Not from this tool directly — it samples on a clock. Use scene-detector to find cut timestamps, then trim and extract around those points for cut-aligned highlight frames.
JPG or PNG for ad creative?
PNG if the still will be cut out and composited (lossless avoids stacking artifacts). JPG if it's a quick candidate or won't be heavily edited.
Can I resize the frames as they come out?
No — frames are native resolution and there's no resize control. Downscale the video first with video-resizer, or resize the images in your pipeline.
What if the MP4's codec isn't supported?
The run fails with an FFmpeg log tail. Transcode to H.264 MP4 with video-transcoder, then extract frames from the result.
Can I extract frames from many MP4s at once?
One file per run, one ZIP per file. Run them individually. The batch-file numbers in the tier limits apply to multi-input tools, not this one.
Are filenames pipeline-friendly?
Yes — zero-padded sequential names (frame_0001.jpg …) sort in capture order and import cleanly into labeling or training tooling.
Privacy first
Every JAD Video tool runs entirely in your browser via WebCodecs and FFmpeg (WebAssembly). Your video files never leave your device — verified by zero outbound network requests during processing.