Video Scene Splitter: scenes, keyframes, probe report avatar

Video Scene Splitter: scenes, keyframes, probe report

Pricing

Pay per event

Go to Apify Store
Video Scene Splitter: scenes, keyframes, probe report

Video Scene Splitter: scenes, keyframes, probe report

Turn any video into scenes and frames your model can read. Scene boundaries with timestamps, one keyframe per scene, and a full technical report. Deterministic ffmpeg, no API key.

Pricing

Pay per event

Rating

0.0

(0)

Developer

FrameProbe

FrameProbe

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Last verified: 2026-08-12

Turn any video into scenes and frames your model can read. Give it a video, get back every scene boundary with timestamps, one representative still per scene, and a technical report on the file.

Deterministic ffmpeg. No model, no API key, nothing to sign up for.

What you get, per video

  • Scene boundaries. Every cut, with start, end and duration. Contiguous, covering the whole video, no gaps.
  • One keyframe per scene, saved to the key-value store. Taken from the middle of the scene, not the first frame, so it is not a dissolve or a transition. If the middle happens to be a black frame, it samples elsewhere in the scene instead of handing your model an empty picture. The key is stored inside each scene object, so you never join two lists by position.
  • An ffprobe report. Duration, resolution, frame rate, video and audio codec, audio presence, bitrate, file size, container.

Quickstart

The recommended path is chaining. Social platforms block video fetching from cloud servers, so run a scraper first and hand this Actor its dataset.

  1. Run any TikTok, Instagram or YouTube scraper.
  2. Open its run, copy the dataset ID from the Storage tab.
  3. Start this Actor with that ID in Dataset from a scraper run.
  4. Read scenes[] on each output record; fetch the stills by keyframeKey.

Already have direct media URLs? Put them in Direct video URLs instead and skip steps 1 and 2.

{
"datasetId": "aBcD1234efGh5678",
"maxVideos": 10,
"sceneThreshold": 0.35,
"minSceneSeconds": 0.6,
"maxKeyframes": 40
}

Example output

{
"url": "https://cdn.example.com/video/7234567890.mp4",
"platform": "tiktok",
"videoId": "9f2a1c7d4e6b8a03",
"status": "ok",
"durationSeconds": 52.209,
"width": 1080,
"height": 1920,
"fps": 29.97,
"videoCodec": "h264",
"audioCodec": "aac",
"hasAudio": true,
"bitrateKbps": 2412.6,
"sizeBytes": 15728640,
"containerFormat": "mov,mp4,m4a,3gp,3g2,mj2",
"sceneCount": 14,
"cutCadenceSeconds": 2.4,
"keyframeCount": 14,
"keyframesTruncated": false,
"scenes": [
{"index": 0, "startSeconds": 0.0, "endSeconds": 3.44, "durationSeconds": 3.44,
"keyframeKey": "scene-9f2a1c7d4e6b8a03-0000.jpg"},
{"index": 1, "startSeconds": 3.44, "endSeconds": 5.02, "durationSeconds": 1.58,
"keyframeKey": "scene-9f2a1c7d4e6b8a03-0001.jpg"}
],
"processingSeconds": 8.31,
"processedAt": "2026-08-12T22:49:05+00:00"
}

Input

FieldTypeDefaultWhat it does
videoUrlsarraydemo clipDirect media URLs (.mp4 and similar)
datasetIdstringRead URLs from a scraper's dataset. The recommended input
maxVideosinteger10 (max 100)Ceiling on videos attempted this run
sceneThresholdnumber0.35 (0.10-0.90)How different two frames must be to count as a cut. Lower finds more scenes
minSceneSecondsnumber0.6 (0-10)Cuts closer than this merge into the scene before them
maxKeyframesinteger40 (max 100)Cap on saved stills. Every boundary is still returned
keyframeLongEdgeinteger1024 (240-1920)Longest edge of each still, aspect preserved
includeKeyframesbooleantrueOff gives boundaries and the probe report only. Faster and cheaper

Cost

EventPrice
Actor start$0.01 per run
Minute of video processed$0.005 per minute, rounded up, minimum one per video

Price scales with the work because processing cost does. A 40-second clip is one minute-unit; a 3 minute 10 second video is four.

What that means in practice: 20 short clips cost $0.11. A single 10-minute talk costs $0.06.

Not charged: videos that fail to download, resolve or decode. They still appear in the dataset with a specific reason. A video whose stills were cut short by the time budget is charged; its scene list and probe report are complete and the record flags keyframesTruncated.

Limits, stated plainly

  • Social page links do not work from here. TikTok, Instagram and YouTube block video fetching from datacenter IPs. Paste one and you get a message naming the scraper to chain instead. This is a platform restriction, not a bug in this Actor.
  • Instagram and TikTok media URLs expire. They are short-lived signed links, usually good for hours. Fetch them in the same session you scraped them; a stored URL will 403.
  • Maximum 600 seconds and 200 MB per video. Longer or larger fails with a specific message.
  • Scene detection compares brightness. Two shots with similar luma score low however different their colours are. If an obvious cut is missed, lower sceneThreshold. This is a property of the detector, not a defect.
  • Cut cadence is a measured proxy. The detector fires on overlays and kinetic text as well as hard cuts, so read it as editing rhythm rather than an exact shot count.
  • A resumed run does not retry failures. If the platform migrates your run between servers, it picks up where it left off and skips everything already in the dataset, including the videos that failed. That is deliberate: it is what stops a migration from charging you twice. To retry a failed video, start a new run with it.
  • Each video gets a 25 second processing budget. Nearly always ample; the measured cost is about 2.5 seconds per minute of video. A very slow host can burn it on the download alone, in which case the video fails with a message saying so and is not charged.

Changelog

  • 0.1 First build. Scene boundaries, one keyframe per scene, full ffprobe report. Per-minute pricing. Chains from any scraper's dataset.

Built by FrameProbe. Also see Reel Teardown, which adds a vision read on top of the same pipeline: hooks, structure, on-screen text and why a video worked.