Reframe a spot to vertical
The person brings a finished 16:9 cut (an original, or a variant from
recipe-shot-for-shot) and, if it has one, the job that made it. You deliver the 9:16
cut over the source audio and every shot as its own file, in the layout agreed in
AGENTS.md (core skill).
Cheapest first: crop everything, watch the whole vertical cut, and only then spend generation on the shots that fail. Most shots survive a crop.
Steps
- Crop every shot (
guide-prepare-renders-for-delivery,ffmpeg-crop-to-vertical). Take the shot list from the 16:9 job or find it withffmpeg-scene-cuts; together the shots must cover the whole video. For each shot, look at a contact sheet of 4 frames with a vertical grid and place a 608×1080 window (from 1080p). Follow the subject and the action across the whole shot, not the first frame; pan the window across a shot when the action moves; fit and pad end cards and graphics wider than the window. Write each window and why in the Log ofAGENTS.md. Build the crop-only cut over the source audio and a sheet of every shot's first, middle and last frame. Gate: the person watches the whole crop-only cut at native size and names the shots that need more than a crop. - Restage only the shots a crop can't save (
guide-edit-a-frame-before-animating,nano-banana-restage-for-new-aspect). Write per shot what moves and what stays. Make both kinds, on nano banana 2.1 and Pro:- a 16:9 edit with the subjects moved into the middle third, judged by its centred 9:16 crop: for close-ups, and when the look must match the cropped shots around it;
- a native 9:16 redraw, the same camera "shot in portrait": more resolution for the render and better for wides, but the model recomposes more freely. Gate: a 9:16 review page per shot: the original 16:9 frame, the plain crop as a reference, each 16:9 edit shown as its crop with a flip to the full frame, and the redraws. Check every person in a redraw: they sometimes duplicate a background person or bunch two on one side.
- Fix held props on the pick (
guide-keep-small-details,nano-banana-swap-held-product): Pro, a pre-hazed product photo for the design, a crop of the source frame's prop for angle and grip. Redraws lose small logos; judge the logo at playback size. Gate: review the fixed stills. - Animate the restaged shots (
guide-animate-a-shot). Use the model that won the shot in the 16:9 job (kling-v3-image-to-video,seedance-2-5-image-to-video). With no earlier job, draft onh3-max-image-to-videoand upgrade whereguide-choose-a-video-modelsays the shot needs it; a draft approves composition and timing, not motion. Trim to the shot's length plus a 0.5 s tail (ffmpeg-frame-exact-trim) and keep the render's own audio in the trimmed file, so a take is judged with its sound. Crop a 16:9 render to 9:16; if the crop holds only a sliver of someone, move the crop centre and lock the camera in the prompt, or a push-in drifts them out. Gate: the renders as a 9:16 row with the plain-crop clip as the reference. - Lip-sync the dialogue shots (
guide-lipsync-video,h3-max-lipsync-a-still). Isolate the voice (elevenlabs-voice-isolation) and cut the line to start on the shot's first frame and go silent after the speaker's last word, picked by ear from a ladder of trims (ffmpeg-cut-audio-window). Pad it with silence to 5 s; never take a longer window. It is a fresh performance from the restaged still. Gate: unmuted, next to the plain render: H3 smooths facial hair and skin on a close-up, so pick the lip sync only if it holds up. - Splice (
ffmpeg-splice-into-source-cut): each picked render replaces its shot at exactly the shot's length (the tail dropped), over the source audio. Count the frames after every cut (ffmpeg-frame-exact-trim). - Deliver (core skill), shaped like the 16:9 job's delivery: the cut, plus
shotNN.mp4andshotNN_noaudio.mp4for every shot. A restaged shot is the picked render with its 0.5 s tail and its own audio; a cropped shot is the crop at exactly the shot's length with the source audio, since the source cuts straight to the next shot.
Resolution: the vertical ships at 608×1080, the pixels the source has. Where the client needs full 1080×1920 quality, restage those shots and render them natively at 1080p 9:16 with Seedance; don't put Topaz on the crops.
Choices this recipe makes
- Restage only when the crop loses a story beat: a second character, an interaction, the product. Not for empty space or a slightly tight frame.
- Background people: ask for a glimpse at the frame edges. "Move them close behind her" crowds the subject.
- Re-animate with the model that already won the shot, so the vertical matches the 16:9 version's motion.
- Shot files carry a 0.5 s tail so a word finishing over the next shot is still in the file; the cut always uses the exact shot length.
Dead ends
- Encoding a trimmed segment without an output frame rate: ffmpeg 7 dropped its last
frame (25 in, 24 out). Put
-ron the output. fps=inside per-segment filter chains before a concat: one frame lost per shot (472 of 484).- Asking Seedance image-to-video for an aspect ratio or a seed: it takes neither; the aspect comes from the image.
Worked example
Acme Co.'s office spot, variant A (the original): 12 shots at 1920×1080, 24 fps, 484 frames. 10 shots shipped as crops. Two were restaged: shot 03 (the manager leaning in with his line) as a 16:9 edit judged by its crop, then lip-synced on H3 Max from the picked still; shot 09 (the wide office chaos) as a native 9:16 redraw plus a fix of the client's drink tumbler, whose logo the redraw had lost.


