DEV Community

Cover image for Stop Rerolling AI Video: Lock a Keyframe First, Generate Once
张洲诚(Zack.ZHANG)
张洲诚(Zack.ZHANG)

Posted on

Stop Rerolling AI Video: Lock a Keyframe First, Generate Once

The saved video you never manage to remake

You scroll past a great short clip, tap Save, and think "I'll make something like this someday." When someday comes, every shot looks trivial in isolation — and together you have no idea where to start. What you saved is a finished product, not a structure.

The bigger wall is what creators call rerolling: the same prompt can return a cinematic shot or a broken mess. Industry coverage keeps citing creators pulling 20 generations for 1 usable take. That's not one vendor's bug — it's the current mechanism of video models, and every reroll bills per second.

(Quick scoping note: I've previously written about one-shot short-film pipelines, pre-production assets for short dramas, and prompt-writing methodology. This post is about single creative clips — the entry point is deconstructing a reference video's technique. They stand alone. And the stance throughout: extract the technique, never the content — every example here is a generic technique description, nothing points at a specific creator's work.)

The fix: move the decisions to the cheap step

Pure text-to-video hands composition, props, color grade, and background to the model's dice. Four random variables per generation, each one a potential reroll.

The fix is decision-frontloading: lock the first frame with an image model (cheap, synchronous, seconds), pick the best of several candidates, and only then let the video model do the one thing left — motion.

Step one costs nothing but attention: break the reference into a structure list — shot rhythm (cut length, push/pull), transitions (what bridges two shots), information density (one beat per shot or three). Manual scrubbing works fine; if you already run an agent, tools like Agent-Reach (70k+ stars on GitHub) can have it read YouTube videos and comment sections for a first draft. The comment section is free audience research: whatever moment the top comments celebrate is the hook — note the placement technique, not the content.

The command chain

Keyframe, four candidates in one call:

bl image generate --prompt "Product photography: a cup of latte on a dark walnut wood table, soft side lighting, delicate steam rising, shallow depth of field" --size 16:9 --n 4
Enter fullscreen mode Exit fullscreen mode

--n 4 returns four images (max 6) — picking one moves your taste decisions to a near-free, seconds-fast step. --size takes the ratio directly; keep it aligned with the video's --ratio.

Then image-to-video as an async job:

bl video generate --image <keyframe-url> --prompt "Camera slowly pushes in toward the cup, steam rising and curling softly" --ratio 16:9 --no-wait
bl video task get --task-id <task-id>
bl video download --task-id <task-id> --out demo.mp4
Enter fullscreen mode Exit fullscreen mode

With --image present, the model switches from text-to-video to image-to-video automatically. --no-wait returns a task ID immediately; poll later, download when SUCCEEDED. (--no-wait and --async are equivalent; --poll-interval only matters in blocking mode — 5s default for generate, 15s for edit.)

Head-to-head test log (Aug 17)

Same scene description, two paths, same day:

  • Image-to-video (keyframe-driven): 2m 03s submit-to-done. 5s 1080P. Smooth push-in, subject consistent start to finish — usable on the first pass
  • Text-to-video (no keyframe): 2m 21s. Decent quality, but the model improvised: a saucer, two table lamps, a café interior, wrong table color. For any brief with visual constraints, that's a rejected take and a paid reroll

Nearly identical wall-clock time. The difference isn't speed, it's hit certainty: the keyframe route confines randomness to the image candidates (pickable, near-free), leaving the video step a single variable — whether the motion follows the prompt.

Going vertical? --ratio 9:16, and --size 9:16 on the keyframe. That's it.

The honest ledger

Video calls are priced far above text, and a fresh account's free quota drains fast on video. Flip the guard before you start:

bl usage freetier --all
Enter fullscreen mode Exit fullscreen mode

With it on, generation auto-stops when the free quota is exhausted instead of silently billing. Check your real bill afterwards with bl usage stats — that's the only cost number I'd quote, and the one you should verify on your own account.

Free-quota terms per official docs (the "valid forever" claim going around is wrong): each model has its own quota (on the order of 1M tokens), 90-day validity, Beijing region only, no renewal after expiry, no auto-switching across models. Unit pricing: per-second billing, set by resolution tier (720P/1080P) and duration — I deliberately quote no dollar figure; use the official model page.

Where this route ends

Strongly narrative multi-shot sequences need film-level orchestration — a different route. Single generations are duration-bounded (5s default), so long-form means segments + editing (the generated clips are footage; OpenCut, the 80k+ star open-source CapCut alternative, takes it from there). And copying someone else's work was never on the table — technique out, original content in. Check the model's commercial license terms before client work.

Setup: Node.js 18+, npm install -g bailian-cli, then bl auth loginget an API key in the console; CLI install guide; Model Studio console.

Personal practice log. Commands and timings measured 2026-08-17; cost figures should be verified against your own bl usage stats.

Top comments (0)