AI Models · Specs · Workflow · How To

What Each Image-to-Video Model Actually Requires From the Input Photo

· 10 min read

Quick answer:a JPEG or PNG that is at least 300 pixels on each side, sits between 1:2.5 and 2.5:1 in aspect ratio, and is under 10 MB clears every published constraint on every image-to-video model we run. Past that common floor the rules diverge, and the divergence that costs people credits is not the file format. It is what happens to the aspect ratio setting once a photo is attached. Happy Horse 1.1, Kling 2.6, Seedance 1.5 Pro and Grok Imagine Video all state in their schemas that the photo's own ratio wins and the dropdown is ignored (or, on Grok, defaulted). A landscape product shot becomes a landscape ad no matter what you picked. Veo 3.1 Fast is the one model that treats aspect ratio as a real parameter and asks for a photo that already matches it. Only three models accept more than one photo as references (Happy Horse 1.1, Kling 3.0 and Seedance 2.0). Veo 3.1 Fast and Seedance 1.5 Pro take a second still only as a closing frame. The three talking-actor models need a face in frame, not a bottle. Everything below was read off the live input schemas on 4 September 2026 and cross-checked against our own dispatch code.

Why the photo, not the prompt, decides the render

Every video model in our registry except the two Sora models requires a starting image, and those two leave the Replicate bridge we call on 24 September 2026, so in practice you always supply a first frame. The model then treats that frame as ground truth. It will not widen a 4:5 product shot into 9:16 for you, it will not invent the back of the box, and on most endpoints it will not even look at the aspect ratio you selected. The prompt shapes what moves. The photo fixes what exists. On TikTok Shop that is also policy: the Seller Center requires product videos to display the physical product accurately, which TikTok Shop's AI content rules quotes in full.

That is why the hard constraints matter more than the guides that tell you to "use a clean, well-lit product photo". Clean and well-lit is taste. A 300-pixel floor, a 10 MB cap and a 1:2.5 ratio limit are rejections. And the aspect behaviour is neither: the render succeeds, you pay for it, and it is the wrong shape.

The hard constraints, per model, from the schemas

The table lists the exact endpoint our pipeline dispatches to and the constraints its published input schema states. Where a schema publishes no format, size or pixel limit, the cell says so rather than guessing. Seedance 2.0 is the one exception to the Replicate sourcing: in production it runs on BytePlus, so its row comes from BytePlus's API reference and the Replicate copy of the model is quoted only for field behaviour.

Model (endpoint)Photo fieldPublished limitsMax photosAspect setting once a photo is attached
Veo 3.1 Fast (google/veo-3.1-fast)image, optional last_frame"Ideal images are 16:9 or 9:16 and 1280x720 or 720x1280"; no format or size limit published1 (+1 last frame)Honoured: enum 16:9 or 9:16, photo expected to match
Kling 3.0 (kwaivgi/kling-v3-omni-video)start_image (+ optional end_image) + reference_images.jpg/.jpeg/.png, max 10 MB, min 300px, aspect ratio 1:2.5 to 2.5:11 start frame (+1 end frame) + up to 7 references (4 with a reference video); our pipeline sends 1 + 6"Required when not using start frame"; otherwise the frame decides
Kling 2.6 (kwaivgi/kling-v2.6)start_imageNone published1"Ignored if start_image is provided"
Happy Horse 1.1 (alibaba/happyhorse-1.1)images arrayjpg/png/bmp/webp, 10 MB each, aspect 1:2.5 to 2.5:1, each side 300px or more9Single image: "the image's aspect ratio is used"; applies again with 2+ references
Seedance 2.0 (BytePlus ModelArk in production)first frame, or 1 to 9 reference imagesjpeg/png/webp/bmp/tiff/gif/heic/heif, aspect 0.4 to 2.5, 300 to 6,000px per side, under 30 MB9, exclusive with a first frameReplicate copy: 'adaptive' lets the model choose from the inputs
Seedance 1.5 Pro (bytedance/seedance-1.5-pro)image, optional last_frame_imageNone published1 (+1 last frame)"Ignored if an image is used"
Grok Imagine Video (xai/grok-imagine-video)imagejpg, jpeg, png, webp; no size limit published1"Defaults to the input image's native aspect ratio"
OmniHuman 1.5 (bytedance/omni-human-1.5)image + audio"Input image containing a human subject, face or character"; audio under 35 s1No aspect field at all
VEED Fabric 1.0 (veed/fabric-1.0)image + audioNone published1No aspect field at all
Pruna Avatar (prunaai/p-video-avatar)image ("first frame")jpg, jpeg, png, webp1No aspect field at all

Two rows deserve a note. Veo 3.1 Fast is the endpoint we call, not the standard google/veo-3.1, and the Fast schema exposes an image and a last_frameand nothing else for stills. Google's own Veo documentation describes up to three reference images for Veo 3.1 and Veo 3.1 Fast on the Gemini API, but Replicate's google/veo-3.1-fast schema does not expose a reference_imagesfield, so through this pipeline Veo is a one-photo model. Seedance 2.0's constraints are BytePlus figures, and the 30 MB ceiling and 6,000px maximum are far looser than Kling's. That is why the common floor in the quick answer is set by Kling 3.0 and Happy Horse 1.1 rather than by Seedance.

