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 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:

FONT=.../FamiljenGrotesk-Bold.ttf
DT="fontfile=$FONT:fontsize=42:fontcolor=0xeafdfb:box=1:[email protected]: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

# 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:

# 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

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

House voice + pronunciation cache (see 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):

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.