Professional motion pipelines rarely stop at a single codec. Editors export **ProRes** or **H.264** for review, compositors need **numbered stills** for roto and match-move, machine-learning teams ingest **frame folders** for labeling, and time-lapse creators sometimes want **JPEG archives** they can grade before re-encoding. A **video-to-image-sequence** step sits in the middle: deterministic files, predictable naming, and tooling that understands **time ranges** and **sampling rates** instead of forcing you to screenshot manually.
SynthQuery’s **Video to JPG Sequence** tool on **/video-to-jpg-sequence** performs that conversion **entirely in your browser**. You upload **MP4**, **WebM**, or **MOV** (typical browser-supported paths); the page loads duration metadata, lets you choose **start and end** times on sliders, and either samples at **1, 5, 10, 24, or 30 frames per second** or attempts **every decoded frame** during controlled playback when **requestVideoFrameCallback** is available—with a **30 fps seek fallback** when it is not. Each exported still is encoded with the **JPEG quality** you set, named in the industry-familiar **frame_001.jpg / frame_002.jpg** pattern, and packaged into a **ZIP** you download locally. **No video bytes are uploaded** to SynthQuery servers for the conversion itself: decoding, canvas rasterization, and archiving run in-tab, which aligns with policies that treat footage as confidential.
What this tool does
**Time-range isolation** is the first productivity win. Instead of exporting an entire hour-long interview when you only need ten seconds for a style frame, you set **start** and **end** in seconds with sub-frame slider steps. The tool clamps values to **[0, duration]** and normalizes inverted pairs, so QA spreadsheets stay aligned with the on-screen readout of **window length**.
**Sampling modes** split into two philosophies. **Fixed FPS** uses deterministic **seek** sampling: the engine steps the media clock to **t = start + k / fps** until it reaches **end**, captures each raster via **Canvas**, and encodes **JPEG** with your quality parameter. That path is predictable, works across browsers that lack advanced frame callbacks, and makes **frame counts** easy to calculate ahead of time. **All frames** prefers **requestVideoFrameCallback** while the clip **plays** from your start marker: each callback corresponds to a presented frame the compositor decoded, which closely matches **native frame cadence** when codecs and hardware behave cooperatively. If that API is missing, the tool transparently falls back to **30 fps** seek sampling and documents the behavior inline so expectations stay honest.
**Naming and packaging** follow pipeline conventions: inside the ZIP, files are literally **frame_001.jpg** and **frame_002.jpg** style names, zero-padded to three digits—enough for sequences under a thousand frames per export, matching many tutorial defaults. The outer archive name derives from a **sanitized basename** of your upload plus a **-jpg-sequence** suffix, reducing collisions when you batch-download multiple shots in one session.
**Quality control** maps directly to the browser’s **canvas.toBlob** JPEG encoder. You see a live **percent readout** (60–100%) and the estimate panel reacts when you move the slider because the sampler re-encodes a preview frame at the **range start**. **Frame and byte estimates** help you decide whether to narrow the window or drop quality before committing RAM to hundreds of blobs.
**Accessibility and responsiveness** lean on labeled sliders, **Select** components from the design system, **aria-live** loading states on the dynamic import shell, and **keyboard-activatable** drop zones consistent with other SynthQuery utilities.
Technical details
Frame extraction uses the **HTMLVideoElement** clock plus **Canvas 2D** rendering: for each target time, the tool sets **currentTime**, awaits the **seeked** event with a timeout guard, draws the decoded bitmap to an offscreen canvas sized to **videoWidth × videoHeight**, and calls **toBlob** with **image/jpeg** and your quality argument. Dimensions must stay within SynthQuery’s shared **maximum canvas edge** guard used across imaging utilities; extremely large frames fail fast with a clear error rather than exhausting GPU memory.
**requestVideoFrameCallback**, when present, schedules a callback aligned with **presented frames** during **playback**, which often tracks the underlying frame rate more faithfully than uniform seeks on **GOP-structured** codecs—though browsers may still **drop or duplicate** frames under load, so treat outputs as **preview-faithful** rather than **bit-exact** versus professional desktop demuxers. **JPEG** is always **8-bit** and **lossy**; partial transparency in exotic pixel formats is flattened as the canvas dictates—typically **opaque** video planes.
ZIP archives are built with **JSZip** in the browser; compression defaults balance CPU time against size. Filename padding uses **three digits**; exports beyond **999 frames** in one run hit the tool’s **frame cap** first, encouraging shorter ranges or offline **FFmpeg** for massive batches.
Use cases
**Animation and motion-design workflows** often need reference stills on a predictable grid. Exporting a **24 fps** slice gives key poses every ~42 ms without opening a heavyweight NLE; storyboard artists can print contact sheets after dropping the ZIP into InDesign or Figma plugins.
**Compositing and VFX** teams sometimes ingest **JPEG** proxies before committing **EXR** pipelines. A trimmed **MP4** plate becomes a **numbered folder** that slots into **Nuke** or **Fusion** readers, especially when upstream only delivered H.264 screeners.
**Time-lapse and science outreach** projects benefit from **1 fps** or **5 fps** exports when the original capture oversampled the phenomenon—think cloud decks, microscopy screen recordings, or dashboard demos where every frame is redundant.
**Machine-learning and data labeling** groups frequently want **uniform sampling** plus **deterministic ordering**. Fixed FPS exports make it straightforward to pair **frame_NNN.jpg** with annotation JSON keyed by index, while **all-frame** mode helps when temporal super-resolution or optical-flow trainers need the densest lawful sampling the browser can expose.
**Stop-motion digitization** sometimes starts as a phone **MOV**; extracting **all frames** yields the individual photographs that were stitched into video, which archivists can rename or ingest into DAM systems without re-photographing physical reels.
**Education** scenarios—coaching, sports analysis, dance notation—use **range sliders** to isolate a single maneuver, export **10 fps**, and drop stills into slide decks with **readable filenames** students can reorder manually.
How to use this tool effectively
Start from footage you are **legally and contractually allowed** to process; local tools do not bypass licensing, talent releases, or workplace media rules. On a laptop or phone, open **/video-to-jpg-sequence** and load the page fully so scripts and the **JSZip** chunk can resolve—mobile networks may take a moment on first visit.
Use the dashed **drop zone** or the hidden file picker to select **one video** at a time. Accepted containers map to what browsers generally decode: **MP4** (often H.264 or compatible), **WebM** (VP8/VP9/AV1 depending on the browser), and **QuickTime MOV** when the underlying codec is supported. If the file exceeds the posted size limit, trim in an editor first or transcode to a smaller mezzanine. After selection, an off-screen **video element** receives an object URL; when **loadedmetadata** fires, the UI shows **duration** and initializes **start** at zero and **end** at the full length.
Drag the **start** and **end** sliders to isolate a sub-range—useful for commercials where only a three-second hero moment needs stills, or for trimming leader frames. The interface keeps **start ≤ end** automatically so you do not accidentally invert a window. Open the **frame rate** control next: pick **1 fps** for sparse storyboards, **10 fps** for lightweight motion reference, **24** or **30** for editorial density, or **All frames (playback decode)** when you need maximum temporal resolution and your browser exposes **requestVideoFrameCallback**. Choose **JPEG quality** with the slider: higher values preserve gradients and skin tones; lower values shrink archives for quick drafts.
Before exporting, read the **frame count estimate** and **approximate ZIP size**—they derive from a **single sample encode** at your quality setting multiplied by the expected frame count, plus a small ZIP overhead allowance. Press **Download ZIP**; a progress indicator advances through seeks or playback captures. When complete, unzip locally and point After Effects, Blender, Python scripts, or dataset tools at the numbered sequence. Remove the source video from shared machines when finished and revoke any stray object URLs by navigating away.
Limitations and best practices
Browser decoding is not a substitute for **color-managed** DI suites: **gamma**, **matrix**, and **limited/full range** tags may not match desktop players pixel-for-pixel. **HDR** or **10-bit** sources may flatten unpredictably depending on codec support. **All-frames** mode depends on playback scheduling; background tabs, battery saver, and thermal throttling can change which frames surface—prefer **fixed FPS** when you need reproducible counts across machines. Respect copyright, model releases, and export control rules; local processing does not grant redistribution rights. Clear downloads on shared hardware, and avoid syncing sensitive ZIPs to unsecured cloud folders.
Grab PNG or JPEG stills from MP4, WebM, and MOV with stepping, interval extraction, and ZIP—use this page when you want interactive picking rather than a fixed JPG sequence export.
Bring **animated WebP** motion into **GIF89a** for hosts that still require the legacy image-animation MIME type—complements JPG sequences when you need looping motion instead of folders of stills.
Rebuild **animated GIFs** from the JPG sequence you exported here: timeline ordering, per-frame delays, loop metadata, and **gif.js** encoding entirely client-side.
Frequently asked questions
SynthQuery accepts **MP4**, **WebM**, and **MOV** selections that your browser can decode—commonly **H.264** in MP4 or MOV, **VP8/VP9** in WebM, and **AV1** in WebM on newer builds. Exotic codecs (**ProRes RAW**, proprietary camera formats) may fail until transcoded to a web-friendly mezzanine. File size is capped at **two hundred fifty megabytes** per upload to keep RAM predictable; split long captures in an editor if needed.
**Fixed FPS** modes seek the video clock to evenly spaced timestamps—**start + k/fps**—and snapshot each position. That yields **repeatable** frame counts independent of GOP structure. **All frames** tries to capture **every presented frame** during **playback** using **requestVideoFrameCallback** when the API exists, which tracks native cadence closely on many desktops. Without that API, the tool **falls back to 30 fps seeking** and states so on the page. Neither mode guarantees bit-identical output versus **FFmpeg**; browsers may quantize seeks or coalesce paints under load.
**Zero-padded numeric names** sort lexicographically in file managers and align with defaults in **Adobe**, **Blender**, and many **CLI** tools. If you need timecodes in filenames, rename with a script after download—the ZIP intentionally keeps names short and uniform so spreadsheet indices map cleanly to array positions in Python or Node.
The UI multiplies the **byte size of one JPEG**—encoded at your chosen quality from the **first sampled time** in the range—by the **expected frame count**. That ignores scene complexity changes (fast motion may compress worse than static skies) so treat the ZIP line as **±20–40%** on some clips. **All-frames** mode shows an **upper-bound style** count derived from duration × **60 fps** capped by the export limit, because the true count depends on the source frame rate and decoder behavior until playback finishes.
Exports are capped at **two thousand frames** per run to protect memory on laptops and phones. If you exceed the cap, **narrow the time range**, choose a **lower FPS**, or preprocess offline. For cinematic-length captures, batch with **FFmpeg** or similar, then optionally return here for smaller slices.
The slider maps to the browser’s **canvas.toBlob** quality argument between **0.60 and 1.00** (displayed as **60–100%**). That is conceptually similar to **LibJPEG** quality but not numerically identical to Photoshop’s legacy scales. Expect **more banding** in gradients at low values and **larger files** near 100%. For archival masters, consider **PNG** workflows elsewhere; JPEG here targets **portable, compact** sequences.
The conversion path uses **object URLs** and **in-memory blobs**; frames and ZIP bytes stay in your tab unless you save them locally. Network operators can still see that you visited the site, and browser extensions could inspect page memory—so treat the environment like any other sensitive workstation. **Clear the file** with the Remove control when you are done on shared machines.
**MOV** is a container, not a codec. If the track uses **HEVC**, **ProRes**, or another profile your browser lacks, **loadedmetadata** may never become usable or **decode error** events fire. **Transcode to H.264** or **VP9** with mainstream **AAC/Opus** audio stripped if unnecessary, then retry. Screen recordings from iOS often work because they default to **H.264**, but professional camera dumps may not.
Yes—use SynthQuery **GIF from Photos** to load the exported stills, set **per-frame delays** to match your original timing (for example **1000/24 ms** for 24 fps uniform spacing), and encode with **gif.js**. Remember **GIF** palettes are limited to **256 colors** and loops use **GIF89a** timing semantics, so previews may differ from the source video’s color science.
Browser tabs have **practical RAM ceilings**; a thousand high-resolution JPEGs can stress **8 GB** machines. Prefer **SSD** destinations, avoid keeping dozens of giant ZIPs open simultaneously, and **extract** archives promptly to a structured folder such as **shot_010/frames/**. For cloud sync, encrypt sensitive footage before uploading, and verify **checksums** if pipelines depend on exact bytes.
Video to JPG Sequence - Free Online Video Frame Export Tool
Export MP4, WebM, or MOV as numbered JPEG stills: full clip or time range, every frame (when supported) or fixed 1–30 fps sampling, quality slider, frame count & ZIP size hints—Canvas + JSZip in your browser (GIF-009).