How to guide to scene detection sensitivity thresholds
- Step 1Start at the default 0.3 — Drop your file and run once at
0.3. This is the calibrated middle for scripted/interview content and gives you a baseline cut count to compare against. Note how many cuts you got. - Step 2Judge over- vs under-detection — Compare the count to reality. Way more cuts than there are real scene changes → over-detection (motion/grading false positives) → raise the threshold. Fewer cuts than there are scene changes → under-detection (soft transitions missed) → lower the threshold.
- Step 3Sweep toward the right value — Move in steps of
0.1–0.15. From0.3: go to0.5to suppress false positives, or to0.15/0.1to catch soft cuts. Each re-scan is read-only and deterministic, so the comparison is clean. - Step 4Diff consecutive runs — Compare the
cutsarrays from two thresholds. The cuts that appear only at the lower threshold are the marginal/soft ones; the cuts that survive even at the higher threshold are the strong, unambiguous ones. This tells you which cuts are 'real'. - Step 5Respect the clamp — The control accepts
0.05–0.9; entering0or1snaps to the bound. Avoid the extremes —0.05floods the list with near-every-frame on busy footage;0.9may return nothing but the most violent cuts. Stay in the0.1–0.6working band for almost all content. - Step 6Lock in the threshold for the project — Once a threshold gives a clean list, reuse it across similar footage from the same shoot — same camera, lighting, and shooting style respond similarly. The applied threshold is recorded in every output JSON so you can document the chosen value.
Threshold reference (0.05–0.9)
What each band of the single threshold control does. Default is 0.3.
| Threshold band | Sensitivity | Catches / misses |
|---|---|---|
0.05–0.1 | Very aggressive | Catches soft fades, dissolves, colour-grading shifts — plus heavy motion false-positives |
0.15–0.25 | Aggressive | Most soft + hard cuts; some motion false-positives |
0.3 (default) | Balanced | Most hard cuts; ignores gradual brightness/grade drift |
0.4–0.5 | Conservative | Clear scene changes only; tolerates camera movement |
0.6–0.9 | Strict | Only the most abrupt cuts (e.g. black-to-bright); misses anything subtle |
Threshold by footage type
Recommended starting threshold per content style. Always re-scan to tune.
| Footage type | Start at | Why |
|---|---|---|
| Talking-head / podcast (single cam) | 0.5 | Few real cuts; conservative avoids movement false-positives |
| Scripted / interview (multi-cam) | 0.3 | Balanced; one cut per angle switch |
| Music video / montage | 0.1 | Fast cuts + crossfades you must catch; clean up extras after |
| Documentary with dissolves | 0.15–0.2 | Soft transitions need a low floor |
| Sports / action handheld | 0.5–0.6 | High motion floods low thresholds with false-positives |
| Screen recording / slides | 0.3 | Slide changes are clean hard transitions |
Diagnosing your result
Map the symptom to the threshold fix.
| Symptom | Likely cause | Fix |
|---|---|---|
| Far more cuts than real scene changes | Threshold too low for the motion in the footage | Raise toward 0.5–0.6 and re-scan |
| Missed obvious hard cuts | Threshold too high | Lower toward 0.2–0.3 |
| Soft fades/dissolves not detected | Gradual change never exceeds threshold | Lower toward 0.1–0.15 |
| Cuts cluster within one shot | Camera shake/zoom spiking the score | Raise threshold; prune close cuts from the array |
| Empty cuts array | No frame exceeded the threshold | Lower threshold, or accept the clip is one shot |
Cookbook
Threshold-tuning sessions on real footage types. The point is the sweep, not a single magic number.
Sweep a talking-head podcast
A single-camera podcast has few real cuts. Sweeping shows how the count collapses as you raise the floor — 0.5 isolates the true B-roll inserts.
threshold 0.1 → 19 cuts (mostly gesture/lighting noise) threshold 0.3 → 6 cuts threshold 0.5 → 3 cuts ← the actual B-roll inserts Use 0.5 here. Each run is read-only; sweeping is free.
Sweep a music video
Fast cuts plus crossfades. Here you want a LOW threshold to catch the soft transitions, accepting that you'll prune some motion false-positives afterward.
threshold 0.5 → 18 cuts (misses the crossfades) threshold 0.3 → 41 cuts threshold 0.1 → 73 cuts (catches crossfades + extras) For full coverage use 0.1, then prune the array to the cuts that matter for the edit.
Diff two thresholds to find the 'strong' cuts
The cuts present at the higher threshold are unambiguous; the extras at the lower threshold are marginal. Diffing classifies them.
cuts@0.5 = {12.4, 88.0, 201.7}
cuts@0.2 = {12.4, 45.1, 88.0, 152.3, 201.7, 240.0}
strong (in both): 12.4, 88.0, 201.7
marginal (only @0.2): 45.1, 152.3, 240.0
Keep strong for chapters; review marginal individually.Action footage flooded at 0.3 — raise the floor
Handheld sports footage at 0.3 trips on motion. Raising to 0.6 cuts the noise to real scene changes.
threshold 0.3 → 88 cuts (motion false-positives) threshold 0.6 → 11 cuts (real scene changes) High-motion footage needs a high floor. There is no motion-compensation option — the threshold is the only dial available.
Documentary dissolves need a low floor
A doc joined by slow cross-dissolves under-detects at 0.3. Dropping to 0.15 surfaces the soft transitions.
threshold 0.3 → 9 cuts (dissolves missed) threshold 0.15 → 17 cuts (dissolves caught) The extra 8 are the dissolves. Lower threshold = the only way to catch gradual transitions in this tool.
Edge cases and what actually happens
Threshold is the only control
By designThere is no min-scene-length, no motion compensation, no soft-cut/fade mode, and no per-region sensitivity. The single threshold governs everything. All tuning happens through that one number — which is why understanding it (this guide) matters so much.
Values outside 0.05–0.9 are clamped
ClampedBoth the UI and the processor clamp to [0.05, 0.9]. A 0 snaps to 0.05 (still extremely aggressive), and 1.0+ snaps to 0.9 (extremely strict). The applied value is written to the output JSON, so you always know what actually ran.
0.05 floods busy footage
ExpectedAt the minimum threshold, almost any per-frame change on busy or noisy footage passes the floor, producing an enormous cut list dominated by false positives. Useful only for very static sources where you must catch the faintest change. For most content, stay at 0.1 or above.
0.9 returns almost nothing
ExpectedAt the maximum threshold, only the most violent frame-to-frame changes register — typically a hard cut from a black frame to a bright scene. Most real cuts are missed. Rarely the right setting; included for completeness of the range.
Same threshold, different footage, different result
ExpectedThe scene score is content-dependent: 0.3 on a static interview behaves nothing like 0.3 on a handheld action shot. A threshold tuned for one shoot is a starting point, not a universal constant — re-tune when the camera, lighting, or shooting style changes.
Score is per-frame, not per-shot
ExpectedThe scene value compares each frame to the immediately preceding one, so a slow change spread over many frames may never spike above the threshold even though the overall shot changed completely. This is why dissolves need a low floor — no single frame-to-frame delta is large.
Re-scanning is deterministic
SupportedThe same file at the same threshold always returns the identical cuts array, which is exactly what makes threshold sweeping useful — differences between runs are entirely attributable to the threshold change, not randomness. Diff with confidence.
Sweeping a long file is slow per run
ExpectedEach threshold sweep is a full frame-by-frame decode (-f null -), so sweeping five thresholds on a long file means five full scans. Sweep on a short representative clip or a proxy first to find the threshold, then run it once on the full file.
Output format is fixed JSON
By designRegardless of threshold, the output is always {threshold, cuts} JSON in seconds — there is no CSV/SRT option and no split. The threshold only changes the contents of the cuts array, never the output format.
FFmpeg core fails to load
ErrorIf the FFmpeg.wasm core cannot be fetched, no threshold will run — the tool throws 'FFmpeg core failed to load.' Self-host the core assets on restricted networks; the threshold control is irrelevant until the engine loads.
Frequently asked questions
What exactly does the threshold control?
FFmpeg's scene filter scores each frame ~0–1 by how visually different it is from the previous frame. The detector keeps frames where score > threshold (select='gt(scene,T)'). So the threshold is a sensitivity floor: lower = more cuts (including soft/false ones), higher = fewer cuts (only abrupt ones).
What's the default and the allowed range?
Default 0.3; the control accepts 0.05 to 0.9. Values outside that snap to the nearest bound. The practical working band for almost all footage is 0.1–0.6.
What does 0.1 catch that 0.3 doesn't?
Soft transitions — fades, cross-dissolves — and even colour-grading shifts, because the floor is low enough for gradual per-frame deltas to pass. The cost is more false positives on motion, which you prune afterward.
Why does 0.5 only catch hard cuts?
A higher floor means only large frame-to-frame differences pass. Gradual transitions never produce a big enough single-frame delta, so they're skipped, and camera movement usually stays below 0.5 — leaving only clear, abrupt scene changes.
I'm getting way too many cuts — what threshold do I use?
Raise it. Too many cuts means the floor is below the level of motion/grading noise in your footage. Step up toward 0.5–0.6 and re-scan; high-motion handheld footage often needs 0.6.
I'm missing obvious cuts — what now?
Lower the threshold. Missed hard cuts mean the floor is too high; drop toward 0.2–0.3. If you're missing soft fades specifically, go lower still, to 0.1–0.15.
Is there a min-scene-length or fade-detection option?
No. Threshold is the only control. There is no minimum-scene-length filter, no dedicated fade mode, and no motion compensation. To suppress clustered false cuts, raise the threshold or prune close timestamps from the JSON yourself.
Does the same threshold work across all my footage?
Only within similar footage. The scene score is content-dependent, so a threshold tuned for a locked-off interview won't behave the same on handheld action. Reuse a threshold within a shoot (same camera/lighting), but re-tune when the style changes.
How do I find the 'real' cuts vs marginal ones?
Diff two threshold runs. Cuts present at the higher threshold are strong and unambiguous; extras that appear only at the lower threshold are marginal. Keep the strong ones for chapters; review the marginal ones individually.
Is sweeping multiple thresholds expensive?
Each sweep is a full frame-by-frame scan, so on a long file it adds up. Sweep on a short representative clip or a proxy to find the value, then run that single threshold on the full file once.
Does the threshold change the output format?
No. The output is always JSON {threshold, cuts} with timestamps in seconds. The threshold only changes which timestamps appear in cuts; it never produces CSV, SRT, or split clips.
Is any of this uploaded while I tune?
No. Every threshold run happens in your browser via FFmpeg.wasm. You can sweep as many thresholds as you like on confidential footage without it ever leaving your machine — only the FFmpeg core is fetched.
Privacy first
Every JAD Video tool runs entirely in your browser via WebCodecs and FFmpeg (WebAssembly). Your video files never leave your device — verified by zero outbound network requests during processing.