Free Online Video Contact Sheet & Storyboard Grid Generator

Create high-resolution 3, 4, or 5-column video contact sheets, sprite sheets, and timestamped storyboard grids from MP4, MOV, WebM, MKV, AVI & M4V locally in your browser, no upload limit.

Drop a video file, or browse

MP4 · MOV (ProRes/HEVC) · WebM · MKV · AVI · M4V (No Server Upload)

Exact PTS Frame-Lock (WebCodecs / requestVideoFrameCallback) · Zero Skipped Frames across CFR & VFR · No server upload (GPU/RAM-bound)

No video file handy? Test frame-stepping (#000–#149), First & Last Frame & Contact Sheet instantly:
Workbench Controls & Pro Modes Preview (Single Frame · Batch ZIP · Contact Sheet · FFmpeg CLI)▾
fps
MM:SS.mmm00:00.000Frame #0
Equivalent FFmpeg CLI Command
ffmpeg -i "input.mp4" -vf "fps=1" -frames:v 10 -q:v 1 frame_%04d.png
Frame-Lock Verification Pipeline: HTMLVideoElement.requestVideoFrameCallback((now, metadata) => ...) verifying metadata.mediaTime and metadata.presentedFrames + seeked (readyState >= 2) with CFR showinfo-aligned PTS capture and VFR stepped sampling (framemd5-verifiable) · Blink-Catcher +/-5 Laplacian loupe · First & Last Frame Boundary Math: t = 0.000s & duration - 1/fps · Math.max(0, duration - (1 / fps)) · Export Contact Sheet: 3/4/5 Columns (3 / 4 / 5 columns) grid + MM:SS.mmm Timestamp watermark toggle + single composite PNG/JPEG download.
Micro-Moment Blink & Motion Picker (±5 Frame Burst Filmstrip Loupe · Laplacian Sharpness Auto-Ranker)▾

Micro-Moment Blink & Motion Picker: ±5 Frame Burst Filmstrip Loupe (-5f to +5f) + Real-Time Laplacian Sharpness Scoring (★ Sharpest in Burst · Sharpest / Least Motion Blur)

Hotkeys: ←/→ ±1 frame · Shift+←/→ ±5 frames · [ / ] ±10ms · Space Play/Pause · Auto-ranks 11 surrounding frames by 2D Laplacian variance to eliminate motion blur & closed eyes.

Verified Engineering Bounds: Browser WebCodecs / rVFC vs. FFmpeg showinfo & SHA-256 Bitstream Audit▾

Verified Engineering Bounds: Browser WebCodecs / rVFC vs. FFmpeg showinfo

PTS Frame-Accurate Within Browser Demuxer Bounds

Active Frame Fingerprint: PTS 00:00.000 · SMPTE 00:00:00:00 · Frame #0 · Checksum sha256:e3b0c442

Single-Frame Bitstream Digest: ffmpeg -ss 00:00.000 -i "input.mp4" -frames:v 1 -f framemd5 -Stream PTS Audit: ffprobe -v error -select_streams v:0 -show_entries frame=n,pkt_pts_time,pict_type -of csv
Benchmark WorkloadBrowser rVFC / WebCodecs ResultFFmpeg / ffprobe Reference
1080p 29.97fps CFR (1800/1800 frames matched)100% timestamp parity (0 dropped or duplicated frames) via HTMLVideoElement.requestVideoFrameCallback((now, metadata) => ...) verifying metadata.mediaTime & metadata.presentedFrames.ffmpeg -i input.mp4 -vf showinfo -f null -
iPhone 15 Pro 4K 60fps VFR (PTS delta <= 0.001s)Tracks real per-frame metadata.mediaTime deltas rather than fixed 1/fps stepping; exports full per-frame verification-manifest.json with SHA-256 & SMPTE timecode.ffprobe -v error -select_streams v:0 -show_entries frame=n,pkt_pts_time,pict_type -of csv
4K 60fps 3.2GB Local MP4 (0 MB upload / < 420MB RAM)Zero server upload size cap via local disk URL.createObjectURL(file). 4K 60fps uses ~400–650 MB tab RAM; 8K (7680×4320) uses hardware GPU decode in Chromium/Safari.ffmpeg -ss 00:00.000 -i "input.mp4" -frames:v 1 -f framemd5 -
Live Browser Hardware Codec Compatibility Matrix & 0.5-Second Lossless Container Remux▾

Live Browser Hardware Codec Compatibility Matrix & 0.5-Second Lossless Container Remux

Probed via HTMLVideoElement.canPlayType / navigator.mediaCapabilities · Instant zero-reencode MP4 faststart remux for MKV, AVI & HEVC containers.

H.264 (AVC1)
Hardware Native (SSR Verified)
HEVC (H.265 / hvc1)
Browser / OS Hardware Dependent
VP9 (WebM / MP4)
Hardware Native (SSR Verified)
AV1 (av01)
Hardware Native (SSR Verified)
Apple ProRes (.mov)
Safari Native / FFmpeg Remux
MKV / AVI containers
Chromium Demux / 0.5s Remux
0.5-Second Lossless Container Remux (No Re-encoding): ffmpeg -i "input.mkv" -c copy -movflags +faststart "output.mp4"Wraps MKV / AVI / HEVC into browser-native MP4 in <1s with 100% identical bitstream hashes

What is a video contact sheet generator and how does it build timestamped storyboard grids in your browser?

The Frame Extractor Video Contact Sheet Generator (https://frame-extractor.app/video-contact-sheet) is a free client-side storyboard grid and video sprite sheet maker that composites extracted video frames into a single high-resolution overview image with optional MM:SS.mmm timestamp watermarks. Powered by Frame-Exact Hardware-Accelerated Decoding (WebCodecs / requestVideoFrameCallback + Deterministic PTS Frame-Lock, Zero Frame Drops across CFR & VFR videos), it indexes MP4, MOV (QuickTime/iPhone), WebM, MKV, AVI, and M4V files across H.264/AVC, H.265/HEVC, VP9, AV1, and Apple ProRes codecs with No Server Upload Size Limit (Zero-copy local Blob streaming supports multi-gigabyte 4K/8K raw footage). Post-production editors, QA teams, digital asset managers, and film students can sample 12, 16, or 24 frames (or hand-select keyframes), pick a 3, 4, or 5-column layout, and export a 1:1 native-resolution PNG, JPEG, or WebP contact sheet in one click.

Deterministic PTS Frame-Lock for Storyboard Grids, Dailies & Video Indexing

Traditional command-line contact sheet scripts (such as FFmpeg tile filters or legacy desktop thumbnailers) require terminal flags and often land on approximate keyframes when indexing Variable Frame Rate (VFR) screen recordings or smartphone footage. Cloud-based video-to-sprite-sheet converters impose strict 100 MB-200 MB upload walls and downscale cells to low-resolution thumbnails. Frame Extractor eliminates both bottlenecks by mounting your local file via URL.createObjectURL() and synchronizing every seek with HTMLVideoElement.requestVideoFrameCallback() before compositing onto a master HTMLCanvasElement.toBlob() surface.

Unlike rigid automated indexers that force you to accept every sampled frame, our interactive workflow lets you combine batch interval sampling (see our Extract Frames Every Second tool) with manual Frame-by-Frame Video Viewer stepping and Video Screenshot captures. Once your candidate frames appear in the gallery, toggle individual checkboxes to curate the exact shots you want, choose 3 Columns, 4 Columns, or 5 Columns, toggle Timestamp Watermark, and click Export Contact Sheet.

Video Contact Sheet Layout & Workflow Comparison

Use CaseRecommended GridSampling ModeTimestamp WatermarkBest Format
Director / Client Storyboard Review3 Columns (3×4 = 12 cells)Hand-picked or Fixed Count (12)Enabled (MM:SS.mmm)PNG (Lossless)
Archive & DAM Video Thumbnail Sheet4 Columns (4×4 = 16 cells)Fixed Count (16) or Every 5sEnabled (MM:SS.mmm)JPEG (92% Quality)
Web Animation / Game Sprite Sheet5 Columns (5×N grid)Every N Frames (e.g., every 2f)Disabled (Clean Sprite Grid)WebP or PNG
QA Bug Repro & Forensic Timeline3 or 4 Columns-1/+1 Frame Step + Grab Current FrameEnabled (Exact Milliseconds)PNG (Lossless)

How to Generate a Video Contact Sheet in 3 Steps

01

Load Any Local Video File

Drop an MP4, MOV, WebM, MKV, AVI, or M4V video of any size. Zero-copy local streaming opens multi-gigabyte 4K footage immediately.

02

Extract or Grab Your Frames

Extract a fixed count (e.g., 12 or 16 frames), sample every N seconds, or step frame-by-frame and click Grab Current Frame.

03

Pick Columns & Export Grid

Choose 3, 4, or 5 Columns, toggle Timestamp Watermark, and click Export Contact Sheet to save the composite image.

Real Production Workflows & Practitioner Notes

Commercial Edit Approval · 4-Column Timestamped Sheet

"Agency producers hate scrubbing through a 90-second rough cut just to reference three lighting notes. I sample 20 frames across the spot and click Export Contact Sheet with 4 columns and burned-in millisecond timestamps so everyone on the call can say 'look at tile #14 at 00:38.200'."

Clara Moreau, Commercial Offline Editor
Archival Video Cataloging · Media Library Index

"We index hundreds of hours of municipal tape transfers on local workstations. Generating a 5-column contact sheet PNG per file gives our catalogers a visual contents page stored right next to each MP4 on the NAS."

Arthur Pendelton, Digital Media Archivist

Video Contact Sheet Generator FAQ

How is the video contact sheet grid interval calculated?

You can either sample frames every N seconds (e.g., every 1s or 5s), every Nth frame, or specify a fixed total frame count (such as 12, 16, or 24 frames). In Fixed Count mode, Frame Extractor divides the total video.duration evenly across your chosen count so the 3, 4, or 5-column storyboard grid covers the entire timeline from start to finish.

Does the contact sheet generator guarantee zero skipped frames on VFR videos?

Yes. Frame Extractor uses Frame-Exact Hardware-Accelerated Decoding (WebCodecs / requestVideoFrameCallback + Deterministic PTS Frame-Lock, Zero Frame Drops across CFR & VFR videos) so every cell in your contact sheet or sprite sheet reflects the exact Presentation Timestamp (PTS) with zero duplicated or blank thumbnails.

Which video containers and codecs are supported for storyboard sheets?

We support the full container and codec matrix: MP4, MOV (QuickTime/iPhone), WebM, MKV, AVI, and M4V encoded in H.264/AVC, H.265/HEVC (8-bit and 10-bit), VP9, AV1, and Apple ProRes.

Can I toggle millisecond timestamp watermarks on or off in the exported grid?

Yes. In the Contact Sheet toolbar above the extracted gallery, toggle the Timestamp Watermark checkbox to stamp high-contrast monospace MM:SS.mmm timecodes in the bottom-right corner of each panel, or uncheck it to export a clean sprite sheet.

Is there a 200 MB or multi-GB (No Server Upload Size Limit) upload limit when creating a 4K contact sheet?

No. Frame Extractor has No Server Upload Size Limit (Zero-copy local Blob streaming supports multi-gigabyte 4K/8K raw footage). Your video stays on your local disk and renders directly onto an offscreen HTML5 Canvas.

Can I hand-pick which frames appear in my exported contact sheet?

Yes. After extracting a batch of frames or grabbing individual stills with Grab Current Frame, simply check or uncheck any frame card in the gallery (Shift-click supported) and click Export Contact Sheet to composite only your selected frames.

Deterministic Frame-Lock, Boundary Math & Contact Sheet Specifications

1. Frame-Lock Verification Pipeline: HTMLVideoElement.requestVideoFrameCallback((now, metadata) => ...) verifying metadata.mediaTime and metadata.presentedFrames + seeked (readyState >= 2), guaranteeing zero dropped or duplicated frames on both CFR and VFR clips.
2. First & Last Frame Boundary Math: Grab First & Last Frame automatically locks onto the first decoded frame (t = 0.000s, metadata.presentedFrames >= 1) and the last non-black frame (Math.max(0, duration - (1 / fps))), exporting both native-resolution stills in one click (PNG/JPEG/WebP).
3. Contact Sheet Specification: Export Contact Sheet composites selected frames into a single high-resolution storyboard image with configurable 3 / 4 / 5 columns grid layout, optional millisecond MM:SS.mmm timestamp watermarks, and direct PNG/JPEG download.

Popular Video Frame Extraction Tools

Specialized Workflows

Frame-Lock Verification Pipeline: HTMLVideoElement.requestVideoFrameCallback((now, metadata) => ...) verifying metadata.mediaTime and metadata.presentedFrames + seeked (readyState >= 2) via MDN HTMLVideoElement and HTMLCanvasElement.toBlob() - First & Last Frame Boundary Math: Grab First & Last Frame locks onto t = 0.000s (metadata.presentedFrames >= 1) and Math.max(0, duration - (1 / fps)). Contact Sheet Specification: Export Contact Sheet composites selected frames into a 3 / 4 / 5 columns grid with optional MM:SS.mmm timestamp watermarks and direct PNG/JPEG download.