How to extract photos and frames from a video
Pull a still from a video — on iPhone, Android, in DaVinci Resolve, with FFmpeg, or from a YouTube URL. The right tool depends on whether you want one frame or every frame.
"Extract a photo from a video" usually means one of two things: capture a single frame at a specific moment, or batch-export every frame for analysis. Different tools handle each well.
iPhone, single frame
Photos app: open the video, scrub to the frame, screenshot. The screenshot lives in your camera roll at the resolution of the video, not your screen — you don't lose quality unless the video was 4K (in which case the screenshot tops out at the screen resolution).
For full-resolution single-frame export from a 4K iPhone video, AirDrop the video to a Mac and use QuickTime → Edit → Copy at the right scrub point, then Edit → Paste into Preview.
Android, single frame
Google Photos has a built-in frame export: open the video, tap the three dots → Export frame. Output is at video resolution.
macOS / Windows, single frame
VLC: Video → Take Snapshot at the right moment. Saves to the snapshots folder configured in Preferences. Format and size are configurable.
QuickTime on Mac: Edit → Copy at the playhead, paste into Preview as new from clipboard.
FFmpeg: every frame, scripted
The reference command-line tool. Single frame at a specific second:
ffmpeg -ss 00:01:23 -i video.mp4 -frames:v 1 frame.png
Every frame as PNG (warning: this fills your disk fast on long videos):
ffmpeg -i video.mp4 frame_%04d.png
One frame per second (good for analysis):
ffmpeg -i video.mp4 -vf fps=1 frame_%04d.png
Keyframes only (much smaller batch, only the I-frames):
ffmpeg -skip_frame nokey -i video.mp4 -vsync vfr -f image2 keyframe_%03d.png
DaVinci Resolve
On the timeline, position the playhead at the frame you want, right-click → Grab Still. The still appears in the Stills gallery in the Color page. Right-click → Export sends it to disk at full resolution. Free version supports JPEG and PNG; Studio adds DPX and EXR.
From a YouTube URL
yt-dlp -x doesn't extract frames, but yt-dlp combined with FFmpeg does. Pull the video first (yt-dlp "https://youtube.com/watch?v=..."), then run FFmpeg against the local file. There's no clean way to extract a frame without downloading at least the segment that contains it.
Choosing the output format
PNG for analysis and archival — lossless, larger files. JPEG for thumbnails and quick review — 5–10× smaller at -q:v 2, good enough to eyeball. Match the format to what happens to the frame next, not to habit:
ffmpeg -i video.mp4 -vf fps=1 -q:v 2 thumb_%04d.jpg
The -q:v scale runs from 2 (best) to 31 (worst) for JPEG output. If the frames feed an OCR or extraction step, stay with PNG — JPEG artifacts around text edges measurably hurt recognition accuracy.
Only the frames that change: scene detection
Dumping one frame per second of a lecture recording gives you hundreds of near-identical shots of the same slide. The select filter with a scene-change threshold keeps only frames where the picture actually changed:
ffmpeg -i video.mp4 -vf "select='gt(scene,0.4)'" -vsync vfr scene_%03d.png
Tune the 0.4 threshold down for subtle changes (slide builds, dashboard updates), or up to skip camera pans and lighting shifts.
Batch: a folder of videos
for f in *.mp4; do mkdir -p "frames_${f%.mp4}" ffmpeg -i "$f" -vf fps=1 "frames_${f%.mp4}/frame_%04d.png" done
One folder of frames per source video, named after the file. On large batches, add -loglevel error to keep the output readable, and run the loop through GNU parallel for a big wall-clock speedup.
Common problems and fixes
- Timestamps land a few seconds off — put -ss before -i (input seeking, fast and accurate with modern FFmpeg) instead of after it.
- Extracted frames look squashed — anamorphic video. Current FFmpeg applies the display aspect ratio automatically; if an older version doesn't, add -vf scale=in_w*dar:in_h,setsar=1.
- A huge PNG batch fills the disk — switch to -q:v 2 JPEG, or drop the filter from fps=1 to fps=1/5 for one frame every five seconds.
- Variable-frame-rate phone videos produce uneven fps=1 output — pre-normalize to constant frame rate with a quick transcode, or accept -vsync vfr and let the timestamps carry the timing.
Which tool for which job
| Job | Tool | Why |
|---|---|---|
| One frame on a phone | Google Photos export frame / screenshot | Zero install, video resolution |
| One frame on desktop | VLC snapshot or QuickTime copy | Fast, no command line |
| Every Nth frame, scripted | FFmpeg with -vf fps=N | Scriptable, reproducible, free |
| Only changed frames | FFmpeg scene detection | Skips redundant near-duplicates |
| Frame from an edit timeline | DaVinci Resolve Grab Still | Full grading-resolution output |
| Frames from a YouTube link | yt-dlp + FFmpeg | Headless, automatable |
Going further: the right frame
If the goal isn't a specific timestamp but "the frame that shows X" — a slide, a scoreboard, a license plate — extract every Nth frame with FFmpeg and then read the stills, rather than scrubbing the timeline looking for the moment. For plain text on screen, an image-to-text pass returns it as text; when the frame is a slide, a table, or a labelled document, the fields matter and a structured extraction is the better fit.
Frequently asked questions
How do I extract a single frame from a video as an image?+
On iPhone, scrub to the frame in Photos and take a screenshot. On Android, use Google Photos → three dots → Export frame. On desktop, VLC → Video → Take Snapshot, or QuickTime → Edit → Copy at the playhead and paste into Preview as a new image.
What is the FFmpeg command to extract every frame from a video?+
ffmpeg -i video.mp4 frame_%04d.png extracts every frame as PNG. For one frame per second use ffmpeg -i video.mp4 -vf fps=1 frame_%04d.png. For just one frame at a timestamp use ffmpeg -ss 00:01:23 -i video.mp4 -frames:v 1 frame.png.
Can I extract data from a video frame image?+
Yes. After extracting frames with FFmpeg or a native tool, upload the still images to ExtractFox's image data extractor. It handles slides, document captures, screenshots of dashboards, and other image-based content.
How do I extract frames from a YouTube video?+
Download the video first with yt-dlp (yt-dlp "https://youtube.com/watch?v=..."), then run FFmpeg against the local file. There's no clean way to extract a frame without downloading at least the segment that contains it.
Should I extract frames as PNG or JPEG?+
PNG for anything that feeds OCR, extraction, or archival — it's lossless. JPEG at -q:v 2 is 5–10× smaller and fine for thumbnails and manual review. The JPEG artifacts around text edges are what hurt downstream recognition.