{"slug":"jianshuo-wjs-editing-multicam-ce6411","title":"\u591a\u673a\u4f4d\u97f3\u9891\u80fd\u91cf\u81ea\u52a8\u526a\u8f91","description":"\u628a2\u4e2a\u4ee5\u4e0a\u5df2\u540c\u6b65\u673a\u4f4d\u7684\u5f55\u50cf\u6309\u6bcf\u79d2\u97f3\u9891\u80fd\u91cf\u81ea\u52a8\u5207\u6362\u673a\u4f4d\uff0c\u8f93\u51fa\u786c\u5207\u6216\u5e26\u753b\u4e2d\u753b\u7684MP4\u3002\u542bLog\u8272\u5f69\u3001\u65cb\u8f6c\u3001\u7ad6\u5c4f\u4ea4\u4ed8\u7b49\u524d\u7f6e\u68c0\u67e5\u4e0eEDL\u7ed3\u6784\u8bf4\u660e\uff0c\u4f9d\u8d56\u516c\u5f00polysync\u5305\u4e0effmpeg\uff1b\u4e0d\u505a\u4eba\u8138\u8ddf\u8e2a\u3001\u8f6c\u573a\u6216\u5b57\u5e55\u3002","category":"\u526a\u8f91\u4e0e\u5305\u88c5","tags":["jianshuo","\u5efa\u7855","\u526a\u8f91\u4e0e\u5305\u88c5"],"author":"\u5efa\u7855 \u00b7 jianshuo","source_url":"https://github.com/jianshuo/claude-skills/blob/d36bc423286a34eb32adc604121e5c7714b08740/wjs-editing-multicam/SKILL.md","license":"MIT","status":"published","verification":"source_reviewed","verification_notes":"\u5df2\u6838\u5bf9\u539f\u59cb\u4ed3\u5e93\u3001\u56fa\u5b9a\u63d0\u4ea4\u3001\u8bb8\u53ef\u3001\u6280\u80fd\u6b63\u6587\u4e0e\u5305\u7ed3\u6784\uff0c\u5e76\u8865\u5145\u4e2d\u6587\u6267\u884c\u9a8c\u6536\u8bf4\u660e\uff1b\u672a\u8fd0\u884c\u5305\u5185\u811a\u672c\u3002","revision":"ee0801f2fb8345a58c41f16009771d88","created_at":"2026-11-02T14:47:08+00:00","updated_at":"2026-11-02T14:47:08+00:00","source_repo":"jianshuo/claude-skills","source_path":"wjs-editing-multicam/SKILL.md","source_commit":"d36bc423286a34eb32adc604121e5c7714b08740","source_updated_at":"2026-11-02T14:46:04+00:00","stars":0,"proxy_score":null,"score":null,"grade":null,"dimensions":{},"evaluation":{},"installs":0,"platforms":[],"formats":[],"category_slug":"packaging","category_name":"\u526a\u8f91\u4e0e\u5305\u88c5","quality":{"review_type":"text_and_package_review","readiness":"requires_setup","reviewed_at":"2026-11-02T14:46:04+00:00","review_summary":"\u6d41\u7a0b\u4e0e\u5751\u70b9\u8bf4\u660e\u5177\u4f53\uff0c\u53ef\u4f5c\u4e3a\u591a\u673a\u4f4d\u81ea\u52a8\u526a\u8f91\u7684\u64cd\u4f5c\u6307\u5357\uff1b\u9700\u81ea\u884c\u5b89\u88c5polysync\u4e0effmpeg\u5e76\u51c6\u5907\u540c\u6b65\u65c1\u8f66\uff0c\u6e32\u67d3\u6027\u80fd\u4e0e\u6210\u7247\u8d28\u91cf\u672a\u7ecf\u9a8c\u8bc1\u3002","cost_notes":"polysync\u4e3a\u516c\u5f00\u5305\uff0c\u5b89\u88c5\u4e0e\u4f7f\u7528\u672c\u8eab\u4e0d\u4ea7\u751f\u8d39\u7528\uff1b\u82e5\u4f7f\u7528\u7b2c\u4e09\u65b9\u4e91\u670d\u52a1\u6216\u4ed8\u8d39\u7d20\u6750\u9700\u53e6\u884c\u786e\u8ba4\uff0c\u672c\u5305\u672a\u62a5\u4ef7\u3002","source_sha256":"18922ab8d4e39a6d1a0b63d56fd3eba4dee8a35b21fadede6c55ec998845d3cf","prerequisites":["Python3\u73af\u5883\u4e0epip\uff0c\u53ef\u5b89\u88c5\u516c\u5f00\u5305polysync","ffmpeg/ffprobe\u5728PATH\u4e2d","\u5404\u673a\u4f4d\u5df2\u6709.sync.json\u65c1\u8f66\u6587\u4ef6\uff08\u7531\u540c\u6b65\u6b65\u9aa4\u751f\u6210\uff09","\u539f\u59cb\u673a\u4f4d\u6587\u4ef6\u4fdd\u6301\u672a\u6539\u52a8"],"checks":["edl.json\u542binputs\u3001deltas\u3001duration_sec\u3001audio_source\u3001coverage\u3001edl\u516d\u7c7b\u5b57\u6bb5\u4e14\u65f6\u95f4\u5747\u4e3a\u53c2\u8003\u65f6\u95f4\u7ebf\u79d2","\u6e32\u67d3\u524d\u5df2\u6838\u5bf9\u8272\u5f69\u914d\u7f6e\u3001\u65cb\u8f6c\u4e0e\u4ea4\u4ed8\u753b\u5e45\uff0c\u6210\u7247\u65e0\u7070\u7247\u3001\u8eba\u5012\u6216\u9ed1\u8fb9","\u8bd5\u542c30\u79d2\u786e\u8ba4audio_source\u65e0\u524a\u6ce2\u6216\u5931\u771f","EDL\u5206\u6bb5\u4e0d\u8d85\u51fa\u5404\u673a\u4f4dcoverage\u7a97\u53e3\uff0c\u9519\u5cf0\u5f00\u673a\u5904\u6709\u5355\u673a\u4f4d\u5f00\u573a","\u82e5\u4fee\u6539\u8fc7\u540c\u6b65\u65c1\u8f66\uff0c\u5df2\u91cd\u8dd1edit\u518d\u6e32\u67d3\uff0c\u800c\u975e\u76f4\u63a5\u590d\u7528\u65e7EDL"],"limitations":["\u4ec5\u6309\u97f3\u9891\u80fd\u91cf\u5207\u6362\uff0c\u4e0d\u505a\u4eba\u8138\u6216\u6784\u56fe\u8bc6\u522b\uff0c\u5b89\u9759\u4f46\u6784\u56fe\u597d\u7684\u673a\u4f4d\u4e0d\u4f1a\u88ab\u4f18\u5148\u9009\u4e2d","\u53ea\u8f93\u51fa\u786c\u5207\u4e0e\u5b9e\u5fc3\u753b\u4e2d\u753b\uff0c\u4e0d\u652f\u6301\u6de1\u5165\u6de1\u51fa\u3001\u900f\u660e\u5ea6\u8f6c\u573a\u6216\u5b57\u5e55","\u672a\u8fd0\u884c\u4efb\u4f55\u547d\u4ee4\uff0c\u6e32\u67d3\u901f\u5ea6\u4e0e\u6210\u7247\u8d28\u91cf\u672a\u5b9e\u6d4b","\u4ece\u957f4K\u539f\u7247\u4e2d\u95f4\u6bb5\u76f4\u63a5\u6e32\u67d3\u6781\u6162\uff0c\u9700\u5148\u9884\u5207\u7a97\u53e3\uff0c\u5305\u5185\u4ec5\u7ed9\u65b9\u6cd5\u672a\u7ed9\u811a\u672c"],"issues":["\u5b9e\u73b0\u4f9d\u8d56\u5916\u90e8polysync\u5305\uff0c\u5305\u5185\u672a\u9644\u6e90\u7801\u6216\u7248\u672c\u9501\u5b9a\uff0c\u63a5\u53e3\u53d8\u52a8\u53ef\u80fd\u5bfc\u81f4\u547d\u4ee4\u5931\u6548\uff0c\u5f85\u6838\u5b9e","\u5305\u5185\u672a\u63d0\u4f9b\u9884\u5207\u7a97\u53e3\u7684\u73b0\u6210\u811a\u672c\uff0c\u4ec5\u6587\u5b57\u63cf\u8ff0\uff0c\u9700\u7528\u6237\u81ea\u884c\u7f16\u5199ffmpeg\u547d\u4ee4","description \u63d0\u5230\u4f9d\u8d56wjs-syncing-multicam\u751f\u6210\u65c1\u8f66\uff0c\u8be5\u6280\u80fd\u672a\u968f\u5305\u63d0\u4f9b\uff0c\u9700\u53e6\u884c\u83b7\u53d6"],"missing_files":[]},"quality_url":"https://shiliuai.cn/api/v2/skills/jianshuo-wjs-editing-multicam-ce6411/files/SHILIU-QUALITY.md","usage_guide":{"task":"\u8bfb\u53d6\u5404\u673a\u4f4d\u7684.sync.json\u540c\u6b65\u4fe1\u606f\uff0c\u6309\u97f3\u9891\u80fd\u91cf\u751f\u6210EDL\uff0c\u518d\u6e32\u67d3\u4e3a\u786c\u5207\u6216\u753b\u4e2d\u753b\u591a\u673a\u4f4d\u6210\u7247\uff0c\u5e76\u5728\u6e32\u67d3\u524d\u5b8c\u6210Log\u3001\u65cb\u8f6c\u3001\u7ad6\u5c4f\u4e0e\u9519\u5cf0\u5f00\u673a\u7684\u68c0\u67e5\u3002","inputs":"2\u4e2a\u4ee5\u4e0a\u540c\u4e00\u4e8b\u4ef6\u7684\u539f\u59cb\u673a\u4f4d\u6587\u4ef6\uff08\u4fdd\u6301\u672a\u6539\u52a8\uff09\u53ca\u5404\u81ea\u540c\u540d.sync.json\u65c1\u8f66\u6587\u4ef6\uff1bffmpeg/ffprobe\u5728PATH\u4e2d\uff1b\u5df2\u5b89\u88c5polysync\u5305\uff1b\u786e\u8ba4\u8272\u5f69\u914d\u7f6e\uff08\u5982S-Log3\uff09\u3001\u662f\u5426\u9700\u8981\u65cb\u8f6c\u3001\u4ea4\u4ed8\u753b\u5e45\u4e0e\u97f3\u9891\u6e90\u673a\u4f4d\u3002","outputs":"edl.json\uff08\u542binputs\u3001deltas\u3001duration_sec\u3001audio_source\u3001coverage\u3001edl\u5206\u6bb5\uff09\u4e0e\u4e00\u4e2a\u6e32\u67d3\u51fa\u7684MP4\uff08\u786c\u5207\u6216\u786c\u5207\u52a0\u89d2\u843d\u753b\u4e2d\u753b\uff09\uff1b\u6e32\u67d3\u524d\u53ef\u5148\u8f93\u51fa2\u5206\u949f\u8bd5\u526a\u7247\u6bb5\u4f9b\u8bd5\u542c\u3002","example_input":"\u6211\u6709\u4e09\u53f0\u673a\u4f4d\u62cd\u540c\u4e00\u573a\u8bbf\u8c08\uff0c\u6587\u4ef6\u662fcam_a.MOV\u3001cam_b.MOV\u3001cam_c.MOV\uff0c\u65c1\u8fb9\u90fd\u6709.sync.json\u3002\u7d20\u6750\u662fS-Log3\u3001\u7ad6\u5c4f\u62cd\u6444\uff0c\u60f3\u89811080x1920\u7684\u786c\u5207\u6210\u7247\uff0c\u5148\u7ed9\u6211\u4e00\u4e2a2\u5206\u949f\u8bd5\u526a\u3002","example_output":"\u793a\u610f\uff08\u975e\u771f\u5b9e\u7ed3\u679c\uff09\uff1a\u5148\u751f\u6210\u8bd5\u526aedl.json\uff0c\u5b57\u6bb5\u542binputs\u4e09\u8def\u5f84\u3001deltas\u6570\u7ec4\u3001duration_sec\u7ea6120\u3001audio_source\u4e3a\u67d0\u673a\u4f4d\u7d22\u5f15\u3001coverage\u533a\u95f4\u4e0eedl\u5206\u6bb5\u5217\u8868\uff1b\u518d\u6e32\u67d3\u51fa\u8bd5\u526aMP4\u4f9b\u8bd5\u542c\uff0c\u786e\u8ba4\u540e\u518d\u5bf9\u5168\u957f\u7d20\u6750\u91cd\u8dd1edit\u5e76\u6e32\u67d3\u3002\u5b9e\u9645\u6570\u503c\u4ee5\u8fd0\u884c\u7ed3\u679c\u4e3a\u51c6\u3002"},"read_url":"https://shiliuai.cn/api/v2/skills/jianshuo-wjs-editing-multicam-ce6411","skill_url":"https://shiliuai.cn/api/v2/skills/jianshuo-wjs-editing-multicam-ce6411/files/SKILL.md","download_url":"https://shiliuai.cn/api/v2/skills/jianshuo-wjs-editing-multicam-ce6411/download","install_url":"https://shiliuai.cn/api/v2/skills/jianshuo-wjs-editing-multicam-ce6411/install","files":[{"path":"LICENSE","bytes":1082,"url":"https://shiliuai.cn/api/v2/skills/jianshuo-wjs-editing-multicam-ce6411/files/LICENSE"},{"path":"SHILIU-QUALITY.md","bytes":2137,"url":"https://shiliuai.cn/api/v2/skills/jianshuo-wjs-editing-multicam-ce6411/files/SHILIU-QUALITY.md"},{"path":"SKILL.md","bytes":12224,"url":"https://shiliuai.cn/api/v2/skills/jianshuo-wjs-editing-multicam-ce6411/files/SKILL.md"},{"path":"shiliu-quality.json","bytes":1937,"url":"https://shiliuai.cn/api/v2/skills/jianshuo-wjs-editing-multicam-ce6411/files/shiliu-quality.json"},{"path":"shiliu-source.json","bytes":272,"url":"https://shiliuai.cn/api/v2/skills/jianshuo-wjs-editing-multicam-ce6411/files/shiliu-source.json"},{"path":"usage.json","bytes":1229,"url":"https://shiliuai.cn/api/v2/skills/jianshuo-wjs-editing-multicam-ce6411/files/usage.json"}],"content":"---\nname: wjs-editing-multicam\ndescription: 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 \u2014 auto-switching between cams second-by-second on audio energy, with optional picture-in-picture inset. Triggers \u2014 \"auto-edit multicam\", \"\u505a\u4e2a\u526a\u8f91\", \"\u5207\u51e0\u4e2a\u673a\u4f4d\", \"\u628a\u8fd9\u51e0\u4e2a\u89c6\u9891\u5408\u6210\u4e00\u4e2a\", \"combine these angles\", \"PiP overlay\".\n---\n\n# wjs-editing-multicam\n\nCombine N synced camera angles into a single rendered MP4. Decisions are audio-energy-driven only \u2014 the cam with the loudest mic each second wins. Output is hard cuts (or hard cuts plus a corner PiP).\n\n## Setup & commands\n\nThe implementation lives in the open-source **`polysync`** pip package (<https://pypi.org/project/polysync/> \u00b7 <https://github.com/jianshuo/polysync>) \u2014 this skill no longer ships its own scripts. Install it, then drive it via its CLI:\n\n```bash\npython3 -m pip install -U polysync      # needs ffmpeg/ffprobe on PATH\n\npolysync edit        CAM_A CAM_B CAM_C --out edl.json   # build the decision list\npolysync render-cuts edl.json --out out.mp4             # hard cuts\npolysync render-pip  edl.json --out out.mp4 --pip bottom-right   # cuts + corner inset\n```\n\n`edit` and the renderers read each input's `.sync.json` automatically. Sync first with **wjs-syncing-multicam** (`polysync sync`) if the sidecars don't exist yet.\n\nRender flags for raw camera footage (see **Preflight** below for when to use each):\n\n```bash\n# Sony S-Log3 footage, shot vertical, FX6 cams turned on their side, for \u5c0f\u7ea2\u4e66:\npolysync render-cuts edl.json --out out.mp4 \\\n    --log slog3 \\           # S-Log3/S-Gamut3.Cine -> Rec.709 grade\n    --rotate 1:90 --rotate 2:90 \\   # rotate cam1,cam2 90\u00b0 CW (FX6 with no flag)\n    --width 1080 --height 1920 --fill \\   # vertical, crop-to-fill (no black bars)\n    --duck-audio --audio-cams 0,1        # clean speaker-gated audio (cams 0,1 = the two lavs)\n```\n\n`--duck-audio` replaces the single-cam soundtrack with a speaker-gated mix: each moment keeps the active speaker's close mic and ducks the rest (much cleaner than a constant 2-mic sum, which piles up bleed/room tone). `--audio-cams 0,1` restricts gating to the real speaker mics \u2014 **always exclude the wide/room cam**, whose mic sits at a similar level but is reverby and would otherwise get picked. (See the editing-quality note below for the why.)\n\n## Preflight \u2014 ALWAYS check raw footage before rendering (hard-won)\n\nStraight-off-the-card footage renders WRONG without these checks. Spend 2 minutes here or you'll render the whole thing broken (we did).\n\n1. **Color profile (Log).** Sony FX3/FX6 default to **S-Log3 / S-Gamut3.Cine** \u2014 flat, grey, low-contrast. It MUST be converted to Rec.709 or it looks washed-out and broken. Check the `.XML` sidecar's `CaptureGammaEquation` (`s-log3-cine`) or `ffprobe -show_entries stream=color_transfer`. Fix: `--log slog3`. (Performance: the LUT is applied AFTER downscale automatically \u2014 a 3D LUT on 4K is ~4x slower than on 1080p for an identical result.)\n2. **Orientation.** Phone / vertically-mounted shoots record rotated. Extract one frame per cam (`ffmpeg -ss 200 -i CAM -frames:v 1 f.jpg`) and LOOK. Some cameras (FX3) write a rotation flag \u2192 ffmpeg auto-rotates, fine. Others (FX6 physically turned on its side) write **no flag** \u2192 people come out lying down. Fix per-cam: `--rotate 1:90` (90 = clockwise; try 270 if upside-from-the-other-side).\n3. **Delivery orientation.** \u5c0f\u7ea2\u4e66 / Reels / Shorts are **vertical** \u2014 and this footage is usually shot vertical. Render `--width 1080 --height 1920 --fill`. Default (1920\u00d71080, pad) is for landscape only; mixing a portrait source into a landscape frame pillarboxes it (ugly black side bars).\n4. **Staggered camera starts.** Cameras rarely roll at the same instant; the sidecar `delta`/coverage shows it. The opening N seconds may be single-cam (only the first-rolling camera covers t=0). That's unavoidable \u2014 expect a single-cam intro of `max(delta)` seconds.\n\n## Editing quality \u2014 when `polysync edit` isn't enough\n\n`polysync edit` switches to the **loudest mic** per second. With **close, bleeding mics** (each cam's mic also picks up the other speaker loudly), the close/guest mic stays loudest even when the *other* person talks, so the editor over-selects that cam and the cuts don't track the real speaker. Two fixes, applied by hand on the EDL when \"cut to the correct speaker\" matters:\n\n- **Per-mic baseline-normalized speaker attribution.** Per second, subtract each mic's own median energy, then pick whichever mic is *highest relative to its own baseline* \u2192 that's who's actually talking. (polysync's raw `cam[k] - mean(others)` doesn't remove the per-mic baseline offset, so it favors the loud mic.)\n- **Cutaways for rhythm (\u526a\u8f91\u611f).** Audio attribution alone gives long static holds. Cap any single shot (~8\u201310 s) and insert ~3 s cutaways to the **listener** (reaction shot) and the **wide** cam, alternating. The wide cam's quiet mic means the editor never picks it on energy \u2014 inject it deliberately for establishing / \u6574\u4f53.\n\n## What this skill IS \u2014 and IS NOT\n\n| Is | Is not |\n|---|---|\n| Audio-energy-driven cam switching | Face / framing detection (no face_recognition, no MediaPipe) |\n| Single-source audio (one cam's mic) | Multi-mic mix / per-speaker gating |\n| Hard cuts, with optional PiP inset | Crossfades / opacity transitions / sliding animations |\n| `ffmpeg` concat + `overlay` filter renders | HyperFrames composition / `<hf-clip>` |\n| Coverage-aware (won't pick a cam outside its sidecar window) | Frame-accurate beat alignment / VAD-edge cuts |\n\nIf you need face tracking, fade transitions, captions, or HyperFrames composition, use the **hyperframes** skill on top of this skill's MP4 output.\n\n## REQUIRED INPUT\n\n**Original camera files (untouched) plus their `.sync.json` sidecars next to them.** If sources aren't synced yet, run **wjs-syncing-multicam** first to write the sidecars. Missing sidecar = cam assumed at delta=0, full coverage.\n\n`polysync edit` reads each sidecar for `delta_seconds` + `overlap_in_reference`, lifts the cam's audio envelope into the reference timeline, and only schedules a cam during its coverage window. `polysync render-cuts` / `polysync render-pip` apply `ffmpeg -itsoffset` per input using the EDL's `deltas[]` array.\n\n## When NOT to use\n\n- One source \u2014 nothing to switch between; use **video-segmentation**.\n- Polished NLE timeline already exists \u2014 don't fight the editor.\n- Want fade transitions / overlay captions / brand title cards \u2014 run this skill first to get the cut-down MP4, then feed it into **wjs-overlaying-video** or **hyperframes**.\n\n## Pipeline\n\n1. Read each input's sidecar \u2192 list of `delta_seconds[k]` + `overlap_in_reference[k]`.\n2. Extract per-cam mono PCM @ 16 kHz from the original file.\n3. Log-RMS envelope at 1 Hz frame rate (per-second).\n4. **Lift each envelope into reference timeline** by indexing at `t_ref - delta_k`; uncovered seconds become `-inf` so they're never picked.\n5. **Audio source** = the cam with the largest envelope spread (90th \u2212 10th percentile over its covered seconds), with a small bonus for coverage fraction.\n6. **Score per second**: `cam[k] - mean(other covered cams)`. Highest score = best active-speaker candidate.\n7. **Editor decides EDL** \u2014 two modes:\n   - `rotation` (default): random dwell in [`min_dwell=8`, `max_dwell=15`] s, pick best-scoring covered cam (\u2260 current) at each cut.\n   - `greedy`: hysteresis \u2014 hold current unless another cam's lookahead-window score beats it by `--switch-threshold`. Floor `min_dwell=4`, ceiling `max_dwell=18`.\n   Both force-switch if the active cam exits its coverage window mid-shot. If no cam covers `t=0` (overlap windows that start a few seconds in), the editor opens at the first covered second and backfills the lead-in with cam 0.\n8. Emit EDL JSON.\n\n## EDL schema (`edl.json`)\n\n```json\n{\n  \"_about\": \"EDL produced by polysync.edit.autoedit. Times in reference timeline. Render commands apply ffmpeg -itsoffset deltas[k] per input.\",\n  \"_help\": {\n    \"inputs\":        \"Original media paths, in cam-index order (cam 0, cam 1, ...).\",\n    \"deltas\":        \"Per-cam delta_seconds from each sidecar. Render uses ffmpeg -itsoffset deltas[k].\",\n    \"duration_sec\":  \"Output duration in reference timeline.\",\n    \"audio_source\":  \"Cam index whose audio track becomes the master. Single source \u2014 not a mix.\",\n    \"coverage\":      \"[start, end] per cam in reference timeline.\",\n    \"edl\":           \"List of {cam, start, end} segments. Times are reference-timeline seconds.\"\n  },\n  \"inputs\":       [\"cam_a.MOV\", \"cam_b.MOV\"],\n  \"deltas\":       [0.0, 12.345],\n  \"duration_sec\": 4512,\n  \"audio_source\": 0,\n  \"coverage\":     [[0.0, 4512.0], [12.345, 4499.835]],\n  \"edl\":          [{\"cam\": 0, \"start\": 0, \"end\": 13}, {\"cam\": 1, \"start\": 13, \"end\": 28}, ...]\n}\n```\n\n`polysync edit` writes `_about` + `_help` directly into the file so opening the JSON in any editor explains itself.\n\n## Render\n\n| Command | What it does |\n|---|---|\n| `polysync render-cuts` | Hard cuts only. `concat` filter graph over per-segment `trim+scale+pad`. Audio = `audio_source` cam, trimmed to first EDL row's start. |\n| `polysync render-pip` | Hard cuts + corner picture-in-picture overlay. Main cam = EDL row's `cam`; PiP cam picked round-robin (or via per-row `pip` field). PiP is scaled to `--pip-width` (default 480 px), placed in a configurable corner with optional white border. **No fade / no opacity \u2014 solid block on/off.** |\n\nBoth apply `-itsoffset deltas[k]` per input.\n\n## Brainstorm before running\n\nThree real knobs to confirm with the user:\n\n- **Pacing** \u2014 `--mode rotation` (varied dwell, easier on the ear) vs `--mode greedy` (energy-following, snappier).\n- **PiP** \u2014 yes / no. If yes, which corner + width?\n- **Min cut length** \u2014 `--min-dwell` floor. 8 s default for rotation is conservative; talking-heads can go to 4.\n\n`audio_source` is auto-picked; override with `--audio-source <cam-index>` if the auto-pick sounds wrong on a 30 s listen.\n\n## File layout\n\n```\nworking_dir/\n  cam_a.MOV                 # ORIGINAL, untouched\n  cam_a.MOV.sync.json       # from wjs-syncing-multicam\n  cam_b.MOV                 # ORIGINAL, untouched\n  cam_b.MOV.sync.json\n  edl.json                  # from `polysync edit`\n  multicam_render.mp4       # from `polysync render-cuts` OR `polysync render-pip`\n```\n\n## Common pitfalls\n\n- **Trusting `audio_source` without listening.** Spread + coverage is a proxy. Always sample a 30 s clip before committing \u2014 a high-spread track can still be clipped / distorted.\n- **Running `polysync edit` on the full 75 min before tuning.** Run on a 2-min slice first (`ffmpeg -ss A -t 120` an extract per cam), listen, adjust `--min-dwell` / `--mode`, then commit to full length.\n- **Expecting face-driven framing.** This skill doesn't see the video \u2014 only the audio. If one cam is well-framed but quiet, the editor won't favor it. Use `--audio-source` + per-segment `pip` overrides as the manual escape hatch.\n- **Re-rendering when sync was wrong.** EDL bakes in `deltas[]` at edit time. If you fix the sidecars later, re-run `polysync edit` to regenerate the EDL before re-rendering.\n- **Rendering a mid-video window straight from the long 4K originals = brutally slow.** `polysync render-cuts` trims in the filter graph (`trim=start=\u2026`) with **no input `-ss` seek**, so for a clip whose EDL starts deep in the source (e.g. a 90 s segment 28 min into a 34 min file) ffmpeg DECODES the 4K from t=0 to reach the window \u2014 ~20 min for a 92 s clip. Fix: **pre-cut each cam's window first with accurate fast seek** (`ffmpeg -ss <start-2> -i src -ss 2 -t <dur> \u2026` \u2014 fast-seek to 2 s before, then accurate-decode 2 s), already rotated + graded + scaled to the target frame, then concat the multicam EDL on those short prepared windows (0-based times, cheap). All cams cut to the SAME reference window (`source-local start = ref_start - delta_k`) so they stay in sync. This is how `/wjs-segmenting-video` should render multicam segments \u2014 never feed a mid-video absolute-time EDL to a from-zero decode.\n","usage":"\u8bfb\u53d6 SKILL.md\uff0c\u5e76\u6309\u9700\u8bfb\u53d6\u914d\u5957\u6587\u4ef6\uff1b\u4e0b\u8f7d ZIP \u83b7\u53d6\u5b8c\u6574\u5305\u3002\u6280\u80fd\u662f\u4efb\u52a1\u65b9\u6cd5\uff0c\u4e0d\u6388\u4e88\u65b0\u589e\u8d26\u6237\u3001\u4ed8\u8d39\u6216\u7cfb\u7edf\u6743\u9650\u3002"}
