@pixerate/editor 0.79.0 → 0.81.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -3
- package/dist/agent/index.cjs +102 -6
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.d.cts +4 -2
- package/dist/agent/index.d.ts +4 -2
- package/dist/agent/index.js +101 -5
- package/dist/agent/index.js.map +1 -1
- package/dist/{builtins-BKYlHH1s.d.ts → builtins-CV1fDj64.d.ts} +5 -1
- package/dist/{builtins-1kqwLUnb.d.cts → builtins-c4w0eAYl.d.cts} +5 -1
- package/dist/{chunk-2CJ3LPYQ.js → chunk-424H3P4I.js} +13 -295
- package/dist/chunk-424H3P4I.js.map +1 -0
- package/dist/{chunk-UN33YOXW.cjs → chunk-PA5S7KPC.cjs} +293 -2
- package/dist/chunk-PA5S7KPC.cjs.map +1 -0
- package/dist/{chunk-IB3ZHQAX.js → chunk-PTYWCFFW.js} +29 -4
- package/dist/chunk-PTYWCFFW.js.map +1 -0
- package/dist/{chunk-JQ3BB3E6.js → chunk-PXDEFEG2.js} +293 -2
- package/dist/chunk-PXDEFEG2.js.map +1 -0
- package/dist/{chunk-YU4WQE5M.cjs → chunk-TAPXWP2B.cjs} +95 -377
- package/dist/chunk-TAPXWP2B.cjs.map +1 -0
- package/dist/{chunk-HXDMZQTD.cjs → chunk-TPOT575P.cjs} +29 -4
- package/dist/{chunk-IB3ZHQAX.js.map → chunk-TPOT575P.cjs.map} +1 -1
- package/dist/commands/index.cjs +2 -2
- package/dist/commands/index.d.cts +1 -1
- package/dist/commands/index.d.ts +1 -1
- package/dist/commands/index.js +1 -1
- package/dist/generation/index.cjs +932 -791
- package/dist/generation/index.cjs.map +1 -1
- package/dist/generation/index.d.cts +266 -240
- package/dist/generation/index.d.ts +266 -240
- package/dist/generation/index.js +926 -785
- package/dist/generation/index.js.map +1 -1
- package/dist/image-editor/index.cjs +266 -2
- package/dist/image-editor/index.cjs.map +1 -1
- package/dist/image-editor/index.d.cts +12 -1
- package/dist/image-editor/index.d.ts +12 -1
- package/dist/image-editor/index.js +265 -1
- package/dist/image-editor/index.js.map +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +16 -16
- package/dist/spreadsheet/index.cjs +3 -3
- package/dist/spreadsheet/index.cjs.map +1 -1
- package/dist/spreadsheet/index.js +16 -16
- package/dist/video-editor/index.cjs +461 -101
- package/dist/video-editor/index.cjs.map +1 -1
- package/dist/video-editor/index.d.cts +67 -3
- package/dist/video-editor/index.d.ts +67 -3
- package/dist/video-editor/index.js +426 -66
- package/dist/video-editor/index.js.map +1 -1
- package/package.json +3 -1
- package/skills/README.md +55 -0
- package/skills/pixerate-agent-tools/SKILL.md +75 -0
- package/skills/pixerate-animation-editor/SKILL.md +155 -0
- package/skills/pixerate-animation-editor/references/commands.md +123 -0
- package/skills/pixerate-canvas/SKILL.md +230 -0
- package/skills/pixerate-chart/SKILL.md +190 -0
- package/skills/pixerate-diagram/SKILL.md +134 -0
- package/skills/pixerate-generation/SKILL.md +109 -0
- package/skills/pixerate-image-editor/SKILL.md +139 -0
- package/skills/pixerate-parameters/SKILL.md +83 -0
- package/skills/pixerate-rich-text/SKILL.md +160 -0
- package/skills/pixerate-spreadsheet/SKILL.md +146 -0
- package/skills/pixerate-vector/SKILL.md +191 -0
- package/skills/pixerate-vector/references/commands.md +138 -0
- package/skills/pixerate-video-editor/SKILL.md +173 -0
- package/dist/chunk-2CJ3LPYQ.js.map +0 -1
- package/dist/chunk-HXDMZQTD.cjs.map +0 -1
- package/dist/chunk-JQ3BB3E6.js.map +0 -1
- package/dist/chunk-UN33YOXW.cjs.map +0 -1
- package/dist/chunk-YU4WQE5M.cjs.map +0 -1
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pixerate-video-editor
|
|
3
|
+
description: How to edit video projects in the Pixerate non-linear video editor through its agent tools - adding video, audio and image assets, building a rough cut on video and audio tracks, inserting, overwriting, moving, trimming, splitting and ripple-deleting clips, slip, slide and roll edits, lift and extract of a time range, razor cuts across tracks, sync-locked tracks, keyframed opacity, volume and transform, closing gaps, titles and colour clips, fades, volume and speed, crossfade, dip and wipe transitions with handles, J and L cuts, markers, checking the project, rendering frames and contact sheets, and exporting an ffmpeg command or a CMX 3600 EDL. Use when video tools such as get_video_project, add_video_clip or edit_video are available, or when asked to cut, trim, assemble, sequence or export footage on a timeline.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Pixerate video editor
|
|
7
|
+
|
|
8
|
+
A project is plain JSON: frame size, `fps`, a background, **assets** (video, audio or image
|
|
9
|
+
files with a `src` and, for video and audio, a `duration`), **tracks** listed top to bottom
|
|
10
|
+
(video tracks hold media, titles and colour clips; audio tracks hold sound; an earlier video
|
|
11
|
+
track draws over a later one), and **markers**. A clip has a `start` and `duration` on the
|
|
12
|
+
timeline; a media clip also has an `in` point into its asset, `speed`, `volume`, `muted`;
|
|
13
|
+
every clip can have `fadeIn`, `fadeOut`, `opacity`, `fit` and `transform`, and a
|
|
14
|
+
`transition` from the clip that ends where it starts on the same track.
|
|
15
|
+
|
|
16
|
+
All times are milliseconds on the timeline (or into the source for `in`). Ids: tracks look
|
|
17
|
+
like `v1` / `a1`, clips like `c1`, markers `m1`; you may set your own ids when adding. Read
|
|
18
|
+
them from `get_video_project`; never invent them.
|
|
19
|
+
|
|
20
|
+
For errors, namespaced tool names and undo conventions, see `pixerate-agent-tools`.
|
|
21
|
+
|
|
22
|
+
## Working method
|
|
23
|
+
|
|
24
|
+
1. **Read.** `get_video_project` for settings, assets, tracks, clips (with end and source
|
|
25
|
+
range), markers and issues. Set frame size and `fps` first with `set_video_settings` if
|
|
26
|
+
the project is new; changing them later shifts frame-based limits.
|
|
27
|
+
2. **Bring in media.** `add_video_asset` for each file with `kind`, `src` and the source
|
|
28
|
+
`duration` (without it trims cannot be checked and `check_video_project` warns
|
|
29
|
+
`unknown-duration`). Give `poster` for video so rendered frames show a picture.
|
|
30
|
+
3. **Mark structure.** `add_video_marker` at beats, sections or review notes; clip edges snap to
|
|
31
|
+
markers in the UI and markers make `seek_video` targets.
|
|
32
|
+
4. **Assemble in one batch.** Use `edit_video` for a rough cut: `add_asset`, `add_track`, then
|
|
33
|
+
`add_clip` ops in order, with explicit clip ids so later ops (trim, transition) can name
|
|
34
|
+
them. Run it with `dry_run: true` first; the error names the failing op.
|
|
35
|
+
5. **Refine** with the single tools: `trim_video_clip`, `split_video_clip`, `move_video_clip`,
|
|
36
|
+
`update_video_clip`, `set_video_transition`, `delete_video_clips` / `close_video_gaps`; for
|
|
37
|
+
timing between shots use the trim modes an editor would: `roll_video_edit` (move a cut),
|
|
38
|
+
`slip_video_clip` (change what a shot shows), `slide_video_clip` (move a shot between its
|
|
39
|
+
neighbours); for a whole stretch, `split_video_at`, `lift_video_range` or
|
|
40
|
+
`extract_video_range`. Animate opacity, volume or position with `set_video_keyframes`.
|
|
41
|
+
6. **Check.** `check_video_project` and fix every error and warning; `find_video_gaps` for
|
|
42
|
+
unintended black or silence.
|
|
43
|
+
7. **Look and listen.** `get_video_frame` at cuts and transitions for layers and audio gains as
|
|
44
|
+
numbers; `render_video_frame` with `times` for a contact sheet of the sequence. Render
|
|
45
|
+
after a batch, not after every edit.
|
|
46
|
+
8. **Export** when asked: `export_video_ffmpeg` (a command to run, not a render) or
|
|
47
|
+
`export_video_edl` (one track) for finishing elsewhere. Read the returned notes.
|
|
48
|
+
|
|
49
|
+
## Best practices
|
|
50
|
+
|
|
51
|
+
- **Cut on action.** Place a cut during a movement (a turn, a door opening) so continuity of
|
|
52
|
+
motion hides it; `split_video_clip` at the action, then trim the outgoing and incoming
|
|
53
|
+
sides.
|
|
54
|
+
- **Avoid jump cuts.** Two consecutive shots of the same subject from nearly the same framing
|
|
55
|
+
read as a glitch. Change angle or size, cover the cut with B-roll on a higher video track,
|
|
56
|
+
or make it deliberate.
|
|
57
|
+
- **J and L cuts.** Let sound lead or trail the picture: put the media's sound on an audio
|
|
58
|
+
track (a clip of the same video asset), mute the video clip (`muted: true`), and then
|
|
59
|
+
`roll_video_edit` the audio cut earlier (J) or later (L) than the picture cut. This smooths
|
|
60
|
+
dialogue and scene changes.
|
|
61
|
+
- **Transitions sparingly.** A straight cut is the default. Use `crossfade` for passage of time
|
|
62
|
+
or a soft scene change, `dip` (to black, or a `color`) for a section break, `wipe` rarely.
|
|
63
|
+
Keep them short (300-1000 ms). Crossfades and wipes need handles: half the duration of
|
|
64
|
+
unused media past the cut on both clips; `dip` needs none.
|
|
65
|
+
- **Insert vs overwrite.** `add_video_clip` and `move_video_clip` take `mode`: `refuse`
|
|
66
|
+
(default; the error names the next free place), `overwrite` (replace what is underneath, like
|
|
67
|
+
an overwrite edit) or `insert` (push later material along). Use `ripple: true` on trim and
|
|
68
|
+
delete, and `extract_video_range` rather than `lift_video_range`, to keep everything after
|
|
69
|
+
the edit in sync with no gap. Ripple and insert move every unlocked sync-locked track, so
|
|
70
|
+
dialogue and its picture stay together; turn `syncLocked` off with `update_video_track` for a
|
|
71
|
+
music bed that should stay put.
|
|
72
|
+
- **Trim with the right tool.** To change *when* a cut happens without moving anything else,
|
|
73
|
+
`roll_video_edit`; to change *which* moment a shot shows, `slip_video_clip`; to move a shot
|
|
74
|
+
earlier or later between two others, `slide_video_clip`. All three keep the timeline
|
|
75
|
+
gapless and report the delta they actually applied (clamped to available media).
|
|
76
|
+
- **Keyframes sparingly.** Use `set_video_keyframes` for a push-in (`scale` 1 to 1.1 over the
|
|
77
|
+
shot), a duck under dialogue (`volume`), or a fade that is not at an edge; ease (`ease-in-out`)
|
|
78
|
+
rather than linear for motion. Simple fades at the clip edges are `fadeIn` / `fadeOut`.
|
|
79
|
+
- **Close gaps.** Unintended gaps play as background colour and silence. `find_video_gaps`, then
|
|
80
|
+
`close_video_gaps` or ripple deletes. Leave gaps only where you want black.
|
|
81
|
+
- **Cut on frames.** Put starts, trims and splits on frame boundaries (multiples of 1000 / fps
|
|
82
|
+
ms; 41.667 at 24 fps, 33.333 at 30). Edits do not round for you.
|
|
83
|
+
- **Audio levels.** Dialogue is the reference; keep music under it (volume around 0.2-0.4 under
|
|
84
|
+
speech, more between lines) and avoid gains above 1 that clip. Per-clip `volume` and track
|
|
85
|
+
`volume` multiply. Give every audio clip that starts or ends mid-sound a short `fadeIn` /
|
|
86
|
+
`fadeOut` (10-50 ms) to avoid clicks; fade music beds over 1-3 s.
|
|
87
|
+
- **Titles.** Keep text inside the title-safe area (about 90% of the frame), hold it at least as
|
|
88
|
+
long as it takes to read twice, and use `background` for contrast over busy footage.
|
|
89
|
+
- **Pacing.** Vary shot length with content; trim heads and tails of every clip to the
|
|
90
|
+
essential action rather than using whole source files.
|
|
91
|
+
- **Check before export.** Always run `check_video_project` and fix errors first: the ffmpeg
|
|
92
|
+
command renders exactly what is on the timeline.
|
|
93
|
+
|
|
94
|
+
## Tool reference
|
|
95
|
+
|
|
96
|
+
### Read
|
|
97
|
+
|
|
98
|
+
| Tool | Use it to |
|
|
99
|
+
| --- | --- |
|
|
100
|
+
| `get_video_project` | Start here. Returns frame size, fps, length (ms), assets (id, kind, src, duration), tracks top to bottom with each clip in time order (id, type, start, duration, end, source in/out, fades, transition), markers, playhead, selection, issues and whether it can be edited. |
|
|
101
|
+
| `get_video_frame` | Inspect a `time` (ms) as data: pictures back to front (clip, track, asset, source time, opacity, placement rect, rotation, wipe) and sounds (clip, source time, gain after volumes, fades and transitions). Use to verify a cut, layer order or J/L cut without images. |
|
|
102
|
+
| `find_video_gaps` | List empty stretches between clips (and before the first) as `{ track, start, end }` ms, on every track or one `track`. Then `close_video_gaps` or ripple. |
|
|
103
|
+
| `check_video_project` | After every batch and before export. Lists issues errors first with a code (`missing-asset`, `wrong-track`, `overlap`, `source-overrun`, `transition-without-cut`, `transition-too-long`, `transition-handles`, `fades-too-long`, `unknown-duration`, `unused-asset`, `marker-past-end`, `empty`), what it is about and how to fix it. |
|
|
104
|
+
| `render_video_frame` | Look at the picture at `time`, or at 2-16 `times` as one labelled contact sheet (`columns` 1-8). SVG by default; `format: "png"` only when the host can rasterize. Video without a `poster` shows as a labelled box with its source timecode. |
|
|
105
|
+
| `export_video_ffmpeg` | Get the ffmpeg command that renders the project: `args` (for spawn), `command` (one shell line), `filterComplex`, duration and notes on approximations. `output` default output.mp4, `crf` x264 quality 0-51 (default 18, lower is better). Fails when there are no clips. |
|
|
106
|
+
| `export_video_edl` | Get one `track` (default the bottom video track) as a CMX 3600 EDL with source and record timecode, dissolves, speed changes and clip names, for conforming in another editor. `title` defaults to the project name. |
|
|
107
|
+
|
|
108
|
+
### Write
|
|
109
|
+
|
|
110
|
+
| Tool | Use it to |
|
|
111
|
+
| --- | --- |
|
|
112
|
+
| `seek_video` | Show the person a moment: `time`, a `clip`'s start or a `marker`, with `play` true or false. Does not change the project. Returns the playhead and clips under it. |
|
|
113
|
+
| `set_video_settings` | Set `name`, `width` / `height` (pixels, 16-8192), `fps` (e.g. 24, 25, 30, 60) or `background` colour. One undo step. |
|
|
114
|
+
| `add_video_asset` | Register a file: `kind` (video, audio, image), `src` (URL, path or data URL), `duration` ms (required in practice for video and audio), optional `id`, `name`, `width`, `height`, `hasAudio` (default true for video), `poster`. Returns the asset id. |
|
|
115
|
+
| `update_video_asset` | Relink or correct an asset via `set` (src, name, duration, size, hasAudio, poster) and `remove`. Refused if clips would then run past its end. |
|
|
116
|
+
| `remove_video_asset` | Remove an asset no clip uses; refused while clips use it, naming them. Use to clear `unused-asset` notes. |
|
|
117
|
+
| `add_video_track` | Add an empty `video` or `audio` track (optional `id`, `at` position 0 = top, `name`, `muted`, `hidden`, `locked`, `volume`). Video tracks go on top and audio at the bottom by default. |
|
|
118
|
+
| `update_video_track` | Rename, mute, hide, lock, sync-lock or set the gain (`volume` 0-4) of a track via `set` / `remove`. Lock tracks you must not disturb; set `syncLocked: false` on a track that ripple and insert edits should leave in place (a music bed). |
|
|
119
|
+
| `remove_video_track` | Delete a track and every clip on it (refused when locked). Returns the clips removed. |
|
|
120
|
+
| `move_video_track` | Reorder a track to `to` (0 = top); an earlier video track draws over later ones. |
|
|
121
|
+
| `add_video_clip` | Put a clip on a `track`: `media` (`asset`, `in` default 0, `duration` default rest of source; stills 5000), `text` title (`text`, `color`, `fontSize` 64, `fontFamily`, `fontWeight` 700, `background`; default 3000 ms) or `color`. No `start` appends at the end. `mode`: `refuse` (default, names the next free place), `overwrite` (replaces what is underneath) or `insert` (pushes later material along on every sync-locked track). Returns the clip plus any clips it cut, trimmed or removed. |
|
|
122
|
+
| `move_video_clip` | Move a `clip` to a new `start` and/or another track of the same kind, leaving a gap where it was. `mode` as for `add_video_clip` (default `refuse`). To move a shot between its neighbours without a gap, use `slide_video_clip` instead. |
|
|
123
|
+
| `trim_video_clip` | Move one `edge` (`start` also moves the in point, `end` the out point) `to` a timeline time. Refused past the source ends (the error says how far it can go) or below one frame. `ripple: true` keeps the clip's start and shifts later clips by the change. |
|
|
124
|
+
| `split_video_clip` | Cut a `clip` in two `at` a timeline time (at least a frame from each end). The left keeps the id, fade in and transition; the right gets `id` (default `<clip>-1`) and the fade out. |
|
|
125
|
+
| `slip_video_clip` | Show a different stretch of a media clip's source without moving it: `delta` ms (positive shows later media). Clamped to the media and what transitions need; returns the new source range and the delta applied. |
|
|
126
|
+
| `roll_video_edit` | Move the cut between two touching clips (`left`, `right`) by `delta` ms: one gets longer as the other gets shorter, nothing else moves. Use for J / L cuts and tightening a cut. Returns both clips, the new cut time and the delta applied. |
|
|
127
|
+
| `slide_video_clip` | Move a `clip` by `delta` ms keeping its content, trimming its neighbours so no gap opens (or moving through a gap where it has no neighbour). Returns the clip, its neighbours and the delta applied. |
|
|
128
|
+
| `split_video_at` | Razor: cut every clip running across time `at` on all unlocked tracks or the given `tracks`, as one undo step. Refused when nothing crosses that time. Returns the `{ left, right }` pairs (right parts get new ids). |
|
|
129
|
+
| `lift_video_range` | Empty `from`..`to` ms on all unlocked tracks or the given `tracks`, leaving a gap: clips inside are deleted, clips across an edge trimmed, a clip across both cut in two. Returns what was removed, trimmed and created. |
|
|
130
|
+
| `extract_video_range` | Remove `from`..`to` ms and close it up: as lift, then later material moves earlier on those and every sync-locked track. Refused (naming the clip) when a sync-locked track outside `tracks` has material there. Use to cut a section out of a finished sequence. |
|
|
131
|
+
| `delete_video_clips` | Remove `clips`; `ripple: true` pulls later clips up to close the gaps (a ripple delete). |
|
|
132
|
+
| `update_video_clip` | Change properties via `set`: opacity, transform (`x`, `y` px from centre, `scale`, `rotation`), `fit` (contain default for media, cover, fill, none), `fadeIn` / `fadeOut`, name; media `volume` (0-4), `muted`, `speed` (0.05-20, keeps the source range so the length changes), `asset`; title text and style; colour. `remove` resets to defaults. Not for timing. |
|
|
133
|
+
| `set_video_keyframes` | Animate one `property` of a `clip` (`opacity` 0-1, `volume` 0-4 for media, `x` / `y` px from centre, `scale`, `rotation` degrees) with `keys` `[{ t, v, ease? }]`, replacing its keys. `t` is clip time (ms from the clip's start), so keys travel with the clip. `ease`: linear (default), hold, ease-in, ease-out, ease-in-out or cubic-bezier points. Returns the sorted keys. |
|
|
134
|
+
| `remove_video_keyframes` | Remove all keys of a clip `property`, leaving the value it had at the clip's start. |
|
|
135
|
+
| `set_video_transition` | Set the transition into a `clip` from the clip ending where it starts on the same track: `{ type: crossfade, dip or wipe, duration ms centred on the cut, color (dip, default black), direction (wipe, default right) }`, or `null` to remove. When handles are short the error gives the longest that fits. |
|
|
136
|
+
| `close_video_gaps` | Slide clips on a `track` earlier so no gaps remain, from time `from` (default the start). Returns the clips that moved. |
|
|
137
|
+
| `add_video_marker` | Add a marker at `time` with `label`, `color` and optional `id`, for beats, sections or review notes. Returns its id. |
|
|
138
|
+
| `remove_video_marker` | Remove a `marker` by id. |
|
|
139
|
+
| `edit_video` | Apply up to 200 ops in order as one all-or-nothing undo step: `set_settings`, `add_asset { asset }`, `update_asset`, `remove_asset`, `add_track { track: { kind, id }, at }`, `update_track`, `remove_track`, `move_track`, `add_clip { track, clip, mode }`, `move_clip { clip, start, track, mode }`, `trim_clip`, `split_clip`, `delete_clips`, `update_clip`, `set_transition`, `slip_clip`, `roll_edit`, `slide_clip`, `lift_range`, `extract_range`, `split_at`, `set_keyframes { clip, property, keys }` (null keys remove), `close_gaps`, `add_marker { marker: { time, label } }`, `update_marker`, `remove_marker`; other fields match the single tools. `dry_run: true` validates only. The default for a rough cut. |
|
|
140
|
+
| `undo_video` | Undo your last edit (one tool call or one `edit_video` batch). |
|
|
141
|
+
| `redo_video` | Redo the edit you just undid. |
|
|
142
|
+
|
|
143
|
+
## Pitfalls
|
|
144
|
+
|
|
145
|
+
- **Edits never add errors.** Any edit that would create an overlap, a source overrun or an
|
|
146
|
+
impossible transition is refused whole (unless you asked for `mode: "overwrite"` or
|
|
147
|
+
`"insert"`); read the message (it names the next free place or the longest trim /
|
|
148
|
+
transition that fits) and retry with those numbers.
|
|
149
|
+
- **Numbers replace keyframes.** Setting `opacity` or `volume` as a plain
|
|
150
|
+
number (in `add_video_clip` or `update_video_clip`) drops that property's keys; animate with
|
|
151
|
+
`set_video_keyframes` after the static settings, not before.
|
|
152
|
+
- **Slip, slide and roll clamp.** They move as far as the media allows and say how far in
|
|
153
|
+
`delta`; check it instead of assuming the full amount was applied.
|
|
154
|
+
- **`edit_video` has no result references.** Unlike `edit_animation`, ops cannot say `$0.id`;
|
|
155
|
+
set clip, track and marker ids yourself when later ops in the batch need them.
|
|
156
|
+
- **`edit_video` op shapes differ slightly** from the single tools: `add_asset` wraps the asset
|
|
157
|
+
as `{ asset: { id, kind, src, ... } }`, `add_track` as `{ track: { kind, ... } }` and
|
|
158
|
+
`add_marker` as `{ marker: { time, label } }`.
|
|
159
|
+
- **Same kind of track.** A clip moves only between tracks of its kind; images, titles and colours
|
|
160
|
+
never go on audio tracks, audio files never on video tracks (`wrong-track`).
|
|
161
|
+
- **Speed changes length.** Setting `speed` keeps the source stretch, so the clip gets shorter or
|
|
162
|
+
longer and can collide with the next one; ripple or move clips after.
|
|
163
|
+
- **Transitions need a butt cut.** The incoming clip must start exactly where the previous one ends
|
|
164
|
+
on the same track (`transition-without-cut`); close the gap first. Splitting keeps the
|
|
165
|
+
transition on the left part.
|
|
166
|
+
- **Fades are per clip.** `fadeIn + fadeOut` longer than the clip warns `fades-too-long`; fades
|
|
167
|
+
affect picture and sound together.
|
|
168
|
+
- **Locked tracks** refuse edits to their clips; unlock with `update_video_track` only if the user
|
|
169
|
+
wants that track changed.
|
|
170
|
+
- **Read-only**: when `get_video_project` says the project cannot be edited, write tools are
|
|
171
|
+
hidden; read, render and export still work. Tell the user rather than working around it.
|
|
172
|
+
- **Exports are commands, not files.** `export_video_ffmpeg` returns a command for the host to
|
|
173
|
+
run; the EDL covers one track only. Report the notes on anything approximated.
|