How we made a music video from stills with AI: a real walkthrough

The official video for The Village Rejects’ “Anywhere But Here”, and the actual steps, tools and mistakes behind it.

This is not a polished “ten tips” post. It is a walkthrough of a real music video I made for my band, The Village Rejects, using AI image-to-video and text-to-video, then cutting the clips to the song.

The film is three minutes 33 seconds long. The concept is called Thin As Air: a lone 1950s rebel, always a silhouette, drifting through a foggy neon town, with every “anywhere but here” cutting hard to an open road. Faces are never shown. That is a brand rule, and it is also what the song is about: being present and still invisible.

I am publishing this on pics2vids because the same decisions come up whether you are making a memorial film, a birthday clip or a small-business promo: time the pictures to the audio, keep a character consistent, throw away bad takes, and export a version that actually fits the platform. This article sits in the Music videos category.

The finished film: “Anywhere But Here” by The Village Rejects. Watch with the sound on. Lyrics are part of the picture.

Listen to or buy “Anywhere But Here” by The Village Rejects on Bandcamp.

The pipeline in brief

This is what I did, in order:

  1. Start from the finished song (a 3:33 WAV) and lock lyric timings by separating the vocal and aligning the words.
  2. Write a treatment and a 35-shot list, timed to those lyrics, then pressure-test the plan before spending on generation.
  3. Build a small set of reference stills and brand assets so the figure and the locations stay consistent.
  4. Generate one clip per shot with Kling 3.0 Pro or Veo 3.1, some from a still (image-to-video) and some from text only.
  5. Watch the first cut, throw away the takes that drifted, and re-stage the shots that did not follow the lyric.
  6. Assemble the clips in a scripted edit: grade, hard cuts on the chorus hook, short fades everywhere else, then mux the original audio.
  7. Add burned-in lyrics as a second master, plus a silent title intro, end cards, and Instagram crops.

A first cut was assembled in July 2026. The revised cut, titles and social exports were done in October 2026. The finished film is on YouTube.

The song, and why the pictures hide the face

“Anywhere But Here” is an introspective rock song about dissociation and invisibility: inner turmoil that lasts even when someone is trying to help, and a repeated wish to be somewhere else, with no real destination. The hook is: I really, really wish I could be / Anywhere but here.

The Village Rejects are a Shumen-based collective built around my lyrics and a rotating cast of guest guitarists and singers. Because the singer changes, no single face represents the band. The on-screen persona had to stay anonymous. The lyric already pointed the same way: “a shadow in the sun”, “thin as air”, “you looked right through”. A silhouette is not a workaround for inconsistent AI faces. It is the idea.

The song was released on 12 March 2026. It is on Bandcamp and the usual streaming outlets. The official video is also embedded on my WhatChan about page.

The Anywhere But Here single cover: a brass compass rests on a sunlit old map.
The single cover, a compass on a map, later used on the end card. This is existing Bandcamp artwork, not a generated still.
The Village Rejects wordmark, with a sunset town skyline filling the letterforms, on a transparent background.
The Village Rejects wordmark, keyed from the Tales From the Baba Bar album art, used on the title cards and Instagram covers.

1. Time the pictures to the vocal, not to a guess

The master is a 3:33, 48 kHz WAV. The film is cut to 213 seconds, so the pictures land on the real vocal, not on a rough guess from the lyric sheet.

The timing was locked in one pass:

  • Split the mix into a vocal stem with Demucs (--two-stems=vocals).
  • Downmix that stem to a 16 kHz mono file.
  • Run Whisper against it.
  • Save the aligned lines in a lyrics file, then cut the shot list to those times.

I got a 94% match on that alignment. Shot lengths ended up between about 5 and 9 seconds, 35 shots in total. That lyrics file later drove the burned-in captions as well, so the words on screen are the same timings the pictures were cut to.

If you only remember one thing from this stage: do the timing first. Generating 35 clips and then discovering the chorus hits a second late is an expensive way to learn it.

