Split a Video into Scenes

Finds every shot boundary and cuts the video into one clip per scene — right in your browser, no upload, with a downloadable timing table.

Try:
Scene clips

About this tool

Long takes, interview reels and screen recordings are usually a string of separate shots stitched together. This tool finds where one shot ends and the next begins — the scene cuts — and writes each shot out as its own clip, plus a CSV listing every scene's start, end and length.

Detection is ffmpeg's scene filter: each frame gets a difference score against the one before it, and anything above the detection sensitivity counts as a cut. Lower catches soft or graded transitions (and, past a point, fast camera moves); higher keeps only hard cuts. Shortest scene merges boundaries that land closer together than that, so a single cut spread over two frames still produces one clip.

Everything runs locally: ffmpeg is compiled to WebAssembly and the video never leaves the browser.

Worked example

A 3-second test clip made of three 1-second solid-colour shots (red → green → blue), with the defaults (sensitivity 0.3, shortest scene 0.6s, re-encode):

scenestartenddurationfile
1011demo-Scene-001.mp4
2121demo-Scene-002.mp4
3231demo-Scene-003.mp4

Three download links appear, one per clip, plus scenes.csv holding exactly the table above:

scene,start_seconds,end_seconds,duration_seconds,filename
1,0,1,1,demo-Scene-001.mp4
2,1,2,1,demo-Scene-002.mp4
3,2,3,1,demo-Scene-003.mp4

Raise the sensitivity to 0.7 on the same clip and no boundary passes the cutoff — the page says so instead of handing back one clip identical to the input.

Cut modes

Re-encode (default) decodes and re-encodes every clip with H.264 + AAC in MP4, so each clip starts on exactly the detected frame. Stream copy remuxes the original packets: near-instant and pixel-for-pixel lossless, but a clip can only start on a keyframe, so its start may sit up to one GOP (often 1–10 seconds) before the real cut, and the source container is kept.

Limits and edge cases

FAQ

What sensitivity should I use?

Start at the default 0.3. If shots are being missed, step down to 0.2 and then 0.15. If a single shot is being chopped into pieces — usually fast motion, a camera flash or heavy compression noise — step up to 0.40.5. Sensitivity is ffmpeg's scene score, a 0–1 measure of how different a frame is from the one before it, so the same number behaves consistently across clips of similar content.

Why did I get fewer clips than there are cuts?

Two settings merge boundaries. Shortest scene (default 0.6s) drops any cut that lands less than that after the previous one, which is what stops one hard cut from producing two clips when the transition straddles two frames; it also folds a too-short final scene back into the one before it. And a cut whose score sits below the detection sensitivity is never reported at all. Lower both if you are missing real cuts.

Why does stream copy give clips that start early?

Copying packets means never decoding them, and a video stream can only be cut at a keyframe. The clip therefore starts at the last keyframe at or before the detected cut — with a typical 2–10 second keyframe interval, that can be seconds of the previous shot at the head of the clip. Re-encode mode decodes and re-encodes, so it can start on any frame; use it whenever the exact boundary matters.

What is in scenes.csv, and can I use it elsewhere?

One row per scene with scene, start_seconds, end_seconds, duration_seconds and filename. It opens directly in a spreadsheet and is easy to feed into an edit list, a chapter file, or your own ffmpeg script if you would rather cut the clips yourself with different settings.

Does anything get uploaded?

No. ffmpeg is compiled to WebAssembly and runs inside the page, so the video, the detection pass and every clip stay on your machine. That also means the work is done by your CPU — long videos take real time, and a very large file can exhaust the browser tab's memory.

Developer & Automation Access

Run it from the terminal

Same engine as this page, headless — via the gizza CLI:

gizza tool video-scene-split 'url=https://example.com/input' 'threshold=0.3' 'min_scene=0.6' 'mode=reencode' 'crf=22' 'preset=veryfast' 'keep_audio=true'

New to the CLI? Get gizza →

Open it by URL

Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:

https://gizza.ai/tools/video-scene-split/?url=https://example.com/input&threshold=0.3&min_scene=0.6&mode=reencode&crf=22&preset=veryfast&keep_audio=true

Machine-readable descriptor: tool.json — title + parameters JSON Schema for agents.