Video Sprite Sheet Generator
Sample frames from a video into one grid image.
About this tool
Samples frames evenly across a video's whole length and arranges them into a single grid image (a "contact sheet" for video) — handy for previewing a video's content at a glance, picking a thumbnail moment, or a video-scrubbing sprite for a custom player. Runs entirely in your browser using ffmpeg.wasm, a WebAssembly build of the real ffmpeg; your video is never uploaded anywhere.
Two different jobs, one tool. A sprite sheet serves two quite different purposes depending on the grid size you pick. A small grid (say 5×4 = 20 frames) is a quick visual index of a video's content — useful for a preview thumbnail, a forum post, or confirming you grabbed the right file without opening a player. A large grid (dozens or hundreds of tiny frames) is a "scrubbing sprite," the same technique YouTube and most video players use under the hood: as you drag a video's seek bar, the player swaps between pre-generated frame thumbnails from a sprite sheet instead of re-decoding the actual video, which is far faster than seeking live.
How frames are chosen. The video's total duration is divided into columns × rows equal segments, and one frame is captured from the same relative position in each segment — so a 5×4 grid (20 frames) of a 10-minute video samples one frame roughly every 30 seconds, evenly covering the whole timeline rather than clustering near the start.
Choosing a grid size. More frames means finer time resolution but a larger output image and longer processing time (each frame requires a real seek-and-decode). For a quick overview, 4–6 columns by 3–5 rows (16–30 frames) is usually plenty. For an actual scrubbing sprite meant to be sliced up in a custom video player, you'll want many more — one frame per second of video is a common target, which for a long video means adjusting columns/rows to get a high total count.
Thumbnail width controls each individual frame's pixel size in the output grid — smaller keeps the whole sheet's file size down (useful for a scrubbing sprite that gets loaded on every page view), while larger gives a clearer look at each frame for a preview-style sheet.
To pick and export a single frame instead of a grid, use the video thumbnail grabber. For the same grid-of-images idea applied to a folder of separate photos rather than one video, see the contact sheet maker. To cut the video down before sampling it, the video trimmer.
The ffmpeg engine (about 32MB) is only downloaded the first time you use this tool, not when the page loads.
Frequently asked questions
- How are the frame moments chosen?
- Evenly spaced across the video's full duration — columns × rows frames total, sampled at a constant interval from start to end.
- What's a good grid size?
- For a quick visual overview, 4–6 columns by 3–5 rows is usually plenty. For a scrubbing sprite sheet used in a custom video player, you'll typically want many more, smaller frames.
- Is my video uploaded anywhere?
- No — the entire process, including the ffmpeg engine itself, runs locally in your browser via WebAssembly. Nothing is sent to any server.
- What is a "scrubbing sprite" actually used for?
- Video players (including YouTube's) show a small preview thumbnail as you drag the seek bar. Rather than decoding the video live for every mouse position, the player swaps between pre-made frames from a sprite sheet exactly like the one this tool generates — much faster and smoother.
- Does the grid size affect processing time?
- Yes — each frame requires an actual seek and decode inside ffmpeg, so a 200-frame sheet takes meaningfully longer to generate than a 20-frame one, especially on a longer source video.
- Can I control which exact moments are sampled?
- Not individually — sampling is always evenly spaced across the full video length based on your columns × rows total. To grab one specific exact moment, use the video thumbnail grabber instead.
- What format is the output?
- A single PNG image containing the full grid, sized according to your columns, rows, and thumbnail width settings.