Skip to content

Play a scene's footage, time it by hand, and keep dissolves off clip audio - #7

Merged
davior merged 1 commit into
mainfrom
claude/jolly-newton-lf35p8
Oct 21, 2026
Merged

davior merged 1 commit into
mainfrom
claude/jolly-newton-lf35p8

Conversation

@davior

@davior davior commented Oct 21, 2026

Copy link
Copy Markdown
Owner

Why

When a video was built from lots of clips, the timing drifted. The editor showed each scene's trim but couldn't change it. Scene length and loop/hold were only reachable through the JSON tab. And a dissolve out of a clip with its own sound cut that clip's last words.

What

Footage player (ClipPlayer.tsx, spec/clip.ts): click a scene's thumbnail to play exactly its trimmed segment. The player stops at the out point, and it's muted unless the scene plays the footage's sound. Below the player:

  • In/out points with ±0.1 s and ±1 s nudges, plus Set in/out here from the playhead and Whole clip.
  • Scene length: Follow narration, Fixed, or Match footage.
  • What happens when the footage is shorter than the scene: loop, or hold the last frame.
  • A one-line warning when the footage will loop, hold or be cut short by its narration. Narration length is estimated at 15 characters a second, the same reading-rate guess as render/estimate.py. For a clip, the line names any blend out of it.

GAM clips play from their offset in the parent file. Signed URLs are only shown, never stored in the spec.

Dissolves no longer clip a clip's audio (compile.layout, renderer.py, ffmpeg.py): the stitch ends the outgoing shot's audio where a blend starts. A video_sound unit before a blend is now lengthened by the overlap (Unit.tail), so it reaches its out point before the blend begins. The extra time plays the footage after the out point, or a held last frame where the file ends (tpad now also covers video_sound). Shot starts shift with it, so anchors, tracks and overlays follow.

Tests

  • Backend: pytest -q → 629 passed, including new compile tests (blend vs. cut out of a clip) and an ffmpeg test for the hold.
  • Frontend: npm test → 151 passed (new clip.test.ts, ClipPlayer.test.tsx, and a VisualStrip test); npm run build, lint and format:check are clean.

Not tested: playing in a real browser against a live GAM, and an end-to-end render with ffmpeg.

Not in this PR

Prompt-to-clip generation (picture-then-animate, text-to-video in GAM, or letting the assistant generate video) is waiting on a decision.


Generated by Claude Code

…audio

Clicking a scene's thumbnail opens its footage in a player that stops at the
out point. Under it: in/out points with ±0.1 s / ±1 s nudges and "set here",
"Whole clip", the scene's length (follow narration, fixed, match footage),
loop or hold for short footage, and one line saying when the footage will
loop, hold or be cut short by its narration.

A blend out of a clip that plays its own sound used to cut its last words:
the stitch ends the outgoing shot's audio where the blend starts. The layout
now lengthens such a clip by the blend's overlap (its `tail`), played from the
footage after the out point, or as a held last frame where the file ends.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ko6G3pNhKu51bkYyUceSyg
@davior
davior marked this pull request as ready for review October 21, 2026 11:34
@davior
davior merged commit 744c758 into main Oct 21, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants