How to use cut detection to build a highlight reel
- Step 1Drop the source footage — Drag your raw capture (
.mp4,.mov,.mkv,.webm,.avi,.m4v,.ts) onto the detector — a stream VOD, a match recording, an event multicam, whatever holds the highlights. Everything runs locally; nothing uploads. - Step 2Set a threshold suited to the action level — For high-motion gameplay or sports, start at
0.5–0.6—0.3often floods the list with motion false-positives. For calmer footage (talking-head clips, b-roll-heavy events),0.3is fine. The threshold sets how many candidate segments you'll sift through. - Step 3Run detection and download the candidate list — JAD logs each over-threshold frame's
pts_timeinto<yourfile>-scenes.json:{ "threshold": <value>, "cuts": [<seconds>, ...] }. Each consecutive pair of cuts brackets a candidate segment for the reel. - Step 4Pick your highlight segments — Scan the
cutsarray and choose the start/end of the moments you want — e.g. seconds54.88→91.2for one play. You can preview around each timestamp in any player. The detector gives the boundaries; the selection is your editorial call. - Step 5Trim each pick with the lossless trimmer — For each chosen segment, run lossless-trimmer with its start/end seconds. It stream-copies (
-c copy) so there's no re-encode — note the start snaps to the nearest prior keyframe, so a clip may begin a few frames early. For action reels that's usually fine; for frame-tight cuts, use a re-encoding trim path. - Step 6Assemble and format the reel — Stitch the trimmed picks with video-merger (stream-copy if all clips share a codec, else transcode). Then reframe for the target platform with youtube-shorts-formatter or instagram-feed-formatter.
Highlight-reel pipeline
The detector is step one. These siblings do the trimming, stitching, and formatting it does not do.
| Step | Tool | What it produces |
|---|---|---|
| 1. Find candidate moments | scene-detector (this tool) | JSON cut timestamps (seconds) |
| 2. Pull each highlight | lossless-trimmer | One clip per chosen segment (stream-copy) |
| 3. Stitch the reel | video-merger | Single assembled video |
| 4. Reframe for platform | youtube-shorts-formatter | 9:16 / platform-sized reel |
| (optional) Sanity-check shots | frame-grid-maker | Contact-sheet of the source |
Threshold for reel source footage
Reel sources are often high-motion. Higher thresholds tame the false-positive flood.
| Source | Start at | Why |
|---|---|---|
| Gameplay / FPS capture | 0.5–0.6 | Constant camera motion floods low thresholds |
| Sports / action multicam | 0.5 | Fast play + angle switches; suppress motion noise |
| Event / talking segments | 0.3 | Calmer footage; default catches real changes |
| Music / montage source | 0.1–0.2 | Crossfades you must catch as candidate boundaries |
Tier limits (video family)
Source-size and batch caps for detecting on reel footage.
| Tier | Max file size | Batch files |
|---|---|---|
| Free | 1 GB | 1 |
| Pro | 10 GB | 5 |
| Pro-media | 100 GB | 50 |
| Developer | 100 GB | Unlimited |
Cookbook
End-to-end reel recipes. The detector finds candidate boundaries; the trim/merge/format steps are sibling tools.
Find candidate plays in a gameplay VOD
A 45-minute gameplay capture. At 0.3 the constant camera motion floods the list; 0.55 isolates real scene/action changes that bracket the plays worth clipping.
Input: ranked-session.mp4 (45:00) threshold 0.3 → 210 cuts (motion noise) threshold 0.55 → 24 cuts (real moment-changes) Use 0.55. cuts: [..., 612.4, 705.0, 988.2, ...] Each pair brackets a candidate play to clip.
Pull one highlight segment losslessly
You picked the play between two cuts. Trim it with stream-copy for an instant, zero-loss clip.
Candidate: start 612.4, end 705.0 lossless-trimmer: startSec 612.4, endSec 705.0, -c copy Note: start snaps to nearest prior keyframe, so the clip may begin a couple frames before 612.4 — fine for a reel. For a frame-tight cut, use a re-encoding trim instead.
Assemble five highlights into a reel
After trimming five picks, stitch them in order. If all clips share the source codec, the merge is a stream-copy with no quality loss.
Trimmed: hl_01..hl_05 (all from same source, same codec) video-merger (concat, stream-copy) → reel.mp4 If clips have mixed codecs, the merger transcodes instead — slower but still one-click.
Reframe the reel for Shorts
Landscape gameplay → vertical Shorts. After assembling, reframe to 9:16 with the formatter.
reel.mp4 (16:9) → youtube-shorts-formatter (9:16) → reel-shorts.mp4 Or instagram-feed-formatter for a square/4:5 feed cut. The detector itself does not reframe — it only finds cuts.
Prune micro-segments before clipping
Low thresholds on action footage produce candidate segments too short to be highlights. Drop sub-2s gaps from the cuts array so you only trim meaningful moments.
cuts: [..., 700.0, 700.6, 701.1, 705.0, ...] Min highlight length: 3 s Keep 700.0 and 705.0; drop 700.6, 701.1 (too short). No min-scene-length option exists, so prune the array, then trim the surviving segments.
Edge cases and what actually happens
The detector doesn't trim or assemble the reel
By designIt only finds candidate cut boundaries and outputs JSON. Building the reel is a pipeline: lossless-trimmer pulls each segment, video-merger stitches them, and a formatter reframes. The detector is step one of four.
Action footage floods the list at 0.3
ExpectedGameplay and sports footage has constant camera motion, which spikes the per-frame difference score and produces hundreds of false-positive cuts at the default. Raise to 0.5–0.6 to isolate real moment-changes. The threshold is the only lever — there's no motion compensation.
Lossless-trimmed highlight starts a few frames early
By designWhen you trim a pick with stream-copy, the start snaps to the nearest prior keyframe, so the clip can begin slightly before the chosen cut. For most reels this is invisible; if you need a frame-tight in-point, trim with a re-encoding path and accept the extra time.
Candidate segments too short to be highlights
ExpectedLow thresholds create many short candidate segments, some too brief to use. The tool has no min-scene-length filter, so drop cuts that are closer together than your minimum highlight length from the array before trimming.
Soft transitions in a montage source missed
ExpectedIf your source already has crossfades you want to use as boundaries, the default threshold may skip them because the change is gradual. Lower toward 0.1–0.2 to surface them as candidate cut points.
Empty candidate list
ExpectedA single continuous capture with no scene changes returns cuts: [] — there are no boundaries to bracket highlights. For such footage you'll pick segments by time rather than by detected cuts; lower the threshold only if there genuinely are subtle changes to find.
Threshold clamped to 0.05–0.9
ClampedOut-of-range values snap to the bounds. For reel work, stay in the 0.3–0.6 band for most action footage; the extremes either flood the list or return almost nothing. The applied threshold is recorded in the JSON.
Long VOD slow to scan
ExpectedA multi-hour stream VOD is decoded frame by frame with no fast-seek, so finding candidate cuts takes minutes. Detect on a proxy of the same VOD to speed it up; the seconds map back to the full-resolution source for trimming.
Source over the tier cap
RejectedA capture larger than your tier cap (Free 1 GB, Pro 10 GB, Pro-media/Developer 100 GB) is rejected before detection. Detect on a proxy or split the VOD first, then map candidate cuts back to the original for the reel.
Mixed codecs break a stream-copy merge
TranscodesIf your trimmed highlights come from sources with different codecs, the merger can't stream-copy and will transcode the assembly instead. That's slower but still produces a single reel. Keep all picks from one source codec for the fastest, lossless stitch.
Frequently asked questions
Does this build the highlight reel for me?
No. It detects candidate cut boundaries and outputs JSON timestamps. You then trim your chosen segments with lossless-trimmer, stitch them with video-merger, and reframe with a formatter. The detector is the find step in a four-step pipeline.
What threshold should I use for gameplay footage?
Start at 0.5–0.6. Gameplay has constant camera motion that floods low thresholds with false-positive cuts. The higher floor isolates real action/scene changes that bracket clip-worthy moments. Re-scan to fine-tune.
How do the cut timestamps become highlight clips?
Each consecutive pair of cuts brackets a candidate segment. Pick the segments you want, then feed each segment's start/end seconds to lossless-trimmer to pull it as a clip. The detector supplies the boundaries; you choose which to keep.
Why does my trimmed highlight start a bit before the cut?
The lossless trimmer uses stream-copy and snaps the start to the nearest prior keyframe, so a clip can begin a few frames before your chosen cut. For reels this is usually invisible; for a frame-tight in-point, use a re-encoding trim path instead.
Can I stitch the highlights without quality loss?
Yes, if all your trimmed clips share the same codec — video-merger then concatenates them with stream-copy, no re-encode. Mixed codecs force a transcode, which is slower but still one operation.
How do I make the reel vertical for Shorts/Reels?
After assembling, run the reel through youtube-shorts-formatter for 9:16 or instagram-feed-formatter for a feed-sized crop. The scene detector itself does not reframe — it only finds cuts.
My candidate list has hundreds of cuts — is that normal for action?
Yes, at a low threshold. High-motion footage trips the difference score constantly. Raise toward 0.55–0.6 and re-scan to collapse the noise into real moment-changes. You can also prune the array of cuts that are too close together.
How do I avoid micro-clips that are too short?
There's no min-scene-length option, so drop any cuts closer together than your minimum highlight length from the JSON array before trimming. That leaves only segments long enough to be usable in the reel.
Is my footage uploaded while detecting highlights?
No. Detection runs in your browser via FFmpeg.wasm; gameplay captures, event footage, and unreleased clips never leave your machine. Only the FFmpeg core is fetched, and it can be self-hosted.
Can I detect on a proxy of a long VOD?
Yes, and you should for long captures. Detect candidate cuts on a low-res proxy — pts_time is timeline-relative, so the seconds apply 1:1 to the full-resolution source when you trim the highlights.
What if the source is one continuous shot with no cuts?
You'll get an empty cuts array — there are no detected boundaries. For such footage, pick highlight in/out points by time instead, and trim those ranges directly with the lossless trimmer.
What formats can the source be in?
MP4, MOV, MKV, WebM, AVI, M4V and TS. Stream captures in unsupported containers should be remuxed to one of these first, or detection may fail to decode the footage.
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.