A dark bar seen from behind a silhouetted man, with a second silhouette in magenta light and the burned-in lyric “She asked me what I’ve lost”.
A frame from the lyrics master. The captions use the same aligned timings as the picture cut.

2. Write the film on paper before you generate anything

The concept is two worlds:

  • The town is the trap: foggy neon streets, the bar, the rain, a shadow nobody sees.
  • The road is the wish: every “anywhere but here” hard-cuts to the edge of town, an open road, the moors, a departure. The escape never holds, until the ending, when he simply walks out into fog and the frame fades to white.

The visual rules were locked before a single paid clip was generated. The figure is a 1950s rebel: quiff, collar-up jacket, cigarette, always a silhouette or in deep shadow. The palette is desaturated olive, deep black, amber sodium light, with magenta and red neon reserved as a colour code. The ending stays unresolved on purpose.

The 35-shot list is the creative map. Each shot has a start and end time, a model, a “world” (town, road, interior, or her), a cut type, and a lyric anchor. Five of those shots are hard cuts onto the hook: N08, N10, N18, N20 and N23. Everything else dips through black for about 0.18 seconds.

Before I spent on a full generation run, the treatment was read from a creative-director and music-video-director point of view. The verdict was 7/10: the central idea was strong, but the middle repeated itself, a few lyrics were illustrated too literally (a burning map, a spinning clock, a silent scream), and a “thinning until he becomes transparent” trick was used so often it would have had nothing left for the ending. Five changes were applied to the shot list before the full run:

  1. Re-conceive a duplicate “warmth stops at his outline” shot as a movement shot instead.
  2. Lock the colour system: amber is the town’s false warmth; magenta is her; the road is grey-gold with no neon; white is the end.
  3. Use full transparency once, as the signature image, and only hint at it elsewhere.
  4. De-literalise the burning map and drop the spinning clock.
  5. Vary scale and camera in the two monotony zones, including the closing walk.

I also built a storyboard video of storyboard cards over the real track, so the film could be watched as a plan before it cost anything to generate.

A storyboard card for shot N01, labelled VEO image-to-video, 0.0 to 6.0 seconds, with the lyric “You’re a shadow in the sun” and a short staging note.
A frame from the storyboard video: shot N01, timed to the opening line, with the model and the world marked before any clip was generated.

3. Source stills and assets: one picture cannot play every location

This is the honest bit, because pics2vids is a guide to turning photographs into video, and this film did not start from a shoebox of personal photos.

The character and locations were held together with reference stills, then animated with image-to-video where the still matched the place. Those stills were generated with Flux Pro 1.1:

  • him, in the street
  • her, in a doorway
  • the bar
  • the room

Brand assets were taken from existing artwork: the wordmark above, keyed from the Baba Bar album art, and the compass single cover for the end cards.

Image-to-video was only used where the reference matched the location. Close figures were staged from behind. Shots of the open road were mostly text-to-video, because there was no still that could honestly stand in for that world.

Generated reference still of a 1950s rebel as a dark silhouette under a foggy amber streetlamp, cigarette in hand, no facial features visible.
Reference still for him, in the street. A generated image, not a photograph.
Generated reference still of a woman as a dark silhouette in a doorway, lit by magenta and red neon, face unseen.
Reference still for her. Magenta is her colour in the film.
Generated reference still of a man seen from behind at a dark bar, with a magenta jukebox to the right and no face visible.
Reference still for the bar. Image-to-video only started from this still when the shot was actually in the bar.
Generated reference still of a man as a silhouette, back to camera, looking out of a fogged window, with a small glowing radio on the left.
Reference still for the room, later used for the bedsit radio shot.

That distinction matters for anyone following along with their own pictures. If you do have real photographs, those are your reference stills. The mistake to avoid is the one I made on the first cut: using a single streetlamp portrait as the start image for almost every shot, including scenes that were supposed to be inside a bar.

4. Generate one clip per shot, with the audio off

The clips were generated through fal.ai, not by typing into a consumer app and hoping for a finished film.

