---
name: video-post-production
description: >
  Turn raw screen recordings + screenshots into a finished, narrated, captioned demo
  video with ffmpeg and the video-post tool: crop, speed up boring parts, brand-font
  captions, Ken Burns on stills, TTS voiceover, concat, and wiki-ready keyframes.
  Trigger words: speed up a video, edit a recording, make a demo video, add captions,
  voiceover, ffmpeg demo, video-post, concat clips, publish a demo to the wiki.
---

# Video post-production

Raw recordings + screenshots -> a polished demo. Pipeline: per-section clips ->
narration -> concat -> publish. Use [`adom-tts`](https://wiki.adom.inc/adom/adom-tts)
for voiceover and the `video-post` tool for review/manifest.

## Captions: brand font, burned in

Use the Adom brand font **Familjen Grotesk**, NOT a generic system font (DejaVu looks
cheap and got a demo rejected). A `.ttf` lives in the EDA hero assets; render captions
with ImageMagick or ffmpeg `drawtext`:

```bash
FONT=.../FamiljenGrotesk-Bold.ttf
DT="fontfile=$FONT:fontsize=42:fontcolor=0xeafdfb:box=1:boxcolor=0x0d3b39@0.92:boxborderw=22:x=(w-tw)/2:y=h-95"
# time a caption to a window of the clip:
-vf "drawtext=$DT:text='Every part matched to stock':enable='between(t,19,32)'"
```

Brand tokens: text `#eafdfb`, teal accent `#00e6dc`, caption band `#0d3b39`, dark
canvas `#0a0e14`.

## Real recording: crop, speed up, caption

```bash
# crop out the taskbar + any stuck caption / private tab strip, scale to 16:9, speed up,
# and burn in correctly-timed captions:
ffmpeg -ss 5 -t 51 -i raw.webm -vf "\
crop=2560:1410:0:0,scale=1920:-2,pad=1920:1080:0:(oh-ih)/2:color=0x0a0e14,\
setpts=PTS/1.6,\
drawtext=$DT:text='...':enable='between(t,0,8)',drawtext=$DT:text='...':enable='between(t,8,13)'\
" -an -r 30 -c:v libx264 -crf 21 -pix_fmt yuv420p -g 30 jlc-live.mp4
```

`setpts=PTS/1.6` speeds video 1.6x (the "speed up boring parts"); drawtext `enable`
times are in the OUTPUT (sped) timeline. Recordings have no audio if you captured
`audio:false`.

## Stills -> clips (Ken Burns + caption + narration)

For steps you have as screenshots (or that live recording couldn't reach cleanly):
composite the shot on the dark canvas with a caption band (ImageMagick), then animate
with a gentle zoompan and mux the TTS:

```bash
# zoompan on a still, pre-upscale to avoid jitter:
[0:v]scale=2560:1440,zoompan=z='min(zoom+0.0005,1.06)':d=<frames>:fps=30:s=1920x1080,format=yuv420p
# clip length = TTS duration + 0.6s; mux: -map "[v]" -map 1:a -t <dur> ... -c:a aac
```

## Voiceover

```bash
adom-tts say "Spoken sentence, numbers spelled out like four layer." --out tts/step.mp3
```

House voice + pronunciation cache (see [adom-tts](https://wiki.adom.inc/adom/adom-tts) /
`tts-pronunciation`). Mux per-clip; if narration is shorter than the clip, that's fine
(audio ends, video continues).

## Concat + wiki keyframes

Build all clips with IDENTICAL params (1920x1080, libx264, yuv420p, 30fps, aac
44100/2), then stream-copy concat (fast, lossless):

```bash
printf "file '%s'\n" clips/*.mp4 > list.txt
ffmpeg -f concat -safe 0 -i list.txt -c copy final.mp4
```

**Every per-clip encode MUST include `-g 30 -keyint_min 30`** (1s keyframes) or the wiki
`<video>` can't scrub. Verify: `ffprobe ... -show_entries packet=pts_time,flags | grep ,K`
should show keyframes ~1s apart.

## Review + publish

- `video-post manifest add <manifest> --id X --raw clip.mp4 --description "<intent>" --narration "<spoken>"`
- `video-post app <manifest> --port <p>` opens a Hydrogen review UI (it prints a proxy URL,
  open THAT in pup, not localhost). **Don't launch it with a short `timeout`, the server
  dies and the player 500s.** Skip the review only if the user said "just ship it".
- Publish to a wiki page: push the `.mp4` into the page repo (`adom-wiki repo push`) and
  embed it in the README with an HTML5 `<video><source ...></video>` pointing at
  `https://wiki.adom.inc/api/v1/pages/<slug>/files/<path>`. (`video-post publish` currently
  wraps a removed `adom-wiki asset` command, push the file directly instead.)

## Building from stills vs real recording

If clean live recording isn't feasible, a video built from REAL screenshots with motion +
captions + voiceover is a legitimate fallback, just be honest about which beats are stills.
Real screen footage is better when you can get it; see [screen-recording](../screen-recording/SKILL.md).