The aspect trap, and the one model that avoids it

Read the last column again. Three schemas say, in slightly different words, that the photo overrides the setting, and a fourth makes the photo the default. Happy Horse 1.1: "When a single image is provided (image-to-video), the image's aspect ratio is used." Kling 2.6: "Aspect ratio of the video. Ignored if start_image is provided." Seedance 1.5 Pro: "Video aspect ratio. Ignored if an image is used." Grok: "For image-to-video, defaults to the input image's native aspect ratio." Kling 3.0 goes further and makes the setting conditional: "Aspect ratio. Required when not using start frame or video editing."

Our own dispatch code says the same thing from the other side. The builders for these models still pass the aspect value through, and the comment on the shared aspect helper treats a fallback value as harmless on image-to-video calls because the input image's ratio wins. That note is only strictly true for the models whose schemas say so. So a 1:1 Shopify product photo produces a square ad on Happy Horse, Kling 2.6 and Seedance 1.5, and the 9:16 you selected in the wizard was decorative. Grok is the softer case: its schema says the setting defaults to the photo's ratio, and our builder sends your pick explicitly, so treat the photo's ratio as what you will get unless the model honours the override. If you have ever wondered why a vertical campaign came back square, this is why.

Veo 3.1 Fast is different in kind, not degree. Its aspect_ratiois an enum of exactly two values, 16:9 and 9:16, and the image field says: "Input image to start generating from. Ideal images are 16:9 or 9:16 and 1280x720 or 720x1280, depending on the aspect ratio you choose." The setting is real, and the schema is telling you to pre-crop the photo to match it. Send a square photo with 9:16 selected and you are relying on the model to reconcile the two. Send a 720x1280 portrait crop and there is nothing to reconcile.

The fix is the same on every model and takes ten seconds: crop the photo to the ratio you want the ad to be, before upload. For a vertical ad that means 9:16, and for Veo specifically 720x1280 or 1280x720. The Amazon 16:9 post works the same problem in the opposite direction, where the platform demands landscape and the photo library is all portrait.

Multi-photo inputs: three models, three different grammars

A product-in-hand ad or a demo that shows the box, the bottle and the label usually needs more than one still. Only three models take more than one still as a reference, and none of them take it the same way.

  • Happy Horse 1.1 has a single imagesarray: none for text-to-video, one to animate as the first frame, "or multiple images (up to 9) for reference-to-video." The prompt refers to them as "[Image 1], [Image 2], etc." With two or more images the aspect setting applies again, because there is no single frame to inherit from.
  • Kling 3.0 keeps start_image and reference_imagesas separate fields. The first is the locked opening frame; the rest are "Reference images for elements, scenes, or styles", capped at "Max 7 without video, 4 with video." The prompt syntax is <<<image_1>>>, and the prompt itself is limited to 2,500 characters. Our pipeline sends the first upload as the start frame and up to six more as references.
  • Seedance 2.0forces a choice. BytePlus: "Image-to-video (first frame), image-to-video (first and last frames), and omni reference-to-video (including reference images, videos, and audio) are mutually exclusive scenarios and cannot be mixed." The Replicate copy of the model says the same in its field descriptions: the first-frame image "Cannot be combined with reference images." So with one photo you get a locked first frame; with two or more you get a reference set of up to 9 and give up the frame lock. BytePlus adds that in reference mode you can name one reference image as the first frame in the prompt to get the effect indirectly, and that only the first-and-last-frame mode strictly guarantees a pixel match. Our builder makes exactly that switch at two images.

The practical consequence: if the opening frame must be your actual product shot, pixel for pixel, Kling 3.0 is the only multi-photo model that guarantees it while still taking references. On Seedance 2.0 the reference route means the model composes the first frame itself. The product demo post covers how to structure a multi-clip demo around that difference, and product-in-hand UGC covers the compositing case.

Talking-actor models: the photo is the actor

OmniHuman 1.5, VEED Fabric 1.0 and Pruna Avatar are a different category. They take a still and a voice track (through our pipeline Pruna generates its own speech from voice_script, described as "Exact words the avatar should say. Required when no audio file is uploaded.") and animate the still to match. OmniHuman's schema states the requirement plainly: "Input image containing a human subject, face or character." Pruna calls its image the "first frame". There is no aspect field on any of the three, and the output length is the audio length, which on OmniHuman is capped hard: "Duration must be less than 35 seconds. If the audio exceeds 35 seconds, an error will be generated and the generation will fail."

So a product-only photo is the wrong input here, and a photo of a person holding the product is the right one. If you need to know which of these three to pick, the lip-sync model comparison is the relevant read; this post only cares that the face is in the frame before you upload.

