How to extract frames from a video

Three approaches that all produce identical pixels. The differences are in effort, batching and how easy it is to land on the right frame.

Free toolVideo Frame ExtractorFrame-accurate stills from MP4, WebM and MOV files at true native resolution. Batch export included.Open the extractor

Quick comparison

Browser (floi)ffmpegVLC
Install neededNoneYesYes
Frame-accurateYesYesRoughly
Batch / intervalYesYesYes (awkward)
Visual frame pickingYesNoYes
Output format choicePNG / JPG / WebPAnythingPNG / JPG
Handles any codecBrowser-supported onlyYesYes

1. In the browser

Drop the file into the frame extractor. Your browser decodes it locally. Nothing uploads, so even a 10 GB file opens instantly. Scrub to roughly the right place, then step one frame at a time with the arrow keys and press C.

Best when you need to see the frame you are choosing. Limited to codecs your browser can play, which in practice means H.264 MP4, VP9/AV1 WebM and most MOV files. MKV and AVI usually will not open.

2. ffmpeg

The precise, scriptable option. The commands worth knowing:

One frame at a timestamp

ffmpeg -ss 00:01:23.500 -i input.mp4 -frames:v 1 -q:v 2 out.jpg

-ss before -i seeks by jumping to the nearest keyframe first, which is dramatically faster on long files. Add -accurate_seek to keep it exact.

Lossless PNG instead

ffmpeg -ss 00:01:23.500 -i input.mp4 -frames:v 1 out.png

One frame every N seconds

ffmpeg -i input.mp4 -vf fps=1/5 frame_%05d.png

fps=1/5 means one frame every five seconds. fps=2 means two per second.

Only the scene changes

ffmpeg -i input.mp4 -vf "select='gt(scene,0.4)'" -vsync vfr shot_%03d.png

Excellent for building a shot list. Raise the threshold to catch fewer cuts.

A contact sheet

ffmpeg -i input.mp4 -vf "fps=1/60,scale=320:-1,tile=4x4" sheet.png

3. VLC

Already installed on a lot of machines. Play the video and press Shift + S (Windows/Linux) or Cmd + Alt + S(macOS) to drop a snapshot into your Pictures folder.

For a series, use Tools → Preferences → Video → Filters → Scene filter. It works, but the configuration is buried and frame-stepping only moves forward.

Things that quietly cost you quality

  • Screenshotting the player instead of extracting. A screenshot is capped at your display resolution; extraction gives you the video's real resolution.
  • Saving to JPG by habit. The frame already carries the video codec's artefacts. A JPG re-encode stacks a second set on top.
  • Trusting a fixed 1/30s step. On 24, 25, 50 or 60 fps footage that lands between frames. Detect the real rate. floi shows it next to the timecode.
  • Extracting every frame when you wanted a sample. One minute of 4K at 30fps is 1,800 PNGs and tens of gigabytes.

Frequently asked questions

Does extracting a frame lose quality?

The decode itself is lossless. You get exactly the pixels the codec produced. Quality is lost only in how you save it. Export to PNG and the frame is preserved exactly; export to JPG and you add a second generation of compression on top of the video's existing artefacts.

What is the best format for extracted frames?

PNG when the frame will be edited, printed or archived. JPG at 90–95% when you just need to share it and file size matters. WebP splits the difference, at roughly 30% smaller than JPG for the same visual quality.

How do I extract every frame of a video?

With ffmpeg: ffmpeg -i video.mp4 frame_%%05d.png. Be careful. One minute of 30 fps footage is 1,800 images, and at 4K that is tens of gigabytes. Extracting at an interval is almost always what you actually want.

Why do browser tools miss the exact frame sometimes?

Because seeking is asynchronous. If you draw to a canvas immediately after setting currentTime, the decoder may still be presenting the previous frame. floi waits for the decoder to confirm it has presented the new frame before reading any pixels.

move openesc close