I keep needing five seconds of nothing
I make short promotional video on my own: a weekly newsletter, a small video channel, the occasional launch clip for a friend's coffee roastery. I never struggle with the writing; what stalls me is the five second gap at the top of every video.
A stock footage subscription charges per clip and still costs an evening of searching. Shooting it myself means lights, a tripod and waiting on the weather. The shots I want are deliberately dull: steam lifting off a cup, mist sliding across water, a patch of sun moving over a desk. Nothing happens in them, which is why they are awkward to buy and awkward to film.
I tried a browser-based video generator last month and came away annoyed. An overseas signup, a card that kept getting refused, a queue, and twenty minutes for five seconds of footage I did not dare publish, because I could not tell what it would end up costing me.
This week I went back through a command line, chasing one claim: that happyhorse-1.1 had reached number one on the Artificial Analysis video arena with an Elo of 1365. I believe half of that sentence. I pulled the ranking myself on the morning of September 16 from a single source and kept no snapshot, so the order may well have moved since. Following the thread turned up something better than a ranking: my account was sitting on free video quota that lapses in five days. So I ran six generations to see what the command line hands back.
Everything below ran on bl 1.22.0 on my own machine, and the wall clock times are mine. Prices came out of bl model list that same day. The dollar figures are rough conversions of the yuan list prices, so read them as approximations.
The quota already in the account
Install the Bailian CLI (bl) and one read-only command lists the free quota attached to your account:
bl auth login --console
bl usage free --expiring 7
The login opens a browser once, which is one step more than creating an API key. The query consumes no quota and costs nothing. My video rows came back like this:
| Model | Free runs | Expires |
|---|---|---|
happyhorse-1.1-t2v (text to video) |
10 | 2026-09-21 |
happyhorse-1.1-i2v (image to video) |
10 | 2026-09-21 |
happyhorse-1.1-r2v (reference to video) |
10 | 2026-09-21 |
wan3.0-video |
30 | 2026-11-05 |
The top three rows add up to 30 runs expiring on 2026-09-21, and the official documentation is explicit that expired quota is not reissued.
There is one thing I cannot report, because I never confirmed it. Right after my first generation I ran the query again and happyhorse-1.1-t2v still read 10 of 10, with nothing deducted. That could be ledger lag, or that call may not have landed on the free tier at all. So this post quotes the counts and expiry dates printed in the ledger and says nothing about how fast they fall.
Run one: from a sentence to an mp4
I had no assets prepared, so this was a single line:
bl video generate --prompt "清晨的西湖,薄雾贴着水面缓慢流动,一艘小木船从远处划来,桨声惊起两只白鹭,镜头缓慢向前推进" --model happyhorse-1.1-t2v --resolution 720P --ratio 9:16 --duration 5 --download xihu.mp4
That prompt is in Chinese. It asks for mist moving low across West Lake at dawn, a small wooden boat coming in from a distance, oars startling two egrets, and a slow push-in. I wrote it in the language I could describe the scene most precisely in, and the model took it as given.
Enter at 18:39:18, finished at 18:40:42, so 84.6 seconds. A 3.1 MB mp4 appeared on my desktop: 9:16 vertical, five seconds long, status SUCCEEDED. Nothing queued or errored, and I never left the terminal.
The willow branches, the mist, the boat and its reflection were all in the frame. The egrets got startled too, which was the specific beat I had written into the prompt.
Run two: a still photo that starts moving
B-roll is half the job. The other half is the photographs I already own: product shots, storefronts, event photos sitting in a folder doing nothing.
I generated the source still first with bl image generate, which took 51.1 seconds on qwen-image-3.0. The response carried a temporary URL, and that URL went straight into the video command with no upload step in between:
bl video generate --image <temporary URL from the previous step> --prompt "杯口的热气缓缓上升,窗外晨光轻微变化,镜头极缓慢推近杯身" --model happyhorse-1.1-i2v --resolution 720P --duration 5 --download coffee.mp4
74.5 seconds, 1.8 MB. The steam climbs, the light on the table shifts, and the cup and the wood grain match the source image. In English that prompt asks for steam rising slowly off the rim, morning light changing a little outside the window, and a very slow push toward the cup.
All this path asks for is one decent still. If you make assets rather than films, it is the more useful of the two directions.
Run three: whether the watermark comes off
Out of the box the video carries a "Happy Horse" mark in the lower right corner. --help documents --watermark false, and I did not want to take the help text's word for it.
Same prompt, same --seed 42, only the watermark flag different:
| Filename in the returned URL | Size | Frame 30, lower right | |
|---|---|---|---|
| default | ..._refiner_watermark.mp4 |
1009.2 KB | "Happy Horse" visible |
--watermark false |
..._refiner.mp4 |
884.0 KB, 12.4% smaller | clean |
Three independent signals point the same way, so the flag does what it says. The filename is the one I like best: the returned URL encodes whether the watermark was on, which means a script can check the name instead of looking at pixels.
The same pair of runs also broke a plan I had. Both carried seed 42 and the footage was completely different, a ceramic mug in one and a glass cup on a tray in the other. --seed does not give you the same picture back on the video path. If you were hoping to hold a seed still while comparing two settings, do what I did here instead: change one variable, keep everything else identical, and accept that the frame itself will differ.
Run four: what 1080P costs over 720P
bl model list gave me the per-second list prices for wan3.0-video: ¥0.6 per second at 720P, about $0.085, and ¥1.2 per second at 1080P, about $0.17. Five seconds works out at ¥3 against ¥6, so roughly 42 cents against 84 cents.
Same prompt, same seed, same model, only --resolution different:
| Resolution | Wall clock | Size | Five second cost |
|---|---|---|---|
| 720P | 137.2 s | 4.9 MB | ¥3, about $0.42 |
| 1080P | 173.8 s, 27% longer | 11.2 MB, 2.3 times larger | ¥6, about $0.84 |
Since that run my habit has been drafts and internal previews at 720P, where it is quicker and the file is less than half the size, and 1080P only for what ships or gets projected in a room.
I could not price the happyhorse-1.1 tier at all. bl model list --model happyhorse-1.1 returns Model not found, and its per-second rate lives on a console model page, so there is no figure for it in this post.
What happens when the free runs are gone
The default state spends money, which matters more than any number above.
The official documentation says that on an authenticated account, calls switch to pay-as-you-go automatically once free quota is used up. There is a console switch named "stop when free quota is used up", and on accounts that have completed identity verification that switch is off by default. The quota runs out, your calls keep going, and the bill keeps growing. If you want the hard stop you have to turn it on yourself; with it on, an exhausted quota returns HTTP 403 carrying AllocationQuota.FreeTierOnly.
Unverified accounts get the opposite treatment. The stop is forced on and the switch is not even visible, so calls stop working when the quota is gone and nothing bills, but you have to verify and add funds before they start again.
Keys, the quota ledger and that switch all live in the console.
Two commands I verified without running
I do not want this to read as though I tested everything. Two capabilities are documented in the local --help output, and I confirmed the flags exist without pressing enter.
First and last frame control: bl video generate --image <first> --last-frame <last> pins both ends of the shot and lets the model fill the middle, which is the shape you want for a cup going from full to empty or a street going from afternoon to night. I have both source images sitting in a folder.
Multiple subjects with their own voices: bl video ref --image A --image B --image-voice <voiceA> --image-voice <voiceB>. --image repeats for each subject, voices pair by position, and the prompt refers to them as image1 and Audio 1. That is the route to a person who stays the same person across shots and speaks, which text to video on its own cannot give you. bl video ref has no --last-frame.
Those get their own post once I have run them.
Where it fits, and where it does not
Short atmospheric shots are what it is good for: an opening shot, a moving background behind slides, a channel cover that breathes, one still photo that had to become a clip. If your budget is tight, the 30 free runs across the three happyhorse-1.1 directions lapse on September 21.
Dialogue with a specific face, a logo that has to appear at second three, anything longer than five seconds: those still belong to an editor. The watermark is on unless you say otherwise, so --watermark false goes in the command before anything ships. And generated B-roll will not rescue weak content; it removes the cost of filming or licensing those five seconds and nothing more.
Reproduce it
npm install -g bailian-cli
Create a key on the console key management page, then run bl usage free --expiring 7 and look at what your own account holds and when it lapses. Every ledger is different, so do not copy my counts. Model list, per-second pricing and quota are all checkable from the Model Studio console.
Every timing and file size above came off my machine on September 16, 2026. Flags and their allowed values follow whatever --help reports in the version you install.
What does your B-roll workflow look like for shots too small to film and too specific to license? Mine is still "generate it, then check the corner for a watermark", and I would like to hear better.



Top comments (0)