Video Frame Extractor - Scene Detection, $1.50/1k Frames avatar

Video Frame Extractor - Scene Detection, $1.50/1k Frames

Pricing

from $1.05 / 1,000 results

Go to Apify Store
Video Frame Extractor - Scene Detection, $1.50/1k Frames

Video Frame Extractor - Scene Detection, $1.50/1k Frames

Video Frame Extractor: still frames from direct video file URLs (mp4, mov, webm, mkv, m4v). Scene-change detection, every N seconds, N evenly spaced frames or exact timestamps. One row per frame with image URL, timecode and video metadata, plus an optional contact sheet. Seeks over HTTP without down

Pricing

from $1.05 / 1,000 results

Rating

0.0

(0)

Developer

Martin Petrov

Martin Petrov

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Security

Limited permissions

Share

Extract Frames from Video - Keyframes, Scene Detection, MCP

Need still images out of video files, at scene changes, every N seconds or at exact timestamps? Give this actor direct video file links and get one row per frame with the image URL, timecode and video metadata. Feeding video to an AI vision model? Extract a handful of frames plus one contact sheet instead of sending the whole file.

No YouTube downloader, no proxies, no login. Your video is read with ffmpeg and the honest User-Agent RadarFrames/1.0 (+apify.com/martin10291). For interval, count and timestamps modes the actor seeks over HTTP and does not download the whole file.

API example (copy and paste)

curl -X POST "https://api.apify.com/v2/acts/martin10291~video-frame-extractor/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"videoUrls": ["https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/360/Big_Buck_Bunny_360_10s_1MB.mp4"],
"mode": "count",
"frameCount": 8,
"format": "jpg",
"width": 1280,
"contactSheet": true
}'

Scene changes instead of fixed times: "mode": "scenes", "sceneThreshold": 0.3. One frame every 5 seconds: "mode": "interval", "everySeconds": 5. Exact times: "mode": "timestamps", "timestamps": ["0", "12.5", "00:01:30"].

MCP example (Claude, Cursor, any MCP client)

Add the Apify MCP server with this actor enabled:

https://mcp.apify.com/?actors=martin10291/video-frame-extractor

Then ask your assistant: "Extract 8 evenly spaced frames from https://example.com/demo.mp4 and describe what happens." The tool returns image URLs and the contact sheet URL that a vision model can open.

Modes

ModeWhat you get
countN evenly spaced frames (default 10)
intervalOne frame every N seconds
timestampsFrames at exactly the times you list (seconds or HH:MM:SS)
scenesA frame at every scene change (ffmpeg scene detection, threshold 0.01 to 1)

Input

FieldDefaultMeaning
videoUrlsexample clipDirect links to video files (mp4, mov, webm, mkv, m4v) or Apify key-value store file URLs
modecountcount, interval, timestamps or scenes
frameCount10Frames in count mode
everySeconds10Step in interval mode
timestampsnoneTimes in timestamps mode
sceneThreshold0.3Scenes mode sensitivity, lower = more frames
maxFramesPerVideo30Hard cap per video (max 500). Caps your cost
formatjpgjpg, png or webp
width1280Output width, aspect ratio kept, never upscaled. 0 = original
quality85jpg / webp quality 1-100
contactSheettrueOne tiled grid image per video with timecodes (one extra result row)
maxVideoMinutes30Skip longer videos
onlyNew + monitorIdoffSkip videos already processed with the same Monitor ID and settings. Each video is paid for once

Output

One dataset row per frame, plus one row of type: "contact_sheet" per video when enabled.

{
"type": "frame",
"videoUrl": "https://example.com/demo.mp4",
"frameIndex": 0,
"timestampSec": 0.5,
"timecode": "00:00:00.500",
"imageUrl": "https://api.apify.com/v2/key-value-stores/STORE_ID/records/1-001.jpg",
"key": "1-001.jpg",
"width": 640,
"height": 360,
"sceneScore": null,
"mode": "count",
"durationSec": 10.0,
"fps": 30.0,
"videoWidth": 640,
"videoHeight": 360,
"extractedAt": "2026-11-04T14:34:25Z"
}

sceneScore (0 to 1, how strong the cut was) is filled in scenes mode. Images are stored in the run's key-value store and imageUrl is the public link to each one.

Pricing

$1.50 per 1,000 frames (one result row = one frame or one contact sheet). No start fee, no per-video fee. For comparison, kantolabs charges $2 per 1,000 frames and seemuapps $0.002 per frame plus $0.01 per video (store pages, 2026-11-04). Failed or skipped videos produce no rows and are not charged.

Speed

Measured by us (2026-11-04, 5 minute 854x480 webm, 4 parallel ffmpeg seeks, local range-capable server):

JobTime
8 frames, count modeabout 10 s
30 frames, count modeabout 14 s
15 png frames, interval modeabout 6.5 s
28 scene-change frames, scenes modeabout 29 s
Default example (10 s clip, contact sheet)6-9 s

On a remote host the speed depends on the server: a slow origin (archive.org, 14 minute file) took 27 s for 8 frames and 79 s for 30 frames in count mode. Some hosts (Blender, Wikimedia) rate-limit bursts of connections with HTTP 429; the actor slows down and retries.

Limits (honest)

  • Direct video file URLs only. YouTube, TikTok, Instagram, Facebook, X, Vimeo and similar page links are skipped with the message "only direct video file URLs" and listed in RUN_SUMMARY. There is no downloader and no proxy.
  • The file must be public and the server must allow range requests for fast seeking. If a host rate-limits (HTTP 429) the actor slows down and retries. Hosts that block cloud IPs cannot be read.
  • Seeking speed depends on the host and the file. Files with the index at the end or very long keyframe gaps are slower.
  • Scenes mode streams the file once, so it downloads and decodes the video up to the frame cap. Use it for clips, use count or interval mode for long videos.
  • Max 500 frames per video, default max video length 30 minutes (adjustable up to 600).
  • Frames are decoded video pictures, no audio, no OCR, no object detection.

Errors and monitoring

RUN_SUMMARY (key-value store) lists rows, videos ok and failed, notes and lastError. A broken link never stops the batch.

Use it as an integration (chain it after another actor)

This actor can run automatically after any actor whose results contain a direct video link.

  1. Open the source actor in Apify Console and go to the Integrations tab.
  2. Click Add integration -> Actor, pick this actor and set Dataset to {{resource.defaultDatasetId}} (leave videoUrls empty). Set your other options and save.
  3. When the source run finishes, this actor reads its dataset and processes every row. The field is detected automatically; set Dataset field if your column has another name.

You can also start it by hand with datasetId (pick a dataset or paste its ID) to process an existing dataset.

Good sources to chain from:

  • any actor that outputs a direct videoUrl / downloadUrl (mp4, webm)