Video Frame Extractor — MP4 Frame Extractor & Scene Cuts
Pricing
from $1.50 / 1,000 frames
Video Frame Extractor — MP4 Frame Extractor & Scene Cuts
Video frame extractor, no login: still frames from TikTok, Facebook and MP4 video links, charged per frame delivered. Every N seconds, a set count, each scene cut or the exact times you list — one row per frame with its time, size and an image link in your run's storage.
Pricing
from $1.50 / 1,000 frames
Rating
0.0
(0)
Developer
Steadyfetch Team
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Video Frame Extractor — Frames & Scene Cuts from Any Link
Paste a video link and get its still frames back as image files, one row per frame: every N seconds, a set number spread evenly over the video, one at every scene cut, or at the exact times you list. Works on TikTok and Facebook video links and on any direct video file (.mp4, .mov, .webm, .m3u8) — no login, no cookies, nothing to install. Each row carries the frame's time, its size, the scene-cut score and a link to the image in your run's storage. Click Start with nothing set and you get a sample: five frames of a public-domain film, read live, and nothing is charged for it.
Using an AI agent? Pin this actor in Apify's MCP server with one link: https://mcp.apify.com?tools=steadyfetch/video-frame-extractor
- Actor id:
steadyfetch/video-frame-extractor - Input:
{ "videoUrls": ["https://www.tiktok.com/@tiktok/video/7700680369246358815"], "mode": "scenes" }— the one field you have to set isvideoUrls. - Cap the bill: set
maxTotalChargeUsdon the run (a run option, not Actor input), e.g.1.00— the run takes only the frames that fit. - Price: from $1.50 per 1,000 frames on Gold and above, plus $0.005 per video and $0.004 per started minute of video read; full table below. A video that gives no frame is never charged.
- How often it changes: a published video's frames never change, so a video is read once — run it again only on new links.
Unofficial, not affiliated with TikTok, Meta, Facebook or any site whose videos you read — not endorsed by or sponsored by any of them.
What you get
One row per frame (type: frame).
| Column | What it holds |
|---|---|
videoUrl · videoIndex | the link you gave and its place in your list |
frameIndex · timestampSec · timestampText | the frame's number and its time in the video (timestampText as mm:ss) |
sceneScore | in scenes mode, how strong the cut is (0 to 1); empty in the other modes |
requestedSec | in timestamps mode, the time you asked for that this frame answers |
imageUrl · imageKey · imageBytes | the frame as a jpg (or png) image in your run's storage, and its size |
width · height | the frame's size in pixels (never upscaled) |
durationSec · videoTitle · sourceHost | the video's measured length, its title where the site gives one, and the site |
contactSheetUrl | with the contact sheet on: one grid image of up to 12 of the video's frames, each labelled with its time |
charged · chargedEvents · status · statusReason | on every row, so the invoice reconciles from the dataset |
A video that gives no frame comes back as one row (type: video) saying why — never charged.
Four ways to pick frames
- interval (the default): a frame every
intervalSeconds(1 by default, from 0.2), from the start, until the video ends ormaxFramesPerVideo(30 by default, up to 300) is reached. - count:
frameCountframes spread evenly over the whole video — a quick storyboard of any length. - scenes: the opening frame plus one frame at every scene cut whose change is stronger than
sceneThreshold(0.3 finds the hard cuts of edited video). OvermaxFramesPerVideocuts, the strongest are kept. - timestamps: the first frame at or after each time in
timestamps— seconds (75) or clock times (1:15). A time past the video's end is left out and said on the row.
Frames come at width 360 px (the default), 720 px, or the video's own size (original, up to 1080 px on the short side). Videos up to 30 minutes long.
Your frames are stored with your run
The images are records in your run's own key-value storage, and each row links to its image. Run storage follows your Apify plan's retention: on the Apify free plan your 10 most recent runs are kept for 4 months, and paid plans keep run data for the retention period set on your plan. Download the frames you need before your run's storage expires.
What it costs
| Event | Apify free plan | Bronze | Silver | Gold and above |
|---|---|---|---|---|
| Frame (each frame delivered) | $0.002 | $0.0018 | $0.0016 | $0.0015 |
| Video (each video that delivers a frame) | $0.008 | $0.007 | $0.006 | $0.005 |
| Video minute (each started minute of video read) | $0.005 | $0.0045 | $0.0042 | $0.004 |
Minutes counted: the whole video in count and scenes mode; in interval and timestamps mode, only up to the last frame you asked for (the read stops there). A 75-second video with 10 frames at Gold: $0.005 + 2 × $0.004 + 10 × $0.0015 = $0.028. No start fee. Never charged: a link this actor does not read, a video that cannot be opened or decoded, a page with no video, a video over 30 minutes, a video your account already got the same frames of, videos cut by your own limits or the run clock, and the sample a bare Start returns. Platform usage is included in these prices.
Already delivered, never charged twice
A video your account already got frames of, with the same settings, is skipped and not charged; turn on includeSeen to read it again. The memory lives in your own Apify account (a key-value store named video-frame-extractor-memory). The same video named twice in one run — even as two different links — is read once and charged once.
Input
| Field | What it does |
|---|---|
videoUrls | video links, one per line: TikTok video or share links, Facebook videos and reels, Loom, Wistia, Twitch and archive.org video pages, or any direct video file address |
mode | interval · count · scenes · timestamps |
intervalSeconds · frameCount · sceneThreshold · timestamps | the setting for each mode |
maxFramesPerVideo | the most frames from one video, any mode (30 by default, up to 300) |
width · format | 360 · 720 · original; jpg or png |
includeContactSheet | one labelled grid image per video, no extra fee |
includeSeen | read videos your account already has |
maxRunSeconds | stop after this many seconds; videos not reached get their own uncharged row |
YouTube, Vimeo, Instagram and X pages are not read; a direct file link to the same video works.
As an HTTP endpoint
The same actor answers HTTP requests (Apify Standby): GET https://steadyfetch--video-frame-extractor.apify.actor?videoUrl=<link>&mode=count&frameCount=5 with your Apify token returns the frames as JSON in the same response, each image inline (base64), charged exactly as a run. One video per request, at most 10 frames of a video up to 3 minutes long, at 360 or 720 px; Apify free plan callers get 3 frames of a video up to 1 minute at 360 px. The endpoint keeps no account memory and makes no contact sheet.
When something goes wrong
Every video that gives no frame ends on one uncharged row naming why: the site is not one this actor reads, the link is not a video, the video exists only in a format that cannot be decoded, the page needs a signed-in viewer, it is not found at that address, it is over 30 minutes, or the site refused the read for now (please re-run). A time limit ends the reading, never the delivering: frames already taken are always delivered. This actor may fail when a site changes how it serves video — failed items are never charged.
Questions
Open an issue on the Issues tab — we usually reply within a couple of hours.
If it earned its keep, a rating helps other buyers find it, and saving the actor keeps it one click away.