A pre-upload check that satisfies every row

  • Export as JPEG or PNG. WebP is fine on Grok, Pruna, Happy Horse and Seedance 2.0 and refused by Kling 3.0's .jpg/.jpeg/.png list, so JPEG is the export that never needs a second thought.
  • Keep both sides at 300px or more. Kling 3.0, Happy Horse 1.1 and BytePlus all publish that floor. A 1280x720 or 720x1280 file clears it and also hits Veo's stated ideal.
  • Stay under 10 MB. That is the tightest published cap (Kling 3.0 and Happy Horse 1.1); BytePlus allows 30 MB, which changes nothing if you already fit the tighter one.
  • Keep the ratio between 1:2.5 and 2.5:1. A very tall banner crop fails Kling 3.0, Happy Horse 1.1 and Seedance 2.0 alike. Then crop to the ratio you want the ad to be, because on most models that crop is the ad's ratio.
  • For a talking actor, make sure a face is in the frame and the voice track is under 35 seconds.
  • For multi-photo work, decide whether you need a locked first frame (Kling 3.0) or a reference set (Happy Horse 1.1, Seedance 2.0), and write the prompt in that model's reference syntax.

None of this is a quality tip. It is the set of rules the endpoints enforce, or silently apply, and the reason it belongs in front of the prompt-writing step is that a successful render from the wrong photo is billed at full price. On our catalogue the three most common picks land between 245 and 315 credits per clip, and a clip that came back the wrong shape costs the same as one that came back right. If you are writing the Veo prompt next, the six-part Veo 3.1 prompt shape assumes the photo is already right.

Sources

All twelve were read on 4 September 2026. Schemas change when a vendor ships a new version; the field names above are how you check whether a row has moved.


Once the photo is right, the next questions are model choice and cost. Kling 3.0 vs Veo 3.1 compares the two most common picks, and the per-model cost benchmarks price every row in the table above. UGC Vids AI runs all of them from one upload, from $49/month, free for 3 days.

Frequently asked questions

What is the one photo spec that works on every image-to-video model?

A JPEG or PNG, at least 300 pixels on each side, with an aspect ratio between 1:2.5 and 2.5:1, under 10 MB. That is the intersection of every published constraint in the table: Kling 3.0 accepts only .jpg/.jpeg/.png at max 10 MB and min 300px, Happy Horse 1.1 caps at 10 MB per image with each side at least 300px, and BytePlus allows Seedance 2.0 up to 30 MB and 6,000px, which a 10 MB file already satisfies. WebP is accepted by Grok, Pruna, Happy Horse and Seedance 2.0 but not by Kling 3.0, so a JPEG is the safer export.

Does the aspect ratio setting do anything once I upload a photo?

On most of them, no. Happy Horse 1.1, Kling 2.6, Seedance 1.5 Pro and Grok Imagine Video all state that the input photo sets the output ratio and the dropdown is ignored or defaulted, and Kling 3.0 only reads the setting when there is no start frame. Veo 3.1 Fast is the exception: its aspect_ratio is a real 16:9 or 9:16 choice and the schema asks for a photo that already matches it. So the practical rule is to crop the photo to the ratio you want before upload: on the first four models the crop is the setting, and on Veo it removes the mismatch the schema warns about.

Which models accept more than one product photo?

Three of the models we run take more than one reference photo. Happy Horse 1.1 takes up to 9 images in a single images array. Kling 3.0 takes a start_image plus a reference_images array that the schema caps at 7 without a reference video (4 with one); our pipeline sends the first upload as the start frame and up to six more as references, seven photos in all. Seedance 2.0 takes up to 9 reference images, but BytePlus states that first-frame, first-and-last-frame, and reference-image generation are mutually exclusive scenarios, so you choose between a locked first frame and a reference set. Every other model in the table takes exactly one photo.

Can I use a product-only photo on OmniHuman 1.5, VEED Fabric or Pruna Avatar?

Not usefully. These are audio-driven talking-actor models and the input photo is the actor. OmniHuman 1.5's schema describes its image field as an input image containing a human subject, face or character, and Pruna Avatar calls its image the first frame of a speaking video. A bottle with no face gives the model nothing to animate. Put the product in the actor's hand in the source photo, or generate the product shot on a different model and cut it in.

What happens to the credits when the input photo was wrong?

A render that succeeds but was built from a mis-shaped or mis-cropped photo costs exactly the same as a good one, because the model did what it was asked. On our catalogue that is 245 credits for an 8-second Veo 3.1 clip, 260 for 5 seconds of Kling 3.0 at 1080p, and 315 for 5 seconds of Seedance 2.0 at 1080p, and the talking-actor models bill per spoken second (Pruna Avatar at 18.4 credits per second). Checking the photo against the table before you press Generate is the cheapest step in the whole workflow.

Definitions

What is Text-to-Video?What is AI Avatar?What is Talking Head?What is B-roll?What is Lip Sync?

Compare alternatives

UGC Vids AI vs ArcadsUGC Vids AI vs MakeUGCUGC Vids AI vs Creatify

Stop reading. Start shipping.

Generate your first UGC ad in 2 minutes. No editing required.

Try the free generator