From selling points to finished video: write the storyboard → generate shot by shot → stitch → add subtitles.
Division of labor with main-image-video : that one is a 3-second single shot for the main image slot, this one isa complete ad made of multiple shots linked together, 15–30 seconds, for ad traffic.
1. Capability boundaries
| Can do | Description |
|---|---|
| Storyboard script | Selling points → shot sequence, including duration, visuals, subtitles |
| Shot-by-shot generation | Each shot is generated independently; if one fails, only rerun that one |
| Automatic stitching | ffmpeg strings them into a finished video; automatically re-encodes when encodings differ |
| Subtitles | Automatically generate SRT based on storyboard durations, burn in or mux |
| Brand consistency | --brand keeps color tone and camera movement consistent across the whole video |
| Cannot do | Description |
|---|---|
| Voiceover and music | The script provides copy; use editing software for voiceover and music |
| Precise beat sync | Generation model durations are in tiers; for syncing to music beats, adjust in post |
| Live-action talking head | Use ugc-testimonial |
2. Storyboard structure
A general skeleton for a 15-second product-selling video, four segments:
| Segment | Duration | What it does | Visuals |
|---|---|---|---|
| Hook | 0–3s | Make people stop | Strongest visual impact: usage scenario, pain-point comparison, unexpected angle |
| Selling points | 3–9s | Explain clearly why to buy | 2–3 close-ups, one selling point per shot |
| Scenario | 9–13s | Make people relate | Real usage scenario, model or environment |
| Closing point | 13–15s | Give a reason to act | Full view of the product + price/discount subtitles |
One shot conveys only one thing. If one shot is stuffed with two selling points, neither will be remembered.
3. Storyboard file
{
"shots": [
{ "id": "s1", "seconds": 3, "image": "docs/flat-lay/example-output.jpg",
"prompt": "Slow push-in on the model wearing the olive cable-knit sweater, cold morning light, breath visible.",
"caption": "零下十度,只穿了这一件" },
{ "id": "s2", "seconds": 3, "image": "docs/flat-lay/garment-flatlay.jpg",
"prompt": "Macro pan across the cable knit texture, fibers catch the light.",
"caption": "粗棒针织,三层锁温" },
{ "id": "s3", "seconds": 4, "image": "docs/flat-lay/example-output.jpg",
"prompt": "The model walks through a city street, sweater moves naturally with the body.",
"caption": "通勤、约会、周末都能穿" },
{ "id": "s4", "seconds": 3, "image": "docs/flat-lay/garment-flatlay.jpg",
"prompt": "Product laid flat on light wood, slow top-down pull-back, clean and calm.",
"caption": "现在下单立减 50" }
]
}
caption will automatically lay out the timeline and generate SRT by accumulating seconds , so you don't need to manually match timecodes.
4. Tool invocation
export DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>
node scripts/video.mjs --mode storyboard --task product-video-ad \
--board examples/board.json --outdir out/ad --subtitles --brand examples/brand.yaml
# 先看计划,不计费
node scripts/video.mjs --mode storyboard --task product-video-ad \
--board examples/board.json --outdir out/ad --dry-run
Output:
out/ad/s1.mp4 … s4.mp4 每个镜头
out/ad/captions.srt 字幕
out/ad/concat.txt 拼接清单
out/ad/final.mp4 成片
out/ad/final-sub.mp4 带字幕成片
If one shot fails, it does not affect the other shots—rerun that one, then stitch once manually.
5. Execution flow
- Ask for selling points first, don't write the storyboard directly. Ask the user: what is the main push, who is it for, which platform is it for.
- Write the storyboard for the user to confirm. Confirming in text is an order of magnitude cheaper than changing after generation.
--dry-runTake a look. Confirm that each shot's prompt and reference image match.- Run. Generate shot by shot; supplement failed ones individually.
- Check the finished video. If unsatisfied, change a single shot and rerun it; don't redo the whole thing.
6. How to write prompts
Each shot follows:Camera movement + subject + environment + fidelity constraints
<Camera move>. <Subject action>. <Environment>.
Keep the product identical to the reference image.
No text overlay in the frame, no watermark. Photorealistic, cinematic.
Key:No text overlay in the frame。 Subtitles are added in post-production.
If you let the model draw the text itself, it will inevitably come out garbled.
7. Common Issues
| Symptom | Cause | What to do |
|---|---|---|
| The product is inconsistent between shots | Each shot is generated independently, so the model draws each one differently | Pass the same product reference image to all shots, and use --brand |
| The picture jumps after concatenation | The encoding parameters differ between shots | The script will automatically re-encode as a fallback; if it still jumps, unify the dimensions of each shot |
| The subtitles were not burned in | ffmpeg was not built with libass | The script automatically falls back to a soft subtitle track, which the player can toggle on and off |
| ffmpeg is not installed | — | The clips are still generated as usual; use the output concat.txt to concatenate them afterward |
| The final video is too long | The total duration of the storyboard shots exceeds the limit | 15 seconds is the safest for ad creatives; beyond 30 seconds, the completion rate drops noticeably |
Tips
- The first 3 seconds decide everything. It is worth generating several versions of the hook shot and picking one.
- Write subtitles in colloquial language. "At minus ten degrees I only wore this one piece" is far more effective than "premium warm fabric."
- Vertical 9:16. Ad creatives are almost all vertical; generate them in vertical format from the start, and do not crop them afterward.