Video Frame Extractor: Frames, Keyframes & Scenes for AI Vision
Pricing
$1.50 / 1,000 frame extracteds
Video Frame Extractor: Frames, Keyframes & Scenes for AI Vision
Extract frames from video files for AI vision (GPT-4o, Claude, Gemini): every N seconds, N evenly spaced, scene-change keyframes or exact timestamps. JPG/PNG/WebP, base64 or URLs, contact sheet, timecodes. Video to images, $1.50 per 1,000 frames.
Pricing
$1.50 / 1,000 frame extracteds
Rating
0.0
(0)
Developer
Kevin
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Extract frames from video and turn video into images for GPT-4o, Claude, Gemini or any vision model. Turn a video file into the few images an AI vision model (GPT-4o, Claude, Gemini, a local VLM) needs: a frame every N seconds, N evenly spaced frames, a frame at each scene change, or the frames at exact timestamps. You get JPG, PNG or WebP files with links (or base64), a contact sheet (one grid image with timecodes), and metadata for every frame and video.
Who is it for
- AI / LLM developers who need to send a video to a vision model that accepts images only (video to images for GPT-4o, Claude vision, Gemini).
- Content and QA teams who want a storyboard, thumbnails or a contact sheet of a video.
- Data teams building image datasets or video search indexes from their own footage.
- No-code users (Make, Zapier, n8n) who need frames without running ffmpeg themselves.
Quick answers
-
How do I extract frames from a video? Give the actor a direct video file link, choose a mode (every N seconds, N frames, scene changes, or exact timestamps) and run. You get images plus timecodes.
-
How do I give GPT-4o or Claude a video? Use
countmode with 8-20 frames and switch on Include base64: each item then carries the image ready for a vision API call. The actor does not call any AI model itself. -
Price: $1.50 per 1,000 frames ($0.0015 per frame). Contact sheets, metadata, base64 and scene detection are included. Videos that fail (bad link, too big, not a video) are not charged. Apify also charges a tiny Actor-start fee.
-
What can I give it? Direct links to video files (.mp4, .webm, .mov, .mkv, .avi, .m4v, .ts), a video you upload in the Apify console, or video files stored in an Apify key-value store.
-
YouTube, TikTok, Instagram, Facebook, X, Vimeo? No. Their terms forbid downloading, so this Actor reads direct file links only and rejects those pages with a clear message. Use your own files, your own storage (S3, R2, a CDN), or videos you have the right to process.
-
Which modes?
interval(every N seconds),count(N evenly spaced frames),scenes(shot changes, with the ffmpeg scene score on each frame),timestamps(exact times:90,1:30,00:01:30.250,1m30s). -
How accurate are timestamps? You get the frame that is on screen at that time (the last frame at or before it). Tested against videos where each second has its own colour.
-
Limits (change them in the input): 30 min per video, 500 MB per video, 100 frames per video, 1,000 frames per run. Over a limit the video fails with a message that names the setting; nothing is charged.
-
Typical speed: a 60-frame run on a 1-minute 720p video takes about 3 s; 20 frames from a 10-minute video about 2 s (on a fast desktop, see TESTING.md). Scene detection reads the whole video once (about 12 s for 10 minutes of 720p).
-
Max cost control: set Apify's maximum cost per run; the Actor stops at that many frames and says so in the summary.
What you get
One dataset item per frame:
{"videoIndex": 1,"source": "https://example.com/clip.mp4","frameIndex": 2,"timestampSeconds": 2.085,"timecode": "00:00:02.085","mode": "count","sceneScore": null,"width": 960,"height": 540,"format": "jpg","mimeType": "image/jpeg","sizeBytes": 26109,"imageKey": "video-001-frame-0003-t00002085.jpg","imageUrl": "https://api.apify.com/v2/key-value-stores/<id>/records/video-001-frame-0003-t00002085.jpg","contactSheetUrl": "https://api.apify.com/v2/key-value-stores/<id>/records/video-001-contact-sheet.jpg","video": {"durationSeconds": 5.005, "fps": 29.97, "width": 960, "height": 540, "codec": "h264", "bitrate": 1785756, "container": "mov", "hasAudio": true, "sizeBytes": 1128375}}
imageUrlpoints to the file in the run's key-value store (it is also listed in the run's Output tab). Turn on Include base64 to getimageBase64plusmimeTypein the item, ready for a vision API call.sceneScoreis the ffmpeg scene-change score (0-1) in scenes mode; the opening frame hasnull.- The run summary (
OUTPUTrecord) lists every video with status, errors and warnings, metadata, the contact sheet link, and timings.
How to use
- Click Start with the prefilled example (a 5-second CC0 clip, 6 frames in about a second), or paste your own direct video links.
- Pick What to extract, set size and format, run.
- Read the images from the Output tab, export the dataset, or call the API.
Example 1: 12 frames to summarise a video with a vision model
{ "videoUrls": ["https://example.com/demo.mp4"], "mode": "count", "frameCount": 12, "maxWidth": 1024, "includeBase64": true }
Example 2: a storyboard from scene changes, WebP, one contact sheet
{ "videoUrls": ["https://example.com/ad.mp4"], "mode": "scenes", "sceneThreshold": 0.3, "imageFormat": "webp", "maxFramesPerVideo": 40 }
Example 3: one frame per second between 1:00 and 2:00
{ "videoUrls": ["https://example.com/lecture.mp4"], "mode": "interval", "intervalSeconds": 1, "startTime": "1:00", "endTime": "2:00" }
Example 4: exact timestamps from a file in your key-value store
{ "sourceKeyValueStoreId": "my-videos", "sourceKeys": ["meeting.mp4"], "mode": "timestamps", "timestamps": ["0:30", "12:05.5", "1h2m3s"] }
Use cases
- Video to images for AI vision: 8-20 evenly spaced frames summarise most videos for a vision model.
- Scene-change keyframes: one frame per shot, with the scene score, for storyboards and video indexing.
- Extract a frame every second:
intervalmode withintervalSeconds: 1for OCR, slide capture or lecture frames. - Frame at an exact timestamp:
timestampsmode, e.g.1:30or1m30s, to grab the moment a user reported. - Video contact sheet: one grid image with timecodes per video for a quick visual overview.
Input options
| Field | What it does |
|---|---|
videoUrls, uploadedVideo, sourceKeys (+ sourceKeyValueStoreId) | Where the videos are. Direct file links only. |
mode | interval, count, scenes or timestamps. |
intervalSeconds, frameCount, timestamps | Settings for those modes. |
sceneThreshold, minSceneGapSeconds, includeFirstFrame, fastSceneScan | Scene mode: sensitivity (0.2 sensitive, 0.4 hard cuts only), minimum gap between cuts, keep the opening frame, keyframe-only scan (faster, may miss cuts between keyframes). |
startTime, endTime | Work on part of the video (interval, count, scenes). |
imageFormat, imageQuality, maxWidth, maxHeight | jpg/png/webp, quality 1-100, shrink to fit (never enlarges). Default 1280 px wide. |
skipBlankFrames | Step past black or pure-white frames (fade-ins, black intros). |
contactSheet, contactSheetColumns | One grid image per video (up to 100 frames). |
includeBase64 | Add the image as base64 to each item. |
maxFramesPerVideo, maxTotalFrames, maxDurationMinutes, maxVideoSizeMb, downloadTimeoutSecs | Safety limits. |
Good to know
- The whole file is downloaded first (up to your size limit), then frames are decoded locally. Rotation metadata and non-square pixels are handled, so frames come out upright and undistorted.
- Scenes mode reads every frame once. If a video has fewer cuts than the frame cap you get all of them; with more, the strongest cuts are kept.
- Links must be public. Pre-signed URLs work. Pages that need a login, and private or local network addresses, are rejected.
- Not affiliated with ffmpeg, YouTube or any video platform. Only process videos you have the right to use.
Pricing
Pay per event: $0.0015 per frame returned (one dataset item), about $1.50 per 1,000. Nothing is charged for videos that fail. You can cap spend with the maximum cost per run.