I build 40–60 second launch trailers for small AI products, and the entire pipeline is Pillow, ffmpeg and one neural voice. No timeline editor, no cloud video service, no stock template. This post is the actual recipe — every command is real and runs on a laptop.
Why not an editor (or a video model)
A 40s launch trailer is not cinematography. It's three layers:
- Typography cards — big statements, one per beat
- Motion — screenshots or cards that move just enough to feel alive
- Voice — 5 sentences of script, read clean
Video models generate footage, but founders don't need footage of their product — they need their actual UI shown with rhythm and a voice that lands. And a timeline editor is slow precisely because the format is so rigid: 5 beats, card → screen → card. Rigid formats should be code.
Layer 1 — cards with Pillow
One card = one ImageDraw pass. Palette locked to 4 colors, one font family, accent bars instead of decoration:
from PIL import Image, ImageDraw, ImageFont
BG, FG, ACC, DIM = (14,16,13), (238,240,232), (200,235,90), (150,155,145)
card = Image.new("RGB", (1920,1080), BG)
d = ImageDraw.Draw(card)
big = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 118)
d.text((160, 380), "MOST FITNESS APPS", font=big, fill=FG)
d.text((160, 520), "RENT THEIR BRAIN.", font=big, fill=FG)
d.rectangle((160, 700, 560, 716), fill=ACC) # accent bar
The whole hook card is ~15 lines. The rule that matters: one idea per card, one accent per card. If a card needs two accent bars, it's two cards.
Layer 2 — motion with ffmpeg zoompan
Ken Burns on a static card, 4K canvas downscaled to 1080 (this is the classic zoompan aliasing fix):
ffmpeg -loop 1 -i card.png -vf \
"scale=3840:2160,zoompan=z='min(1+0.0009*on,1.12)':d=210:\
x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':s=1920x1080:fps=30" \
-t 7 -c:v libx264 -pix_fmt yuv420p card_move.mp4
d=210 = 7 seconds × 30fps. The min() cap is what stops the classic zoompan runaway zoom. For product screenshots the same filter gives you a slow push-in — a static screenshot suddenly reads as "demo".
Layer 3 — one neural voice
edge-tts --voice en-US-ChristopherNeural --rate=+10% \
--text "Most fitness apps rent their intelligence from someone else's cloud." \
--write-media seg1.mp3
Deep voice, +10% pace, five segments. Script discipline: one sentence per segment, written after the cards, so the voice confirms what the eye just read instead of racing it.
Assembly — the mux trick that keeps audio in sync
Per segment, pad the audio to the exact video length (never rely on -shortest, it clips tails):
ffmpeg -i seg1.mp4 -i seg1.mp3 -filter_complex \
"[1:a]apad=whole_dur=7.0,atrim=0:7.0[a]" -map 0:v -map "[a]" \
-c:v copy seg1_mux.mp4
Then concat and web-optimize:
printf "file 'seg1_mux.mp4'\nfile 'seg2_mux.mp4'\n..." > list.txt
ffmpeg -f concat -safe 0 -i list.txt -c copy -movflags +faststart trailer.mp4
Total render time for a 40s trailer: under 3 minutes on a small ARM box. The slow part is the script — always is.
The spec-trailer move
Here's the workflow that changed my conversion rate: when a founder posts "I need a launch video", I don't send a quote. I cut a spec trailer from their public site overnight — their screenshots, their copy, my script and motion — clearly labeled "spec trailer" in the end card, facts only from public sources. They wake up to their product looking like a real launch.
The video at the top of this post is one of those, cut in one sitting. A second example, this one from a real browser capture plus a terminal sequence rendered frame-by-frame with PIL:
Ethics guardrail that keeps this honest: the spec is labeled a spec, nothing is invented, and the founder owes nothing if the format doesn't fit. It's a sample with their name on it, not a finished deliverable held hostage.
When this stack is the wrong tool
- You need live-action humans → camera, always
- You need 3D → Blender, and honestly, hire someone
- The product is visual-noise (games, image models) → capture matters more than typography, and capture is manual
For everything else — dev tools, AI apps, infra, anything with a UI and a sentence of value prop — this pipeline turns "launch video" from a two-week agency project into a 48-hour turnaround.
I do these commercially — $99 launch-week rate, 48h delivery, script + voice + motion included. Samples and pricing: https://loveoftheai.github.io/demo-videos — or find me on X @wuwei2022.
Top comments (0)