For the revised cut, moving-image shots used:

  • Kling 3.0 Pro for most town and interior shots, including the image-to-video ones. Clips were requested at exact lengths between 3 and 15 seconds, with the start image sent for image-to-video, built-in audio turned off, and cfg_scale set to 0.5.
  • Veo 3.1 for the road shots and some of the image-to-video town and her shots, including the opening and the last lamp at dawn.

A direct Kling.ai account was considered and rejected: the per-second price was the same, and the credits expired every month. Staying on fal.ai kept billing in one place.

Each shot carried its own “world” prompt and a negative prompt, instead of one global style line pasted onto everything. Magenta was kept out of the non-her negatives, so her colour did not leak into the town or the road.

A two-shot test was run first, to prove the keys, the model endpoints and the image-to-video path, before the full 35-shot run. A pre-flight check had already caught contract bugs (Veo needed a duration like "8s", not "8", and the Kling image-to-video endpoint rejected an aspect-ratio field) and tightened seven prompts that would have lit a face.

Opening shot of the film: a rebel silhouette in profile under a foggy streetlamp on a wet night street, cigarette raised, face fully in shadow.
Shot N01, the opening: “You’re a shadow in the sun.” Image-to-video from the street reference, generated with Veo.
A composite-looking frame in which a dark figure seen from behind is overlaid on a foggy terraced street, with letterbox bars at the top and bottom.
Shot N08, the first hard cut on the hook “anywhere but here”. This frame shows the figure and the street overlapping, which is how some of the chorus cuts arrive rather than as a clean empty road.
Close-up of two hands striking a match over wet cobbles, with a green door and a brown shoe at the edge of the frame, and no face in shot.
Shot N15, hands only: a shaking match, staged as a macro so the figure never needs a face.

What I actually spent on this project, not a price list:

  • A two-shot test plus one early re-roll of shot N08 came to about $5.
  • The first full run was about $35.
  • The October revision used about $17.60 of a $25 top-up: 111 seconds of Kling for the 14 re-staged shots, 23 seconds of Kling for the title plates, 16 seconds of Veo, and two Flux reference stills.
  • The two title plates themselves took one pass, at about $2.62.

These are the figures I recorded in 2026, not current list prices. Your provider’s billing dashboard is the place to confirm the exact figure.

5. The first cut was finished, and it was repetitive

All 35 clips were generated and assembled in July 2026: a clean 1080p24 master and a matching lyrics master, both 212.9 seconds, h264 and AAC, about 135 MB.

Then I watched it. The note in the handover is blunt: the first cut was “a bit repetitive”, and the scenes needed to “follow the lyrics more”.

The root cause was not a mystery. Seventeen of the 19 image-to-video shots had started from the same streetlamp still. That start image overrode the prompts, so a bar table arrived in the street. One global style string also pushed town and neon into every shot, including the road, which was supposed to be chromatically starved.

The clearest example is shot N11, which was meant to be a bar jukebox dolly. In the first cut it is still the street, with two silhouettes under the lamp.

First-cut version of shot N11: two silhouettes stand under a streetlamp on a foggy road, one leaning on a stool, instead of the intended bar interior.
Before. First cut, shot N11: a bar scene generated from the streetlamp still, so the picture never left the street.
Revised shot N11: a man seen from behind at a dark bar counter, smoke rising, a magenta jukebox at the right, no face visible.
After. The same shot, re-staged as an interior from the bar reference still, with a lateral dolly to the jukebox.

