Video Scene Splitter: scenes, keyframes, probe report
Pricing
Pay per event
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
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.
- Run any TikTok, Instagram or YouTube scraper.
- Open its run, copy the dataset ID from the Storage tab.
- Start this Actor with that ID in Dataset from a scraper run.
- Read
scenes[]on each output record; fetch the stills bykeyframeKey.
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
| Field | Type | Default | What it does |
|---|---|---|---|
videoUrls | array | demo clip | Direct media URLs (.mp4 and similar) |
datasetId | string | — | Read URLs from a scraper's dataset. The recommended input |
maxVideos | integer | 10 (max 100) | Ceiling on videos attempted this run |
sceneThreshold | number | 0.35 (0.10-0.90) | How different two frames must be to count as a cut. Lower finds more scenes |
minSceneSeconds | number | 0.6 (0-10) | Cuts closer than this merge into the scene before them |
maxKeyframes | integer | 40 (max 100) | Cap on saved stills. Every boundary is still returned |
keyframeLongEdge | integer | 1024 (240-1920) | Longest edge of each still, aspect preserved |
includeKeyframes | boolean | true | Off gives boundaries and the probe report only. Faster and cheaper |
Cost
| Event | Price |
|---|---|
| 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.