User feedback on first render: pacing too slow, splice between action shots, use full weapon names, em-dash characters rendered wrong, final tagline overflowed canvas, and use the actual game logo instead of plain Orbitron text.

Spec changes:

  • 40s -> 26.5s overall. Tighter pacing, no saggy combat segments.
  • 3 quick openers (3s each, with class names overlaid) -> 3 kill payoffs (2.5s each, no overlay - let the visual impact land) -> act montage (5s) -> tagline (3s).
  • Class names now full: VIBRO BLADE / ARC STAFF / RAIL RIFLE.
  • Em-dashes (U+2014) replaced with ASCII space-doubling. The previous —enable-fontconfig FFmpeg + Orbitron path didn’t have a glyph for em-dash and rendered the raw UTF-8 bytes as garbage (“a euro quote”). No more unicode in overlays.
  • Tagline shortened from 38 chars (overflowed 1920px at 72pt) to “WISHLIST NOW” (12 chars, fits clean).
  • Logo + tagline beats now use image=07_library_logo_1280x720.png instead of plain text. Both bookends show the actual brand.

Schema + renderer changes to support the splice + image stills:

  • spec.py: FootageBeat.start_time (Optional[float]) for absolute-time cuts mid-sequence. Used by the kill-payoff beats which start ~2s before the killing_blow marker (no marker exists at that exact spot).
  • footage.py: load_clip honors start_time as the most-specific resolution rule. start_time + duration = direct windowing into the source clip.
  • render.py: image-backed stills. spec had StillBeat.image since v1 but the renderer’s still branch was a “v1 simplicity” stub that only emitted solid-color filtersources. Now: append the image to inputs, prepend -loop 1 for image extensions when building the FFmpeg cmd, trim the loop to the still’s duration, scale+pad to canvas size.

Output: trailer-pipeline/ai_apocalypse_launch_trailer.mp4 (full 1080p, 12000 kbps h264 + AAC, ~26.5s).


Commit 417cbc9 by astafford8488.