Other things the first pass taught me, the hard way:

  • Veo’s road shots drifted back into town, and treated the words “match cut” as a visual transition to animate. The fix was to lock the first frame in the prompt (“the very first frame is already [this scene], no scene change, no cut, no transition”), add per-shot negatives, and trim a bad run-up in the edit. The empty-road shot N08 still uses a 2.2-second in-point, so the assembler starts on the clean tail rather than the messy arrival.
  • Telling the model “silhouette” does not reliably hide a face. On a close figure, stage the shot from behind. The phone-box shot was re-staged that way after two takes in which Kling kept lighting his face.
  • Kling could not make a real montage. The instrumental escape sequence (N21) was cut in the edit, for free, from existing road, train, plane and boat clips, in four slices of 1.6 seconds. The model’s own montage attempt was parked and not used.
  • Escape imagery had to change each chorus, or the hook went stale. Chorus 1 stays on the road (the signature). Chorus 2 became a 1950s prop airliner climbing over the moor, with a tiny silhouette watching it leave. Chorus 3 became a steamer leaving a fog-bound harbour. A steam train was already in the second-chorus stretch. The last three shots stay a plain walk: every vehicle has left without him, and he just keeps walking.
A small figure stands in the middle of a wet moorland road as a four-engine propeller airliner climbs toward the camera, in a yellow-grey vintage frame.
Shot N18, chorus 2: the airliner leaves without him. This frame has a vintage film edge, an artefact Veo also produced elsewhere and which later had to be re-rolled on another shot.
A man in silhouette, back to camera, stands on a wet railway platform at night as a steam train approaches through fog, under a single amber lamp.
Shot N20: the steam train, another escape that leaves without him.
A silhouetted figure stands on a wet cobbled quay at dawn, watching a steamer pull away into fog, with a red lamp glowing on the ship’s bow.
Shot N23, chorus 3: a steamer leaving a fog-bound harbour.

6. Re-roll what missed, and keep a paper trail of the rejects

Fourteen shots were re-staged in October so the picture followed the lyric under it, including a Dutch-tilt launderette, a dance-hall tilt-up, a jukebox dolly, coins on the bar, a rooftop wide, a shaking match (hands only), a bar mirror, a bus shelter, a bedsit radio, a chip-shop window, a footbridge in steam, a rack focus in an alley, boots walking from cobbles onto tarmac, and the last lamp dying at dawn.

Some of those still needed more than one take:

  • N11 drifted the figure to the edge of the frame, in profile and lit.
  • N16 put a face in the bar mirror.
  • N22 first showed a side-on face, then a bystander face in the shop window.
  • N32, the Veo dawn shot, drew a film-strip border around the frame. Road shots now need an explicit “full-bleed clean photographic frame, no film strip, no sprocket holes.”

Rejected takes were kept in a rejects folder, with the old clips of re-staged shots parked beside them, and QA frames pulled for a stills pass. The brand gate stayed the same the whole way through: if a clip reveals a face, it is regenerated. Silhouettes only.

Here is a rejected take from N22. It is shown only as a teaching example. The faces in the chip-shop window are why it was thrown away.

Rejected take of shot N22: a man stands on a wet pavement outside a lit chip shop, and several recognisable faces are visible through the steamed window. Labelled as a rejected take.
Rejected take, shot N22. This did not ship. The model put bystander faces in the shop window, which breaks the rule that faces are never shown.
Rejected take of shot N32: a lamp beside a dawn road, boxed inside a dirty film-strip border with sprocket holes along the bottom. Labelled as a rejected take.
Rejected take, shot N32. Veo drew a film-strip border around the dawn road. The take that replaced it is a full-bleed frame.
The kept dawn shot: a close, weathered lamp glows amber beside a wet cobbled path and an empty road, with no film border around the frame.
Shot N32 as kept: the last lamp at dawn, without the film border.
A man sits on a wooden bench in a launderette, back to camera, facing a row of cream tumble dryers under strip lights, with no face visible.
Shot N05, the launderette, re-staged so the picture followed the lyric. It came out level rather than Dutch-tilted, and the jacket reads brown rather than a pure silhouette. I left it in; it is a small soft spot you can judge for yourself when you watch.
A rebel silhouette stands in rain under a streetlamp as water pours from above, head bowed, face in shadow, on a wet night street.
Shot N07, still in the town, just before the first hard cut to the road.
A night-time railway footbridge, empty of people, with a blast of white steam filling the tracks and lamps receding into fog.
Shot N29, the footbridge. In this frame the figure has already vanished in the steam, which to my eye reads as “never really there.”

