Extract Frames from Video

Pull still frames out of a video as JPG images in your browser, one every few seconds or a single frame at the timestamp you type. Free, no upload.

🌐 Español

Drop your file here (.mp4, .mov, .m4v, .webm, .mkv, .avi)

🔒 Private by design: your files are processed locally in your browser and never uploaded to any server.

Sampling every few seconds against grabbing one exact frame

The What to extract menu picks between two genuinely different commands, not two flavours of the same one.

A frame every few seconds hands the clip to ffmpeg’s fps filter as fps=1/N, where N is whatever you put in Seconds between frames (interval mode). The filter walks the whole video and emits one image at each step, written out as frame-0001.jpg, frame-0002.jpg and so on. The four-digit padding is there so the stills sort in the same order numerically and alphabetically, which matters the moment you open the archive in a file manager.

One frame at a chosen time builds a much shorter command: seek to your timestamp, take one frame, stop. The seek is placed after the input, which makes it frame accurate rather than a jump to the nearest keyframe. That is the opposite of the choice Trim Video makes, where the seek sits before the input so the cut can be a near instant keyframe jump with no decoding at all. Here accuracy is the whole point: if you type 90, you want the frame at ninety seconds, not whichever keyframe happens to sit before it.

The 300 frame ceiling, and the interval that keeps you under it

Every interval run carries a hard cap of 300 output frames. It exists because nothing else in the command bounds the output: a two hour recording sampled once per second would try to write over seven thousand JPGs into a browser tab’s memory before anything could be downloaded.

The arithmetic for staying under the cap is simple division. A twenty minute clip is 1200 seconds, so four seconds between frames covers it exactly. An hour needs twelve. A five minute clip lands right on the ceiling at one second apart. If you go past the cap the run does not fail, it just stops early, which is easy to miss if you were not counting. If you do not know the duration, Video Info Viewer reports it, and it opens the same MKV and AVI containers this tool accepts.

The interval field is also clamped before it ever reaches ffmpeg. Anything above zero but under half a second becomes half a second, and anything over 600 becomes 600. A zero or negative box quietly becomes one second rather than dividing by nothing, and a box you clear falls back to that same one second, because one second is what the field starts at.

Running an extraction, option by option

  1. Drop your video on the panel or press Choose a file. MP4, MOV, M4V, WEBM, MKV and AVI are all accepted.
  2. Set What to extract to A frame every few seconds for coverage, or One frame at a chosen time for one specific moment.
  3. Fill in the field that belongs to your mode: Seconds between frames (interval mode), or Timestamp in seconds (single-frame mode), where 90 means one minute thirty. The other field is simply ignored.
  4. Leave JPG quality on Balanced (good quality, smaller) unless you plan to crop or edit the stills afterwards.
  5. Press Extract Frames from Video and let the progress bar run.
  6. Download the result, then press Process another if you want a second pass at a different interval.

High, Balanced and Small on the JPG quality scale

The three quality choices are not percentages. They map onto ffmpeg’s -q:v scale for JPG, which runs from 2 at the top to 31 at the bottom, and the tool uses 2 for High, 5 for Balanced and 10 for Small. Balanced is the default because a frame destined for a thumbnail or a contact sheet gains very little from the top setting and costs noticeably more disk.

What no setting can do is add detail that the video never stored. A still is a decoded frame of an already compressed stream, so blocking, banding and baked in motion blur come along for the ride. Why Video Re-encoding Loses Quality covers where that damage comes from; the short version is that High only stops the JPG stage from adding more of it.

The names you get back, and when the archive is skipped

An interval run on holiday.mp4 that produces several frames gives you holiday-frames.zip. The archive is written with the stored method rather than deflate, because JPGs are already compressed and squeezing them again would burn time for nothing. If the run produced exactly one frame, you get holiday-frame-0001.jpg on its own instead.

Single frame mode names the file after the moment it came from, so a grab at ninety seconds arrives as holiday-frame-90s.jpg and one at the very start as holiday-frame-0s.jpg.

If a sampling run finds no frames at all, the module raises a specific complaint about it, but the panel replaces every failure with the same neutral sentence. The real message goes to the browser console, so that is where to look when a run stops without an obvious reason.

Turning the extracted stills back into something

Frames are rarely the finished product. Unzip the archive and the JPGs inside are exactly what Make a GIF from Photos accepts; just add them in numeric order, because that tool animates photos in the order they were added rather than by file name. For a thumbnail, one good still plus Crop Images at 16:9 gets you most of the way there in two passes.

Working the other way round also helps. If you only need frames from one section of a long recording, and the source is one of the four containers the trimmer takes (MP4, MOV, M4V or WEBM), cutting first is free, since that tool copies the streams instead of re-encoding them, and it leaves the sampling run far less footage to decode. An MKV or AVI recording has to be sampled whole, so reach for a longer interval there instead.

Frequently asked questions

Does interval mode always hand me a ZIP?

Almost always, but not quite. When the sampling run produces two or more frames they are bundled into one archive named after your video, with "-frames.zip" on the end. When it produces exactly one frame, which happens on a clip shorter than the interval you chose, that lone JPG is returned on its own instead of being wrapped in an archive.

What happens if I clear the timestamp box before extracting?

An empty box counts as no value given, so the run falls back to the five seconds the field starts with. A negative number does the same, because the parser treats anything below zero as invalid. If you want the opening frame, type a zero rather than clearing the field, because zero is a legal timestamp and gives you the very first frame, in a file ending in "-frame-0s.jpg".

Can I pull frames out of an MKV or AVI recording?

Yes. The dropzone accepts MP4, MOV, M4V, WEBM, MKV and AVI, which is a wider list than most tools here take, because the extraction never has to write a video container back out. Drop anything else and the panel refuses it by name and prints the accepted extensions instead of starting a run.

How do I get more than 300 stills out of one recording?

Run the tool more than once. The frame cap applies per run, so the practical route is to cut the source into shorter pieces first, then sample each piece at the interval you actually wanted. Raising the interval is the other option, and it is the right one when even coverage matters more than density.

Why do the stills look softer than the video did while playing?

Three things stack up. Most frames in a compressed video are stored as differences from a neighbour rather than as complete pictures, fast motion gets blurred into the frame at capture time, and the still is then written out as a JPG, which is its own lossy pass. Picking High quality removes the third of those, and choosing a calmer moment removes the second.

If I press Cancel halfway through, do I keep the frames already decoded?

No. Cancel shuts down the WebAssembly engine and empties the panel, and the sampled images only ever leave the engine once the whole command has finished, so a stopped run leaves you with nothing to download. Start again with a larger interval if the run was going to take longer than you wanted.

Related tools