Find the cross-dissolve where two shots are joined
Proof frames
Tool calls
detect_cuts
Arguments
{
"source": "$CLIP"
}
Result
{
"ok": true,
"data": {
"cuts": [
{
"timestamp_sec": 3.15,
"score": 0.15295,
"kind": "transition"
}
],
"total": 1
}
}
inspect_window
Arguments
{
"source": "$CLIP",
"start_sec": 1.68,
"end_sec": 4.64,
"fps": 2
}
Result
{
"ok": true,
"data": {
"source_path": "~/hill/gallery/repo/cards/dissolve-synthetic/clip.mp4",
"start_sec": 1.68,
"end_sec": 4.64,
"fps": 2,
"frames": [
{
"index": 1,
"timestamp_sec": 1.68,
"timecode": "00:00:01.680",
"file_path": "<cache>/4243b17707c5dd916f23/dense_3a61649497147e939ded/frame_0001.jpg",
"width": 640,
"height": 360,
"requested_timestamp": 1.68,
"decoded_timestamp": null,
"timestamp_delta": null
},
{
"index": 2,
"timestamp_sec": 2.18,
"timecode": "00:00:02.180",
"file_path": "<cache>/4243b17707c5dd916f23/dense_3a61649497147e939ded/frame_0002.jpg",
"width": 640,
"height": 360,
"requested_timestamp": 2.18,
"decoded_timestamp": null,
"timestamp_delta": null
},
{
"index": 3,
"timestamp_sec": 2.68,
"timecode": "00:00:02.680",
"file_path": "<cache>/4243b17707c5dd916f23/dense_3a61649497147e939ded/frame_0003.jpg",
"width": 640,
"height": 360,
"requested_timestamp": 2.68,
"decoded_timestamp": null,
"timestamp_delta": null
},
{
"index": 4,
"timestamp_sec": 3.18,
"timecode": "00:00:03.180",
"file_path": "<cache>/4243b17707c5dd916f23/dense_3a61649497147e939ded/frame_0004.jpg",
"width": 640,
"height": 360,
"requested_timestamp": 3.18,
"decoded_timestamp": null,
"timestamp_delta": null
},
{
"index": 5,
"timestamp_sec": 3.68,
"timecode": "00:00:03.680",
"file_path": "<cache>/4243b17707c5dd916f23/dense_3a61649497147e939ded/frame_0005.jpg",
"width": 640,
"height": 360,
"requested_timestamp": 3.68,
"decoded_timestamp": null,
"timestamp_delta": null
},
{
"index": 6,
"timestamp_sec": 4.18,
"timecode": "00:00:04.180",
"file_path": "<cache>/4243b17707c5dd916f23/dense_3a61649497147e939ded/frame_0006.jpg",
"width": 640,
"height": 360,
"requested_timestamp": 4.18,
"decoded_timestamp": null,
"timestamp_delta": null
}
],
"contact_sheet_path": "/private<cache>/4243b17707c5dd916f23/contact_sheets/sheet_6samples_4cols_ca80d5.jpg",
"estimated_vision_tokens": 1548,
"tool_file": {
"_tag": "ToolFile",
"name": "sheet_6samples_4cols_ca80d5.jpg",
"mimeType": "image/jpeg",
"encoding": "base64",
"data": "<180672 base64 chars dropped>",
"byteLength": 135503
}
}
}
Question and answer
- Question
- Is there a fade between shots? Where is it?
- Answer
- The tool reports a transition at 3.15 seconds, where the two shots meet.
How it was checked
- Truth from
- constructed
- Fixed at
Planted by this recipe before any tool ran: shot A is 4.16 s of synthetic-bouncing-ball from 0.4 s; shot B is 4.72 s of testcard from 7.44 s (another source of the same domain; neither shot has a hard cut inside). ffmpeg joined them with one 2.0 s cross-dissolve (xfade fade) from 2.16 s to 4.16 s of the clip. The truth is the fade midpoint 3.16 s, with tolerance 1 s (half the fade), so a cut time anywhere inside the fade passes. The window given to inspect_window is the fade plus 0.5 s either side, fixed here.
A script joined two shots, one from 'Generated bouncing ball with a bounce counter and click sound' and one from another clip of the same kind, with a planted 2.0 s cross-dissolve and no sound, so the answer is one time inside that fade (not its start and end); the card does not show whether detect_cuts finds other cuts.
Try it yourself
Use agentic-video on my video. Run detect_cuts on the whole video, then run inspect_window over the part where the picture fades into the next shot. Tell me the time of the fade.
- Get the .mcpb file and open it in Claude Desktop.
- Or:
pip install agentic-video
Clip and licence
- Licence
- generated
Generated for the gallery; no third-party material.
Also uses (insert 1)
- Licence
- generated
Generated for the gallery; no third-party material.