I also left a few other soft spots in as judgement calls rather than fixes: Kling 3.0 likes to add garbled neon lettering (visible on some town shots and on the intro plate); the last lamp dies with a half-second burst of sparks, landing on the line “Somewhere that feels sincere”; and on the footbridge he sometimes stands on the tracks rather than at the rail.

Hard-won prompt habits for this model family, from what I learned on this film:

  • Close figures: “back fully to camera, only the back of his head and shoulders ever visible, he never turns.”
  • Mirrors: “pure black shadow, head hanging so low only the hair shows.”
  • Windows: “so thickly steamed it is almost opaque, no one looks out.”
  • Do not ask the generator to perform a match cut. Generate a clean in and a clean out, and make the cut yourself.

7. Assemble, grade, lyrics and titles

The clips were not dragged into a conventional timeline as the main path. A small assembler cut each shot to its start and end, applied a colder, greyer grade so only neon and lamplight pop, used hard cuts on the five hook shots, dipped the rest through black, and muxed the original WAV. The film ends on white, with the last “anywhere but here” landing on an empty frame.

A second pass burned the aligned lyrics over the same cut. There is a clean master and a lyrics master.

Titles were built last, over two extra generated plates:

  • Intro, YouTube only: 8 silent seconds before the film, because the vocal starts at 0.0 seconds. The plate is an empty foggy street, the lamp lit, a slow push-in. The Village Rejects wordmark, the word “presents”, then the title, fading from and to black, after which the first shot fades in.
  • Outro, 15 seconds, over an empty bar at closing, dollying along the counter to the jukebox, fading in from the film’s white-out. One card has the compass cover, the title, “Performed by The Village Rejects” and “Written by Adrian Dane”. The next has the wordmark and where to find the song (Bandcamp, plus the streaming outlets that were listed on the distribution page at the time).
An empty cobbled street at night, a single lamp in the centre, wet brick terraces on both sides, and a smear of red neon in the fog. No people in shot.
The intro plate: an empty foggy street and a lit lamp, used for the silent eight-second YouTube pre-roll. Some of the neon lettering is garbled, a known Kling habit.
An empty bar at closing time: a long dark counter with a glass and a smoking ashtray, bottles along the back, stools in a row, and a magenta jukebox by the door.
The outro plate: the empty bar, used under the end cards.

8. Export a version that fits the platform

The same film was packaged several ways, because a 16:9 YouTube master is not an Instagram Reel:

  • YouTube upload master: intro plus film plus end titles, 16:9, 1080p24. There is a matching lyrics version.
  • A clean film-plus-end-titles version without the intro, and card-less masters used as intermediates.
  • Instagram 9:16 (1080×1920): the 16:9 picture sits as a full-width strip over a blurred, darkened blow-up of itself, with the lyrics re-burned at a phone-readable size under the strip.
  • A full Instagram version with intro, end titles and lyrics, 3:56, for the feed. Reels at the time were capped at 3 minutes, so that full version was not the Reel.
  • A 68-second Reel teaser, taken from 23.3–83.4 seconds of the film (launderette, through the first chorus, to the rooftop), with lyrics, a fade to black, then the outlets card.
  • Cover stills for Reel and feed, from shot N28 at 3.0 seconds: the rebel under the lamp. The wordmark sits at the top and the title at the bottom, kept inside the centre square so a grid crop does not cut them off.

These are the exports I made. I am not saying they were posted.

N28 is the signature frame of the film, the one the creative-director notes called “the poster, the thumbnail, the whole song in one frame.”

Signature frame of the film: a rebel silhouette stands under a foggy streetlamp on a wet night street, head slightly bowed, cigarette in hand, face unseen.
Shot N28 at about three seconds, the signature frame used for the Instagram covers.
Instagram feed cover, portrait crop: The Village Rejects wordmark at the top, the rebel silhouette under the lamp, and the title Anywhere But Here with the line Official video, out now.
Instagram feed cover, 1080×1350, built from the N28 frame.
Instagram Reel cover, tall 9:16 crop of the same rebel silhouette, wordmark and title, with space above and below the centre square.
Instagram Reel cover, 1080×1920, with the title kept in the centre square so a grid crop still reads.
A 9:16 Instagram frame: a 16:9 strip of an empty wet road under a murky sky, with the lyric “I really, really wish I could be” in white type on the black bar below.
A frame from the 9:16 export: the 16:9 picture as a strip, with the lyric re-burned at phone size underneath.

