Loading...
Loading...
Use when the user has 2+ recordings of the same event (each with a `.sync.json` sidecar from wjs-syncing-multicam) and wants them combined into a single MP4 — auto-switching between cams second-by-second on audio energy, with optional picture-in-picture inset. Triggers — "auto-edit multicam", "做个剪辑", "切几个机位", "把这几个视频合成一个", "combine these angles", "PiP overlay".
npx skill4agent add jianshuo/claude-skills wjs-editing-multicam| Is | Is not |
|---|---|
| Audio-energy-driven cam switching | Face / framing detection (no face_recognition, no MediaPipe) |
| Single-source audio (one cam's mic) | Multi-mic mix / per-speaker gating |
| Hard cuts, with optional PiP inset | Crossfades / opacity transitions / sliding animations |
| HyperFrames composition / |
| Coverage-aware (won't pick a cam outside its sidecar window) | Frame-accurate beat alignment / VAD-edge cuts |
.sync.jsonautoedit.pydelta_secondsoverlap_in_referencerender_cuts.pyrender_pip.pyffmpeg -itsoffsetdeltas[]delta_seconds[k]overlap_in_reference[k]t_ref - delta_k-infcam[k] - mean(other covered cams)rotationmin_dwell=8max_dwell=15greedy--switch-thresholdmin_dwell=4max_dwell=18edl.json{
"_about": "EDL produced by wjs-editing-multicam/autoedit.py. Times in reference timeline. Render scripts apply ffmpeg -itsoffset deltas[k] per input.",
"_help": {
"inputs": "Original media paths, in cam-index order (cam 0, cam 1, ...).",
"deltas": "Per-cam delta_seconds from each sidecar. Render uses ffmpeg -itsoffset deltas[k].",
"duration_sec": "Output duration in reference timeline.",
"audio_source": "Cam index whose audio track becomes the master. Single source — not a mix.",
"coverage": "[start, end] per cam in reference timeline.",
"edl": "List of {cam, start, end} segments. Times are reference-timeline seconds."
},
"inputs": ["cam_a.MOV", "cam_b.MOV"],
"deltas": [0.0, 12.345],
"duration_sec": 4512,
"audio_source": 0,
"coverage": [[0.0, 4512.0], [12.345, 4499.835]],
"edl": [{"cam": 0, "start": 0, "end": 13}, {"cam": 1, "start": 13, "end": 28}, ...]
}autoedit.py_about_help| Script | What it does |
|---|---|
| Hard cuts only. |
| Hard cuts + corner picture-in-picture overlay. Main cam = EDL row's |
-itsoffset deltas[k]--mode rotation--mode greedy--min-dwellaudio_source--audio-source <cam-index>working_dir/
cam_a.MOV # ORIGINAL, untouched
cam_a.MOV.sync.json # from wjs-syncing-multicam
cam_b.MOV # ORIGINAL, untouched
cam_b.MOV.sync.json
edl.json # from autoedit.py
multicam_render.mp4 # from render_cuts.py OR render_pip.pyaudio_sourceautoedit.pyffmpeg -ss A -t 120--min-dwell--mode--audio-sourcepipdeltas[]autoedit.py