{"id":16534,"plugin_id":"plugins_6a50b49006148191a10a308fbfb6bf7c","kind":"skill","collection_source":null,"comparison_source":null,"observed_at":"2026-09-30T23:13:30.056Z","digest":"0a707bd6eba0abd3544c78359c61da491d0e382c2e4ec2030654c657802b4980","against":null,"payload":{"description":"Video editing: edit existing footage from any source; trim, reorder, reframe, retime and mix sound into a finished video. Local edits need no PixVerse login.","included_files":[{"relative_path":"agents/openai.yaml","size_in_bytes":324},{"relative_path":"references/composition-contract.md","size_in_bytes":3002},{"relative_path":"references/local-editing.md","size_in_bytes":4195}],"name":"pixverse-video-editing","skill_md_contents":"---\nname: pixverse-video-editing\ndescription: \"Video editing: edit existing footage from any source; trim, reorder, reframe, retime and mix sound into a finished video. Local edits need no PixVerse login.\"\n---\n\n# Video Editing\n\nEdit the supplied footage directly, including clips made outside PixVerse. Keep source files\nintact and write a new master under `projects/<slug>/deliverables/`. A request to cut, reframe\nor mix existing media needs no PixVerse login, model lookup, generation queue or paid preflight.\nUse FFmpeg/ffprobe for local edits and preserve the supplied source media.\n\nFor layered layouts, animated overlays or revision of an existing FFmpeg edit, read\n`./references/composition-contract.md`. It preserves source intervals, timing, audio\nownership and reproducible render files. Keep unrelated existing edits intact.\n\n## Fast Path For Existing Footage\n\nWork from usable footage already supplied or obtained by Codex. If the user supplies a\nwebpage link, Codex chooses how to acquire the material with its available tools before\nediting here. Reuse any reference notes that are already available.\n\n1. Inspect available files and needed stream metadata in one local call. Reuse known duration,\n   dimensions and sound decisions. View/listen only where the requested edit needs judgment.\n2. Translate the brief into source intervals, order, output aspect and sound treatment. For a\n   simple trim, the request itself is the edit plan. For several shots, save a compact cut list\n   with source path, in/out seconds, output position, overlays and audio treatment.\n3. Render with FFmpeg. Use `./references/local-editing.md` for accurate trims,\n   mixed-format assembly, reframing and speed changes. Batch compatible operations into one\n   render rather than repeatedly encoding a clip.\n4. Return the actual output file and the cut list or render source. Verify the requested change:\n   for example, duration for a trim or subject framing for a vertical crop. Add other checks\n   only when the edit requires them or the user requests review.\n\nFor reference-based editing, reuse timecoded notes already supplied by the user or Codex;\nthere is no prerequisite PixVerse analysis workflow. For captions use `../pixverse-captions/SKILL.md`; for exact animated layers use\n`../pixverse-motion-design/SKILL.md`; for inserts, boards, stickers and sounds that must land on\nspoken words, use `../../skills-shared/anchored-composition.md` (`\"${PVX}\" timeline render`). Read `../../skills-shared/audio-craft.md` for a sound rebuild,\nnot for every trim. Only missing generated media enters the CLI contract below.\n\n## Installed Command\n\nBefore running helper commands, resolve the absolute plugin root from this `./SKILL.md` path: it is two directories above this skill directory and contains `.codex-plugin/plugin.json`. In every new shell session, set:\n\n```bash\nPVX=\"<absolute-plugin-root>/scripts/pvx\"\n```\n\nRun helper commands through `\"${PVX}\"`. Do not assume the user's current working directory is the plugin checkout, and do not bypass the installed wrapper with a module invocation.\n\n## CLI Execution\n\nApply `../../skills-shared/quality-policy.md` to all generated images/videos: Sunburst 2K/high,\nSeedance 2.5 1080p with automatic prompt enhancement, and an explicit upgrade/fallback\nchoice for Free/Basic or model-entitlement rejection.\n\nFor an explicitly selected Canvas project or node, read\n`../../skills-internal/pixverse-agent-canvas/SKILL.md` first and follow its Canvas\npreflight and delivery contract; the ordinary queue/local route below does not replace it.\n\nWhen the edit requires new generated media, read `../../skills-shared/cli-workflow.md` before\nthat generation. It contains the existing account-aware routing, paid-work\nconfirmation, progress, preview and project-handoff rules. Studio and Production are\nnot prerequisites. The shared account, confirmation and direct-medium rules govern the\nexamples and defaults below. Read the gateway only when writing manual CLI commands or queue specs.\nCreation command examples below are queue-task fragments, not permission to submit paid\n`pixverse create` commands directly.\n\n## Canvas Boundary\n\nApply this boundary only after the current target has been resolved as Canvas under\n`../../skills-internal/pixverse-agent-canvas/SKILL.md`. For that Canvas target, inspect the current Canvas capabilities and\nnode schemas before downloading assets or invoking FFmpeg, then use Canvas-native editing nodes and\nexisting graph connections whenever they can express the requested composition.\n\nFor every non-Canvas project—including ordinary PixVerse queues, standalone local assets, and local\ndeliverables—do not run Canvas discovery or change the established local editing route. The recipes\nbelow remain the default and behave as before. They also remain available as an explicit Canvas\nfallback; they do not override the Canvas-native-first rule once Canvas is the selected target.\n\nDo not download, locally edit, and re-upload media that already exists in Canvas merely because a\nlocal recipe is available. If Canvas lacks a required operation or the user explicitly requests a local\nmaster, keep intermediates local and upload only the final result once if later Canvas work actually\nneeds it.\n\n## Common Tasks\n\n- download PixVerse assets\n- stitch multiple clips\n- add background music\n- overlay narration\n- strip rejected generated audio\n- rebuild sound from separate voice, music, ambience, and SFX stems\n- burn subtitles\n- trim starts/ends\n- create final deliverable folder\n- verify the requested edit\n\n## Subtitle And TTS Sync\n\nFor narrated videos, use actual audio as the clock and keep one canonical timed subtitle file for rendering. An SRT entry looks like:\n\n```text\n1\n00:00:00,000 --> 00:00:03,200\nFirst spoken subtitle line\n```\n\nWorkflow:\n\n- Reuse accepted audio, or produce narration in natural sections through `../pixverse-voiceover/SKILL.md`. Write `projects/<slug>/prompts/narration.srt` from verified words and actual timing through `../pixverse-captions/SKILL.md`.\n- Keep entries readable in one or two lines with sensible phrase boundaries. Match the requested typography; clean display punctuation only when that style is desired, retaining the spoken source text.\n- Inspect the timed captions: `\"${PVX}\" subtitles inspect projects/<slug>/prompts/narration.srt`.\n- For an explicit fixed-window take list, `\"${PVX}\" subtitles voice-queue projects/<slug>/prompts/narration.srt projects/<slug>/voice-queue.json --project <slug> --segments-dir projects/<slug>/prompts/tts-segments --voice-id <voice_id> --language zh` can prepare separate takes. It is not the default for every captioned film; preserve the voice model's natural speed unless the user requests a speed change.\n- Quote and confirm a new voice queue before running it. Do not create voice tasks for a caption-only change.\n- Measure each returned take. Align the final subtitle windows to speech, or fit explicitly timed takes to their required windows without clipping words. One caption does not need to own one voice asset.\n- Burn subtitles from the same SRT, or convert the same SRT to ASS for style. Use the plugin default subtitle style unless the user asks for a different look.\n- If speech and picture lengths differ, align captions to real speech and trim only verified\n  idle padding. Fixed-window narration follows its voiceover recipe; do not tempo-shift or\n  cut words merely to pass its timing gate. Explicit user-requested retiming remains available.\n\nExample burn-in:\n\nThis example explicitly replaces the soundtrack with accepted narration. For a caption-only\nchange, preserve the existing audio and use the captions workflow instead.\n\n```bash\n\"${PVX}\" subtitles style\n\"${PVX}\" subtitles style --format force-style\nffmpeg -nostdin -n -i video.mp4 -i voice.mp3 -vf \"subtitles=projects/<slug>/prompts/narration.srt:force_style='<force_style_from_pvx>'\" -map 0:v -map 1:a -c:v libx264 -c:a aac out.mp4\n```\n\nDefault burn-in style for 1080p horizontal delivery is intentionally restrained: `Fontsize=18`, `MarginV=28`, bottom-centered, white text, small dark outline. Do not improvise oversized subtitle text such as `Fontsize=34` or larger for normal subtitles; reserve larger type for title cards or intentional on-screen typography.\n\n## Download\n\n```bash\n\"${PVX}\" pixverse asset download <id> --type video --dest ./projects/<slug>/assets/videos\n\"${PVX}\" pixverse asset download <id> --type audio --dest ./projects/<slug>/assets/audio\n```\n\n## Stitch With FFmpeg\n\nFor an ordered non-Canvas PixVerse story run, prefer the integrated local path:\n\n```bash\n\"${PVX}\" story assemble <slug> --output projects/<slug>/deliverables/final-story.mp4 --sample-frames\n```\n\nIt resolves `shot-*` assets from the latest billing ledger, downloads missing clips, re-encodes a compatible H.264/AAC timeline, runs duration QA, samples the full timeline, and records the result. Use the manual FFmpeg forms below for custom clip order, mixed formats, transitions, or sound rebuilds.\n\nFor streams with matching codec, dimensions, frame rate, time base and audio layout,\ncreate a concat list (escape quote characters in actual paths):\n\n```text\nfile 'clip1.mp4'\nfile 'clip2.mp4'\n```\n\nThen:\n\n```bash\nffmpeg -nostdin -n -f concat -safe 0 -i list.txt -c copy ./projects/<slug>/deliverables/final.mp4\n```\n\nIf streams differ, normalize each clip before concatenating; see\n`./references/local-editing.md`. Merely changing the output codec after a concat demuxer\ndoes not normalize incompatible source dimensions or stream layouts.\n\n## Add BGM\n\nKeep music lower than dialogue. For a clip with an existing audio stream, this simple\noverlay keeps that soundtrack and limits the mix to its duration:\n\n```bash\nffmpeg -nostdin -n -i video.mp4 -i music.mp3 -filter_complex \"[1:a]volume=0.18[a1];[0:a][a1]amix=inputs=2:duration=first:dropout_transition=2[a]\" -map 0:v -map \"[a]\" -c:v copy -c:a aac out.mp4\n```\n\nWhen the source has no audio, map the music directly and bound it to the video duration.\nChoose trim, fade, silence or a loop deliberately when the music is shorter; do not reference\na nonexistent `[0:a]` or let `-shortest` accidentally cut the picture.\n\n## Rebuild Rejected Audio\n\nIf generated video audio contains unwanted music, bad ambience, or unusable SFX, strip it first:\n\n```bash\nffmpeg -nostdin -n -i video.mp4 -map 0:v -c:v copy -an picture-clean.mp4\n```\n\nFor serious sound work, prepare `development/sound-cue-sheet.md` before mixing:\n\n| Time | Visual beat | Stem | Source file | Mix note |\n|---|---|---|---|---|\n| 00:00-00:02 | door opens | hinge creak | assets/sfx/hinge.wav | quiet, left |\n| 00:02-00:06 | town exterior | ambience | assets/sfx/night-town.wav | low bed |\n\nDo not bury a rejected generated audio track under BGM. Replace it with controlled stems or deliver a clean temp mix and state which stems are still missing.\n\n## Targeted Verification\n\nInspect the requested edit, not a compulsory full production checklist. Duration, dimensions\nand audio-stream presence can be checked with ffprobe; cut continuity, legibility and audible\nmixing require viewing or listening when those operations were requested. For explicit QA or\na named specialized check, read `../../skills-internal/pixverse-agent-quality/SKILL.md` and use:\n\n```bash\n\"${PVX}\" qa inspect ./projects/<slug>/deliverables/final.mp4 --project <slug> --sample-frames\n```\n\n## Checks By Edit Type\n\n- Cut/assembly: requested intervals and order, expected duration, no unintended black gaps.\n- Reframing: requested dimensions, correct pixel aspect, important subjects still visible.\n- Sound: retained/replaced/removed as requested; listen if mixing or synchronization changed.\n- Captions: measured speech timing, readable type, safe placement and requested typography.\n- Handoff: actual master path; include editable sources when requested and record multi-stage\n  project decisions for continuation. Name the FFmpeg source list, timing data and filter graph.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}