What I would tell someone starting with their own photos

This project was a custom pipeline: a shot list, generated stills, Kling and Veo via an API, and a scripted ffmpeg assemble. You do not need that machinery to make a short, honest film from photographs.

A simpler path, using tools this site already reviews, would look like this:

  • Plan fewer shots. Thirty-five clips for a three-and-a-half-minute song was the right count for this film, and it was still too many in the middle until I re-staged it. A memorial or a birthday film can live on a handful of photographs, each held long enough to feel like a look rather than a flick-book.
  • Time to the audio first. Even a scratch lyric sheet or a simple beat sheet in CapCut or Kapwing is better than generating first and sliding clips around afterwards.
  • Use a real photograph as the start image. That is the part I would have done differently if this had been a family film. Image-to-video in Runway or Luma AI is the consumer version of what I did with Kling and Veo. Photos To Video AI is aimed even more directly at that starting point. One photo per place, not one photo for the whole film. Adobe Firefly may also be useful if you are already generating stills in that family of tools.
  • Make the cuts in the editor. Hard cuts, match cuts and montages are edit decisions. The models in this project tried to invent transitions when I mentioned them, and they could not cut a montage. Generate a clean clip, then cut it.
  • If you need someone unrecognisable, shoot from behind. “Make them a silhouette” is a weak instruction. “Back to camera, they never turn” is the one that worked here.
  • Expect re-rolls, and keep the rejects. Faces in mirrors and windows, extra bystanders, film frames drawn around the picture, and invented signage all showed up in this project. Budget for it. A handful of re-rolls on a first pass was normal on this project.
  • Export to the platform’s real limits. I needed a silent pre-roll because the vocal starts on the first frame, a 16:9 master for YouTube, a 9:16 letterbox for Instagram, and a shorter teaser because a Reel would not take the full lyrics version. Check the cap before you finish the captions.

Those last paragraphs are advice drawn from this project, not a claim that I have timed a beginner film in Runway, Luma or CapCut for this song. I have not. If I later make a short version of the same walkthrough in those tools, it will be a separate, dated test with its own screenshots.

Lessons I am keeping

  • A constraint is useful when it means something. The silhouette works because the song is about being a silhouette. Without that, it is just a way to hide an inconsistent face.
  • The start image is stronger than the prompt. A streetlamp still will drag a bar scene back into the street, however carefully you write “interior, jukebox, dolly”.
  • One global style string will paint the same town onto every world. Give each location its own references and its own negatives.
  • Watch the first assembly all the way through before you fall in love with individual clips. Repetition is obvious in a cut and easy to miss shot by shot.
  • Follow the lyric that is actually under the picture. The October rewrite exists because the first cut did not.
  • Keep rejected takes. They are the most honest teaching material you will have, and they stop you regenerating the same mistake.
  • Platform packaging is part of the film, not an afterthought: intro silence, end cards, burned-in lyrics, vertical crops, cover frames.

Watch it again, then go look at the tools

Listen to or buy “Anywhere But Here” by The Village Rejects on Bandcamp.

The tools named in this walkthrough are the ones the project actually used: Demucs, Whisper, Flux Pro, Kling 3.0 Pro, Veo 3.1, fal.ai, and ffmpeg. For a simpler image-to-video starting point, see the reviews of Runway, Luma AI, CapCut, Kapwing, Photos To Video AI and Adobe Firefly.

The song is written by Adrian Dane, performed by The Village Rejects, and available on Bandcamp and the streaming services listed on the end card.

The creative toolkit

Find your next creative tool.

All tools ↗