Scenario Video Editing
Overview
Every image post-processing effect has a video twin, and each is a
on a tool model: one clip in, a few numbers, one clip out. Generating or restyling footage, lipsync, dubbing and upscaling are
; concatenating, compositing and captioning a cut are
; the still-image side is
. Connection and the core loop:
. If a sibling skill named here is missing from your available skills, ask the user to install it (
npx skills add scenario-labs/skills --skill <name>
); unattended, proceed from tool schemas and flag the gap.
The twin rule
A video effect's id is the image id with
appended, its file field is
rather than
, and the knobs are identical:
model_scenario-postprocessing-lut-video
takes the same
enum and
as
model_scenario-postprocessing-lut
. All eighteen have twins, from blur and color correction through oilify, posterize and vignette.
One twin differs: Dissolve (Video) blends the clip with a still
, not a second clip; crossfading two clips is a concat transition.
Quick reference
| Need | Model or query |
|---|
| Grade or stylize | filters={"tags": ["Post Processing"]}
, plus the effect name as |
| Trim to a range | (, ) |
| Cut into segments | model_scenario-video-split
(; N points give N+1 clips) |
| Rescale or re-encode | model_scenario-resize-video
|
| Play a clip backwards | |
| Frames out, frames in | model_scenario-video-to-image-seq
, model_scenario-image-seq-to-video
|
| Subjects as layers | model_scenario-video-layers-extractor
|
| Masks, cutouts | with the need in the user's own words |
| Pull the audio track | model_scenario-audio-extract
|
Extracted frames carry no index and share one
, so their order exists only in the job row's
, and that list has come back out of time order (a confirmed defect at authoring time). The extractor takes a scalar
; every frame is
, and
(default 24 at authoring time, about one frame a second on a 24 fps clip) applies only when that flag is off. Check that the row holds exactly the clip's
ids (
reports it beside
; a short row is a dropped frame, which no reordering fixes), then, before reassembling with
model_scenario-image-seq-to-video
or handing frames on, lay the returned ids into
model_scenario-grid-maker
in that order (a fixed first-party id: Scenario's single grid tool; its
field takes an array of 1 to 100 ids and ignores a bare id while the run still succeeds, so past 100 frames sheet in batches or raise
; set
, default 3 and up to 20, so a batch reads as a near-square sheet) and read the sheet against the clip's free
and
and its motion; a frame that breaks continuity is out of place, and the corrected order travels as your own id list from then on. Never rebuild order from listings or timestamps, and a preview that runs backwards on a clean sheet is the assembler's
flag, not the order.
A cutout with transparency never ships as mp4: at authoring time the removal models carried alpha only as WebM or ProRes 4444 MOV, so read the output-format enum off
and agree the container with the user before pricing the run.
Effect lookups go through
,
,
. The
ids are constants: each is Scenario's single deterministic tool for its operation, so discovery would only re-derive it.
sits outside that set and is an authoring-time hit: re-discover it by name (
).
Cost follows the clip, so trim first
On the video twins the
input carries
, which the image versions do not: price tracks the footage rather than the settings. Trim to the frames that ship, then grade;
prices a payload before it runs. Video tools also outlast
's wait window, so launch with
and follow with
, re-calling it with the returned
. A client-side timeout on
is as harmless as the server's own: re-call it with the same ids rather than treating the job as lost.
Checking costs nothing:
returns
and
as their own asset ids, so
one to confirm a grade before chaining another billable run onto it.
Field names drift between neighbors
- Video Cut and the effect twins take a scalar . Resize Video takes as an field capped at one item, where a bare id is dropped silently; its size is and in pixels, both optional, and one alone keeps the aspect ratio.
- The output format field is on cut and split, on resize.
- defaults to true on cut, split and resize; the effects expose no audio field and pass the track through.
- Enum values are copied, not retyped: one string contains a space.
- takes no for a video: it converts image formats only. A GIF from the sequence tool is an image asset and takes ; the default flattens it to one frame.
Resizing is not reframing
No tool model repaints a video's canvas. Resize Video takes
:
(default) fits the clip inside the target,
forces the size and distorts,
fills the target and center-crops the rest.
is the cheap way to an exact ratio when losing the edges is acceptable, but none of them gives a 16:9 clip a vertical frame with the whole picture kept, so that brief needs a decision before any spend, between two routes an order of magnitude apart in price.
- Generative reframe (, Luma Ray 3.2 Reframe and Wan 2.2 Reframe, territory) outpaints past the frame and keeps the whole picture, at by far the highest price in such a job. Resolution ceilings bite: a schema can allow a vertical ratio and its top resolution tier separately yet reject the pair at run time.
- Compositor (Video Studio, cropping or pillarboxing onto a vertical canvas) is cheap but throws away width or adds bars, and its layer geometry is 's contract rather than a one-line setting.
prices a payload without validating it, so either route can bill for a run that fails outright or returns a mis-composed frame at exactly the right dimensions.
Worked example: a graded cutdown
Launch every
below with
and retire it with
before the next step reads its asset.
- the master and read before choosing times.
- Trim: with and in seconds. Going first is what makes every later step cheaper.
- Reshape:
model_scenario-resize-video
, as a one-item array, and at the delivery size, . settles the shape at this step rather than later: lands an exact ratio once the edges are spendable, and a shape that has to keep the whole picture is the reframe decision above.
- Grade: , then the LUT twin with near 0.6.
- Texture: , then the Grain twin with (a 22-value enum, default at authoring time) on that output, last, so its grain is sized for the delivered frame rather than resampled by a later resize.
- the result's to confirm the look, then with no .
Common mistakes
- Grading each source clip and then concatenating: grade the finished master once, or the shots drift apart.
- Reaching for local ffmpeg, or for an MCP tool named : the surface is on tool models.
- Polling in a loop instead of , whose timeout is not an error.
- Trusting a Grain profile to add grain: the 22 profiles are looks, not intensities, and some soften the picture instead. Compare a frame against the input.