Video Frame Extractor - Extract Frames & Video Thumbnails
Pricing
from $0.56 / 1,000 frame extracteds
Video Frame Extractor - Extract Frames & Video Thumbnails
Extract frames from video and make video thumbnails: screenshot frames from a direct MP4 URL every N seconds, N evenly spaced, or at scene changes. JPG/PNG output, optional contact sheet, one dataset row per frame. $0.0008 per frame.
Pricing
from $0.56 / 1,000 frame extracteds
Rating
0.0
(0)
Developer
Penny Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Share
Video Frame Extractor & Contact Sheet
Turn video file URLs into still images. Pick a mode: a frame at N-second intervals, N evenly spaced frames, or a frame at each scene change. Each frame is saved as JPG or PNG with a public URL, and you get one dataset row per frame (video URL, timestamp, frame URL, width, height). Optionally get a contact sheet (one grid image per video).
You are charged only for frames that were extracted and saved. Failed downloads, undecodable files and videos with no frames found are free, and so is the contact sheet.
Not supported: YouTube, Vimeo, TikTok or other page links. Link the video file itself (mp4, webm, mov, mkv ...). Only use videos you have the right to process.
Input example
{"videoUrls": ["https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4"],"mode": "interval","intervalSeconds": 2,"format": "jpg","contactSheet": true,"maxCostUsd": 0.5}
| Field | Meaning |
|---|---|
videoUrls | Direct http(s) links to video files (required). |
mode | interval (default), count, scene or timestamps. |
timestamps | Exact times to grab: seconds (1, 3.5) or mm:ss / hh:mm:ss. Filling it switches to exact-timestamp mode. |
startTime / endTime | Window for interval and count modes (seconds or hh:mm:ss). |
intervalSeconds | Mode interval: seconds between frames (default 10). |
frameCount | Mode count: evenly spaced frames per video (default 8). |
sceneThreshold | Mode scene: 0.3 default. Lower finds more cuts. |
format | jpg (default) or png. |
maxWidth | Scale down frames wider than this (default 1280). Never scaled up. |
maxFramesPerVideo | Upper limit in any mode (default 100). |
contactSheet | Also save a grid image per video (free). |
downloadZip / maxZipMb | Also save all frames of the run as one frames.zip (free); URL in zipUrl on every frame row and in the run output. Frames beyond maxZipMb (default 100) are left out of the ZIP only. |
maxCostUsd | Optional spending cap: the run stops once that many frames are extracted. |
Output
One dataset row per frame:
{"videoUrl": "https://example.com/clip.mp4","status": "ok","type": "frame","timestampSec": 2,"frameUrl": "https://api.apify.com/v2/key-value-stores/<id>/records/v1-t2000.jpg","width": 960,"height": 540,"durationSec": 5.06}
The contact sheet is a row with type: "contact-sheet". Failed or skipped videos get a row with status: "error" or "skipped" and the reason; they are never charged. A SUMMARY record in the key-value store lists videos, frames and cost.
Pricing (pay per event)
| Event | Price |
|---|---|
frame-extracted: one frame saved with a public URL | $0.0008 |
100 frames cost $0.08. Apify's standard platform usage rules apply on top of the event price as shown in the Console. A frame is charged only after it is saved.
Notes
- Interval and count modes seek to each timestamp, so frames are exact to the nearest decodable frame. Scene mode uses ffmpeg's scene score (
select=gt(scene,X)); tunesceneThresholdfor your footage. If none is found the video is reported as failed and not charged. - Private network addresses are blocked. Files up to 1.5 GB. Frame URLs live in the run's key-value store and follow your Apify storage retention.
- Built with ffmpeg. This Actor was written with the help of an AI (Claude, by Anthropic). It is not affiliated with any video host.
Switching from another video frame extractor
Paste the input you already use and change only the actor ID. The video link is accepted under any of these keys, as a list, a single string, or {url} objects:
| Other actor's input | Used here as |
|---|---|
videoUrl, url (single link) | videoUrls |
videoUrls, urls, startUrls (list) | videoUrls |
frameCount, intervalSeconds, startTime, endTime, timestamps, maxWidth, sceneThreshold, contactSheet | same names here |
Input is compatible; output rows use this actor's own field names (videoUrl, frameUrl, timestampSec), so check your downstream mapping once. Direct video file links only.
Related actors
- Audio Transcriber: transcribes the audio track of the same video.
- Shot PDF: captures web pages rather than video files.
- Website Image Extractor: collects the images on a page, for when the source is a site rather than a video.
Every frame row also carries the video's durationSeconds, width, height, fps and videoCodec (frame pixel size is frameWidth/frameHeight); the SUMMARY record lists them per video under videoMeta.
Use with AI agents (MCP)
Call this actor from an AI agent (Claude, Cursor, or any MCP client) through the Apify MCP server. Add this URL as an MCP server in your client: https://mcp.apify.com?tools=pennydata/video-frame-extractor It exposes this actor as a tool the agent can run with the same input as above. An Apify API token is required. This actor was built with AI assistance.