Video to Images
Extract frames from a video as PNG or JPG images at any frame rate.

Click or drag and drop a video file

MP4, WebM, MOV — any video format

Video & Audio Tools

Video to Images

Extract frames from a video as PNG or JPG images at any frame rate.

Video to Images extracts frames as PNG or JPG at any frame rate (0.5–30 FPS, default 1). Choose Max Width (320–1920, default 640), then Extract Frames. An Hardware-Accelerated alert explains that WebCodecs (via mediabunny) runs locally — keep the tab open and visible.

Parallel Web Workers decode chunks of the timeline while @jsquash WASM encoders write JPEG (quality 75) or PNG frames. Results appear in a thumbnail grid with N frames extracted, then Download ZIP as {basename}.zip of output_0001.jpg-style names.

How it works

Duration is probed via video metadata; the clip splits into time chunks across min(hardwareConcurrency, floor(duration/5)) workers (each chunk ≥5s). Each worker lazy-inits mozjpeg or squoosh PNG WASM, runs mediabunny Conversion with width/fps/trim, draws samples to OffscreenCanvas, and transfers encoded ArrayBuffers zero-copy to the main thread.

Frames merge, sort by index, and renumber gapless. JSZip packs them. Early progress is an indeterminate sliding bar until workers report real percentages; logs show Initializing WASM encoder… and parallel worker counts.

How to use

  1. Open Video to Images and read the Hardware-Accelerated alert.
  2. Drop a video (hint: MP4, WebM, MOV — any video format).
  3. Preview the source; use Remove to change files.
  4. Choose Frame Rate (FPS) — 0.5 to 30 (default 1 = one frame/second).
  5. Choose Format (PNG or JPG) and Max Width (320–1920, default 640).
  6. Click Extract Frames and watch Extracting frames… with elapsed seconds and worker logs.
  7. Review the thumbnail grid and N frames extracted summary.
  8. Click Download ZIP ({basename}.zip) or Start Over.

Tips

  • Frame count ≈ duration × FPS — start with 1 fps on long videos (60s @ 30fps ≈ 1800 frames).
  • JPG is much smaller (fixed quality 75); PNG is lossless via libpng WASM.
  • Parallel workers scale with CPU cores; very short clips run a single worker.
  • Max Width caps output frame width; ZIP falls back to frames.zip if basename is missing.

Video to Images FAQ

Is my video uploaded?

No — decode (WebCodecs/mediabunny), encode (@jsquash WASM), and zipping (JSZip) all happen locally.

Which formats can I extract?

Only PNG or JPG are offered (image/png / image/jpeg).

How many frames will I get?

About duration × FPS; options run 0.5 → 30 with default 1.

Why is early progress a sliding bar without %?

Progress is indeterminate until workers report real percentages (avoids a jarring 100%→N% jump).

What is in the download?

A single ZIP of sequentially named frames output_0001.jpg, output_0002.jpg, … renumbered gapless after merging.

Credits

  • mediabunny — Parallel WebCodecs frame decoding across workers
  • @jsquash — WASM JPEG/PNG encoders for extracted frames
  • JSZip — Bundle frames into one downloadable archive
ShareTweet

Command Palette

Search for a command to run...