You can make a convincing AI product video from a single image, but not by uploading the photo and typing "make it cinematic." The workflow that holds up is: clean the packshot, build three to six keyframes with an image model, animate between each pair with a start/end-frame image-to-video model such as Kling, then cut, title and finish in an editor. One good photo becomes a 15 to 30 second film.
Step 1: Clean the packshot
Everything downstream copies the flaws of your source. Before generating:
- Use the largest front-lit file you have; remove dust, seams and stray reflections.
- Make sure the label text is crisp at full size. If you cannot read it, the model will invent it.
- Place it on a 1080x1920 (9:16) canvas, centered, with headroom top and bottom for platform UI.
Save it as product-master.png.
Step 2: Build keyframes with an image model
Keyframes are the stills each clip starts and ends on: the storyboard at final quality. For a 15-second film, plan three keyframes and three transitions.
Example keyframe prompts for a frosted glass serum bottle:
K1: Product standing on wet black basalt, low angle, single coral
rim light from left, fine mist in the air, deep black background,
macro lens look, 9:16.
K2: Same product, extreme close-up of the brushed aluminum cap,
light raking across the grain, droplets on glass, 9:16.
K3: Same product floating above still dark water, its reflection
below, soft bone-colored light from above, 9:16.
Two rules matter more than wording. Composite the real product-master.png over the generated product and relight lightly, so label and proportions stay true. And keep lens, light direction and palette consistent, or the film feels like three ads stitched together.
Step 3: Chain start/end-frame morphs
This is the core trick. In an image-to-video model with start and end frames, each clip starts on one keyframe and ends on the next. Kling 2.1 Pro, for example, takes a start frame plus an optional end frame, generates 5 or 10 second clips, and outputs 1080x1920 for 9:16 (Leonardo's Kling API docs).
| Clip | Start | End | Motion prompt | Length |
|---|---|---|---|---|
| 1 | K1 | K2 | Slow push-in toward the cap, mist drifting left, product stays still | 5 s |
| 2 | K2 | K3 | Camera pulls back and drops, basalt dissolves into dark water | 5 s |
| 3 | K3 | K1 | Water darkens and hardens into basalt, slow orbit | 5 s |
Because the last frame of each clip is the first frame of the next, the cuts become invisible morphs. Clip 3 ends on K1, so the film loops back to its first frame and works as a website hero too; see seamless loop video with AI.
Motion prompt rules that save generations:
- One move per clip. "Push in" or "orbit," never both.
- Describe the camera and the world, not the product. "Product stays still, label facing camera" protects the thing you are selling.
- Name the speed. "Slow," "barely moving," "over five seconds."
- Negative prompt the usual failures: warping, extra objects, text, morphing label.
Step 4: Run consistency checks
Watch every clip full size, frame by frame at the joins. Reject any clip where:
- Label text blurs or gains letters, or the logo shifts.
- Proportions drift (the bottle gets taller or thinner).
- Liquids or reflections defy physics.
- Background textures flicker or "boil."
- An object appears that was in neither keyframe.
If a transition keeps failing, add an intermediate keyframe instead of rewording the prompt ten times. Most of what makes an AI ad "look off" happens here; see why most AI commercials look bad.
Also: under the EU's final transparency guidelines, AI marketing content that makes a product appear different from reality is treated as a deepfake that needs disclosure (Faegre Drinker). Keeping the real packshot in frame is good craft and good compliance.
Step 5: Edit, titles and finish in ffmpeg
Each join repeats one frame. Drop the first frame of clips 2 onward, then join and title:
# drop the duplicated first frame (clips 2 and 3)
ffmpeg -i clip2.mp4 -vf "trim=start_frame=1,setpts=PTS-STARTPTS" -an clip2t.mp4
# join (list.txt holds lines like: file 'clip1.mp4')
ffmpeg -f concat -safe 0 -i list.txt -c:v libx264 -crf 18 -pix_fmt yuv420p film.mp4
# title over the last 3 seconds, web-ready export
ffmpeg -i film.mp4 -vf "drawtext=fontfile=Inter-Bold.ttf:text='Now in frosted glass':fontcolor=0xEFE9DF:fontsize=64:x=(w-text_w)/2:y=h*0.62:enable='gte(t,12)'" -c:v libx264 -crf 18 -pix_fmt yuv420p -movflags +faststart final.mp4
Check frame rates with ffprobe first; concat expects matching clips. Then add sound: a designed bed (glass tap, water, a low swell) does more for perceived quality than another round of generations.
When one image is not enough
Moving parts, many variants or a back that matters? A single photo runs out fast, and a 3D model gives every angle and colorway. Compare the options in 3D product animation vs photography.



