How to extract thumbnails from a video in batch
- Step 1Drop your video onto the tool — Any container FFmpeg can read works — MP4, MOV, MKV, WebM, AVI. The file stays in the browser tab; nothing is uploaded. One video at a time (this tool processes a single file, not a folder of clips).
- Step 2Set the interval in seconds — The Interval (seconds) field controls the spacing between captured frames and accepts 1 to 120.
1gives one frame per second;5(the default) is good for a quick overview of a several-minute clip;60gives one frame per minute for long recordings. The tool runsfps=1/intervalunder the hood, so the number is literally seconds-between-frames. - Step 3Choose JPG or PNG — JPG (default) is high-quality and compact — ideal when you need many frames. PNG is lossless — pick it when frames feed compositing, ML training, or anything where JPEG blocking is unacceptable. There is no separate quality slider; JPG is fixed at FFmpeg
-q:v 2, PNG at-q:v 0. - Step 4Run the extraction — FFmpeg.wasm decodes the source and writes
frame_0001.<ext>,frame_0002.<ext>, and so on. Progress reflects FFmpeg's decode of the source — longer videos and higher interval counts take longer because more frames are written and zipped. - Step 5Download the ZIP — Output is a single archive named
<yourvideo>-thumbnails.zipcontaining every extracted frame in capture order. There is no in-browser per-frame preview or deletion step — open the ZIP to review and keep the frames you want. - Step 6Pick a sibling tool if you need more than evenly-spaced frames — Need one composited contact sheet instead of loose files? Use frame-grid-maker. Want frames only at scene cuts, not on a clock? Use scene-detector. Need the frames resized? Run them through an image tool, or downscale the video first with video-resizer before extracting.
What this tool exposes — the only two controls
Verified against the tool's client and processor. There are exactly two options; anything not listed here is not a control in this tool.
| Control | Type | Range / values | Default | What it does |
|---|---|---|---|---|
| Interval (seconds) | Number | 1 – 120 | 5 | Seconds between captured frames; drives FFmpeg fps=1/interval |
| Format | Select | jpg, png | jpg | Output image format; JPG = -q:v 2, PNG = -q:v 0 (lossless) |
| Start / end window | — | not available | — | Extraction always spans the whole video; trim first with lossless-trimmer to limit the range |
| Frame count target | — | not available | — | You set spacing (interval), not a count; total frames = ceil(duration / interval) |
| Resize / output dimensions | — | not available | — | Frames are native resolution; downscale via video-resizer before extracting |
Interval → approximate frame count
Roughly how many frames a clip of each length yields at each interval (total ≈ ceil(duration ÷ interval)). Use this to keep ZIP size and frame count manageable.
| Clip length | Interval 1s | Interval 5s | Interval 30s | Interval 60s |
|---|---|---|---|---|
| 1 minute | ~60 frames | ~12 frames | ~2 frames | ~1 frame |
| 10 minutes | ~600 frames | ~120 frames | ~20 frames | ~10 frames |
| 1 hour | ~3,600 frames | ~720 frames | ~120 frames | ~60 frames |
| 2 hours | ~7,200 frames | ~1,440 frames | ~240 frames | ~120 frames |
Tier limits for this tool (video family)
Limits are on input file size, not duration — there is no minutes cap. This tool processes one video per run regardless of the batch-file number.
| Tier | Max file size | Batch files | Practical note |
|---|---|---|---|
| Free | 1 GB | 1 | Fine for most talks/recordings; a long 4K capture can exceed 1 GB |
| Pro | 10 GB | 5 | Covers nearly all single-file sources |
| Pro-media | 100 GB | 50 | Long-form 4K/ProRes masters |
| Developer | 100 GB | unlimited | Same per-file ceiling; no batch-count cap |
Cookbook
Real interval settings for common batch jobs, showing the command this tool runs and what lands in the ZIP. Times and counts are illustrative.
Overview pass of a 12-minute tutorial at 10s spacing
You want a manageable contact set to skim a tutorial and find the moment to clip. A 10-second interval over 12 minutes gives ~72 frames — enough to see every section without a 7,000-frame dump.
Settings: interval = 10, format = jpg FFmpeg (in browser): ffmpeg -i tutorial.mp4 -vf fps=1/10 -q:v 2 frame_%04d.jpg Result: tutorial-thumbnails.zip frame_0001.jpg (t≈0s) frame_0002.jpg (t≈10s) ... frame_0072.jpg (t≈710s) → 72 frames, native resolution
One frame per minute from a 2-hour webinar recording
Long recording, you only need a periodic visual log. A 60s interval over 120 minutes gives ~120 frames — a tidy timeline of slide changes.
Settings: interval = 60, format = jpg FFmpeg: ffmpeg -i webinar.mp4 -vf fps=1/60 -q:v 2 frame_%04d.jpg Result: webinar-thumbnails.zip ~120 JPG frames, one per minute
Lossless PNG every second for a short product shot
A 20-second product clip that will be composited. PNG keeps every pixel; 1-second spacing gives 20 clean stills.
Settings: interval = 1, format = png FFmpeg: ffmpeg -i product.mov -vf fps=1/1 -q:v 0 frame_%04d.png Result: product-thumbnails.zip frame_0001.png ... frame_0020.png lossless, native resolution
Limit the range first, then batch-extract
This tool always spans the whole file. To grab frames from only the middle of a long video, trim losslessly first, then extract from the short clip.
Step 1 — lossless-trimmer: cut 14:00–16:00 → segment.mp4 Step 2 — thumbnail-extractor on segment.mp4 interval = 2, format = jpg ffmpeg -i segment.mp4 -vf fps=1/2 -q:v 2 frame_%04d.jpg Result: ~60 frames covering just the 2-minute section
Keep the ZIP small on a long source
A 90-minute conference talk at interval 1 would write ~5,400 frames — a huge ZIP and slow run. Widen the interval to stay practical.
Too much: interval = 1 → ~5,400 frames Better: interval = 15 → ~360 frames Long-log: interval = 60 → ~90 frames FFmpeg (interval 15): ffmpeg -i talk.mp4 -vf fps=1/15 -q:v 2 frame_%04d.jpg
Edge cases and what actually happens
You expected to set a frame count, not an interval
By designThis tool takes seconds-between-frames, not a target count. Total frames are derived: ceil(duration ÷ interval). To hit roughly N frames, divide the clip length by N to pick an interval (e.g. ~50 frames from a 500-second clip → interval 10).
Only one frame comes out
ExpectedIf the interval is larger than the clip is long (e.g. interval 60 on a 40-second clip), fps=1/60 produces a single frame near the start. Lower the interval to get more frames.
Interval set above 120 or below 1
ClampedThe Interval field is bounded to 1–120 seconds in the UI. You cannot request sub-second spacing here. For finer sampling, downscale/trim first or use a tool built for dense frame export.
Frames are full 4K and the ZIP is enormous
ExpectedFrames are native resolution by design — a 4K source yields 4K frames. There is no resize control in this tool. To shrink output, downscale the video with video-resizer before extracting, or post-process the images.
Very large source on the Free tier
Rejected over limitFree caps input at 1 GB. A long 4K or ProRes file can exceed that and will be rejected before extraction. Trim with lossless-trimmer to get under the limit, or upgrade for a higher ceiling (10 GB Pro, 100 GB Pro-media/Developer).
Browser runs out of memory on a huge frame run
Memory limitThousands of native-resolution frames must be held and zipped in the tab. A 4K source at interval 1 over an hour (~3,600 frames) can exhaust browser memory, especially on mobile. Widen the interval or trim the source to reduce the frame count.
Container FFmpeg.wasm cannot read
Decode errorExtraction runs through FFmpeg.wasm. An exotic or corrupt container, or a codec the WASM build lacks, fails the decode and the run reports a 'Thumbnail extraction failed' error with FFmpeg's log tail. Remux to MP4/MKV first and retry.
Frame timestamps don't land on exact keyframes
ExpectedThe fps filter samples roughly one frame per interval from the decoded stream; it is not keyframe-aligned and not scene-aware. For frames at scene boundaries use scene-detector; for chapter markers use chapter-extractor.
You wanted a single composited overview image
Wrong toolThis tool outputs individual frames in a ZIP, not one stitched sheet. For a single contact-sheet/storyboard image, use frame-grid-maker.
Video has no video track (audio-only file)
No framesWith no video stream there is nothing to sample and the run produces no frames. If you actually want the sound, use audio-track-extractor instead.
Frequently asked questions
How do I control how many frames I get?
Indirectly, through the interval. The tool extracts one frame every N seconds, so the count is ceil(duration ÷ interval). For ~100 frames from a 10-minute (600s) clip, use interval 6. There is no field to set a frame count directly.
What's the smallest interval I can use?
1 second. The Interval field accepts 1 to 120 seconds, so the densest sampling here is one frame per second. Sub-second or per-frame export is not a feature of this tool.
Can I extract frames from only part of the video?
Not directly — extraction always spans the whole file. Trim the range first with lossless-trimmer (no re-encode), then run the extractor on the short clip.
What resolution are the frames?
The source's native resolution. A 1920×1080 video yields 1080p frames; a 4K video yields 4K frames. There is no resize option in this tool. To get smaller frames, downscale the video first with video-resizer.
JPG or PNG — which should I pick?
JPG (the default) is high quality and compact — best when you need many frames. PNG is lossless — pick it for compositing, archival, or ML data where JPEG artifacts are unacceptable. JPG is fixed at FFmpeg -q:v 2; there's no separate quality slider.
Is the video uploaded anywhere?
No. Extraction runs on FFmpeg.wasm inside your browser tab; the file is never sent to a server. That makes it safe for unreleased footage, confidential cuts, or evidence material.
Is there a length limit on the video?
No minutes cap. The limit is file size: 1 GB on Free, 10 GB on Pro, 100 GB on Pro-media and Developer. A multi-hour recording is fine as long as it's under your tier's size ceiling.
Can I process a whole folder of videos at once?
No — this tool handles one video per run and produces one ZIP. The batch-file numbers in the tier table apply to tools that accept multiple inputs; here you run videos one at a time.
How are the output files named?
Frames are zero-padded and sequential: frame_0001.jpg, frame_0002.jpg, and so on (or .png), inside an archive named <yourvideo>-thumbnails.zip. They sort in capture order automatically.
Are the frames exactly on keyframes or scene cuts?
No. The fps filter samples on a regular time grid, not on keyframes or scene changes. For frames at scene boundaries, use scene-detector; for one stitched overview image, use frame-grid-maker.
Why did extraction fail with an FFmpeg error?
Usually an unreadable or corrupt container, or a codec the WASM FFmpeg build doesn't support. The error includes FFmpeg's log tail. Remux to MP4 or MKV and retry; if the file has no video track, there are no frames to extract.
What's the difference between this and a grid/contact sheet?
This tool gives you individual frame files in a ZIP at a fixed interval. frame-grid-maker composites frames into a single overview image (a contact sheet/storyboard). Use this one when you want the raw frames; use the grid tool when you want one shareable picture.
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.