---
title: Animating a still with a first frame — P-Video-2 | Runware Docs
url: https://runware.ai/docs/models/prunaai-p-video-2/guides/image-to-video
description: How to drive Pruna P-Video-2 from an image with inputs.frameImages, why the still and not your parameters decides the output shape, and how to hold a product across a variant set.
---
### [Introduction](https://runware.ai/docs/models/prunaai-p-video-2/guides/image-to-video#introduction)

Text-to-video gives you a new scene every call. That is the wrong property for most commercial work, where the product, the person and the set are already decided and the only open question is what moves. Passing a still through `inputs.frameImages` **fixes the first frame and leaves you prompting only the motion**.

[Watch video](https://runware.ai/docs/assets/output-hero.DirfTc2N.mp4)

*Six seconds of motion from one still*

> **Prompt**: She turns her head slowly toward the lens and settles into a small confident smile as a light breeze moves the ends of her hair and the leaves of the olive trees behind her. The camera holds still. Audio: quiet rooftop ambience with a soft breeze, distant city hum, no music, no voice.

**First frame**:

![A woman in a scarlet tailored blazer standing on a sunlit rooftop terrace with potted olive trees behind her, looking just past the lens](https://runware.ai/docs/assets/still-hero.Z-DUpKTJ_4r2Qa.jpg)

> **Prompt**: A woman in her thirties in a scarlet tailored blazer over a white shirt stands on a sunlit rooftop terrace with potted olive trees behind her, one hand resting in her pocket, looking just past the lens. Bright late morning sun from the right, city rooftops soft in the far background. Photoreal fashion editorial photography, medium shot, shallow depth of field, no text.

The blazer is the same scarlet, the terrace is the same terrace and the face is the same face, because none of it was regenerated. This guide covers the request, the one parameter rule that surprises everyone, how to split work between the still and the prompt, and the variant-set pattern that makes this worth building a pipeline around.

### [The request](https://runware.ai/docs/models/prunaai-p-video-2/guides/image-to-video#the-request)

`inputs.frameImages` is an array, and P-Video-2 takes **one item in it**. Each item can be a bare image or an object that names the position it occupies.

```json
{
  "inputs": {
    "frameImages": [
      "https://im.runware.ai/image/os/a14d18/ws/2/ii/3b7d2c94-5f81-4a60-9e27-1c8a4d6f2b93.jpg"
    ]
  }
}
```

The explicit form does the same thing and reads better in a codebase that also builds requests for models with more frames:

```json
{
  "inputs": {
    "frameImages": [
      {
        "image": "https://im.runware.ai/image/os/a14d18/ws/2/ii/3b7d2c94-5f81-4a60-9e27-1c8a4d6f2b93.jpg",
        "frame": "first"
      }
    ]
  }
}
```

`frame` accepts `"first"` or the index `0`. To pin the closing frame as well, see [first and last frame](https://runware.ai/docs/models/prunaai-p-video-2/guides/first-and-last-frame). The image itself can be a URL, a UUID from an earlier task, a data URI or base64, so a still generated in the same pipeline can be handed straight over without a round trip through your own storage.

**TypeScript**:

```typescript
import { createClient } from '@runware/sdk'

const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()

const [result] = await client.run({
  model: 'prunaai:p-video@2',
  positivePrompt: 'The handbag rotates very slowly a quarter turn to the left, the gold clasp catching a moving highlight as it goes, the top handle settling slightly with the movement. The camera holds still. Audio: quiet studio room tone, faint leather movement, no music, no voice.',
  inputs: {
    frameImages: [
      {
        image: 'https://im.runware.ai/image/os/a14d18/ws/2/ii/8e1a5c73-2d94-4b06-9f52-3a7c8d1e4b60.jpg',
        frame: 'first'
      }
    ]
  },
  resolution: '720p',
  duration: 5,
  seed: 6612408,
  deliveryMethod: 'async'
})
```

**Python**:

```python
import asyncio
import os

from runware import Runware

async def main():
    async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
        results = await client.run({
            "model": "prunaai:p-video@2",
            "positivePrompt": "The handbag rotates very slowly a quarter turn to the left, the gold clasp catching a moving highlight as it goes, the top handle settling slightly with the movement. The camera holds still. Audio: quiet studio room tone, faint leather movement, no music, no voice.",
            "inputs": {
                "frameImages": [
                    {
                        "image": "https://im.runware.ai/image/os/a14d18/ws/2/ii/8e1a5c73-2d94-4b06-9f52-3a7c8d1e4b60.jpg",
                        "frame": "first"
                    }
                ]
            },
            "resolution": "720p",
            "duration": 5,
            "seed": 6612408,
            "deliveryMethod": "async"
        })

asyncio.run(main())
```

**cURL**:

```bash
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "videoInference",
      "taskUUID": "b93c47d1-8a25-4e60-9f13-7c2d5a8e1b04",
      "model": "prunaai:p-video@2",
      "positivePrompt": "The handbag rotates very slowly a quarter turn to the left, the gold clasp catching a moving highlight as it goes, the top handle settling slightly with the movement. The camera holds still. Audio: quiet studio room tone, faint leather movement, no music, no voice.",
      "inputs": {
        "frameImages": [
          {
            "image": "https://im.runware.ai/image/os/a14d18/ws/2/ii/8e1a5c73-2d94-4b06-9f52-3a7c8d1e4b60.jpg",
            "frame": "first"
          }
        ]
      },
      "resolution": "720p",
      "duration": 5,
      "seed": 6612408,
      "deliveryMethod": "async"
    }
  ]'
```

**CLI**:

```bash
runware run prunaai:p-video@2 \
  positivePrompt="The handbag rotates very slowly a quarter turn to the left, the gold clasp catching a moving highlight as it goes, the top handle settling slightly with the movement. The camera holds still. Audio: quiet studio room tone, faint leather movement, no music, no voice." \
  inputs.frameImages.0.image=https://im.runware.ai/image/os/a14d18/ws/2/ii/8e1a5c73-2d94-4b06-9f52-3a7c8d1e4b60.jpg \
  inputs.frameImages.0.frame=first \
  resolution=720p \
  duration=5 \
  seed=6612408 \
  deliveryMethod=async
```

**JSON**:

```json
{
  "taskType": "videoInference",
  "taskUUID": "b93c47d1-8a25-4e60-9f13-7c2d5a8e1b04",
  "model": "prunaai:p-video@2",
  "positivePrompt": "The handbag rotates very slowly a quarter turn to the left, the gold clasp catching a moving highlight as it goes, the top handle settling slightly with the movement. The camera holds still. Audio: quiet studio room tone, faint leather movement, no music, no voice.",
  "inputs": {
    "frameImages": [
      {
        "image": "https://im.runware.ai/image/os/a14d18/ws/2/ii/8e1a5c73-2d94-4b06-9f52-3a7c8d1e4b60.jpg",
        "frame": "first"
      }
    ]
  },
  "resolution": "720p",
  "duration": 5,
  "seed": 6612408,
  "deliveryMethod": "async"
}
```

### [The still sets the shape, not your parameters](https://runware.ai/docs/models/prunaai-p-video-2/guides/image-to-video#the-still-sets-the-shape-not-your-parameters)

This is the rule that catches people, and it is enforced rather than advisory. **`width` and `height` are rejected outright when `frameImages` is present.** A request carrying both comes back as a validation error, not a cropped video.

> [!WARNING]
> `width` and `height` are mutually exclusive with `inputs.frameImages`, and separately with `resolution`. With a first frame in the request there is no way to state output dimensions at all: **the aspect ratio comes from the still** and `resolution` selects the tier.

So the shape of your video is decided upstream, when you generate or choose the still. A square 1024 × 1024 packshot at `720p` returns a 960 × 960 video, and the same still at `1080p` returns 1408 × 1408. Those numbers are not typos: **the tier is a pixel budget rather than an edge length**, and every accepted size is a multiple of 64. [Resolution and duration](https://runware.ai/docs/models/prunaai-p-video-2/guides/resolution-and-duration) has the full set. Nothing you pass changes the ratio.

[Watch video](https://runware.ai/docs/assets/output-motion-subtle.BaJs6kIm.mp4)

*resolution: 720p, from a square still*

> **Prompt**: The handbag rotates very slowly a quarter turn to the left, the gold clasp catching a moving highlight as it goes, the top handle settling slightly with the movement. The camera holds still. Audio: quiet studio room tone, faint leather movement, no music, no voice.

[Watch video](https://runware.ai/docs/assets/output-handbag-1080p.DrZqaPdY.mp4)

*resolution: 1080p, same still, same seed*

> **Prompt**: The handbag rotates very slowly a quarter turn to the left, the gold clasp catching a moving highlight as it goes, the top handle settling slightly with the movement. The camera holds still. Audio: quiet studio room tone, faint leather movement, no music, no voice.

Both are square because the still was square. The difference is the grain of the leather and the edge of the clasp, which on a product listing is the difference between a clip that sells and one that looks like a compression artifact.

Square is also the one ratio where the two tiers have an identical shape. **Every other ratio changes slightly between 720p and 1080p**, so a non-square still stepped up a tier comes back reframed a little as well as sharper.

**Plan the aspect at the still stage.** If a campaign needs a 16:9 hero and a 9:16 cutdown, that is two stills, not one still and a crop. Cropping a finished clip throws away the pixels you paid the 1080p rate for.

### [What the still fixes and what the prompt moves](https://runware.ai/docs/models/prunaai-p-video-2/guides/image-to-video#what-the-still-fixes-and-what-the-prompt-moves)

The still is not a suggestion. It is the literal first frame, so everything visible in it is settled: the subject, the wardrobe, the set, the palette, the lens and the light. What the prompt still owns is **what happens over the next few seconds**, and how much of it.

[Watch video](https://runware.ai/docs/assets/output-motion-subtle.BaJs6kIm.mp4)

*Subtle: the product stays readable throughout*

> **Prompt**: The handbag rotates very slowly a quarter turn to the left, the gold clasp catching a moving highlight as it goes, the top handle settling slightly with the movement. The camera holds still. Audio: quiet studio room tone, faint leather movement, no music, no voice.

[Watch video](https://runware.ai/docs/assets/output-motion-strong.DOEPr-JD.mp4)

*Strong: the product leaves the frame it was sold in*

> **Prompt**: A hand enters from the right, lifts the handbag by its top handle, swings it up out of frame and the camera whips left to follow it across the studio. Audio: quiet studio room tone, leather and clasp movement, no music, no voice.

Both are faithful to the still on frame one. By the end, only one of them is still a product shot. **Motion that removes the subject from frame is motion that undoes the reason you used a still**, which is why listing and PDP work sits at the subtle end almost without exception: a quarter turn, a settle, a highlight travelling across a surface.

The strong version is not a failure, it is a different deliverable. It belongs in a social edit where the swing is the beat and the product gets its own clean clip elsewhere.

### [Describe the motion, not the scene](https://runware.ai/docs/models/prunaai-p-video-2/guides/image-to-video#describe-the-motion-not-the-scene)

A first frame answers every question a scene description would, and it answers them with more authority than the prompt has. Restate the scene and the model does not argue with the image, it ignores what you wrote. The description is not dangerous, it is **wasted prompt budget**, and it crowds out the one thing the prompt is there to say.

![A tan pebbled leather handbag with a gold clasp standing upright and centred on a plain bone-white studio backdrop](https://runware.ai/docs/assets/still-handbag.D4QfNlwG_gJcHu.jpg)

*The first frame*

> **Prompt**: An unbranded tan pebbled leather handbag with a gold clasp and a short top handle, standing upright and centred on a plain bone-white seamless studio backdrop. Even soft studio lighting from both sides, a faint contact shadow under the base. Photoreal e-commerce packshot photography, square framing, sharp detail on the grain of the leather, no text.

[Watch video](https://runware.ai/docs/assets/output-motion-subtle.BaJs6kIm.mp4)

*Motion only*

> **Prompt**: The handbag rotates very slowly a quarter turn to the left, the gold clasp catching a moving highlight as it goes, the top handle settling slightly with the movement. The camera holds still. Audio: quiet studio room tone, faint leather movement, no music, no voice.

The working shape for an image-to-video prompt is short and verbs-first:

```text
The chair rotates slowly and steadily through a quarter turn to the right,
the light moving across the frame and the seat pad as it goes. The camera
holds still.

Audio: quiet studio room tone, no music, no voice.
```

Nothing in there says what the chair looks like. **Name only what changes**, plus the camera instruction and the sound. If you find yourself describing the subject, you are writing a text-to-video prompt with an image attached.

> [!NOTE]
> One exception is worth knowing: naming a subject you want *preserved* can help when the motion would otherwise tempt the model to reinterpret it. "The woven cane seat stays woven cane" is a preserve clause, not a scene description, and it costs six words.

### [Stills that animate well](https://runware.ai/docs/models/prunaai-p-video-2/guides/image-to-video#stills-that-animate-well)

Pruna's guidance is to start from a high-quality, well-lit image, and the failure case shows why it is not just a quality note. A still needs **a clear subject with somewhere to move**.

![A dim cluttered home office at night shot from the doorway, the desk covered in paperwork, cables, mugs and books, lit only by a desk lamp](https://runware.ai/docs/assets/still-cluttered.DnX4MIWy_1w0Btd.jpg)

*No subject, low light, no depth to travel through*

> **Prompt**: A dim cluttered home office photographed from the doorway at night, a desk buried under paperwork, cables, three mugs, a laptop, a stack of books and a desk lamp as the only light source, a bookshelf crammed with boxes behind it, deep shadows in every corner and no clear subject anywhere in the frame. Photoreal available-light photography, wide shot, no text.

[Watch video](https://runware.ai/docs/assets/output-cluttered.LqCAIvIv.mp4)

*The push in has nothing stable to move past*

> **Prompt**: A slow gentle push in toward the desk. Audio: quiet room tone, no music, no voice.

The objects rearrange themselves as the camera advances, because there is no hierarchy in the frame for the model to preserve. Three things make a still animate badly, and they compound: **low light** starves the detail the model needs to track, **clutter** removes the subject, and **a flat frame with no depth** gives a camera move nothing to parallax against.

The stills that work look like the packshots and portraits earlier in this guide. One subject, lit so its edges are unambiguous, with either room to move or a background that can fall away behind it.

### [A variant set from one motion prompt](https://runware.ai/docs/models/prunaai-p-video-2/guides/image-to-video#a-variant-set-from-one-motion-prompt)

This is the pattern that pays for the pipeline. Generate a still per SKU, then run **one motion prompt on one seed** across all of them. The motion is identical because the instruction and the seed are identical, and the products differ because only the stills differ.

![A mid-century dining chair with a walnut frame and an oatmeal wool seat pad, angled three-quarters to camera on a warm grey backdrop](https://runware.ai/docs/assets/still-chair-walnut.CuciUCny_ZrEVm4.jpg)

*Walnut and oatmeal*

> **Prompt**: A mid-century dining chair with a solid walnut frame and a pale oatmeal wool seat pad, angled three-quarters to camera on a plain warm grey seamless studio backdrop. Even soft studio lighting, faint contact shadow under the legs. Photoreal furniture e-commerce packshot photography, square framing, no text.

![The same chair design with a matte black ash frame and a charcoal wool seat pad on the same warm grey backdrop](https://runware.ai/docs/assets/still-chair-black.CHUrBKlT_T6m1Q.jpg)

*Black ash and charcoal*

> **Prompt**: A mid-century dining chair with a matte black ash frame and a charcoal wool seat pad, angled three-quarters to camera on a plain warm grey seamless studio backdrop. Even soft studio lighting, faint contact shadow under the legs. Photoreal furniture e-commerce packshot photography, square framing, no text.

![The same chair design with a pale oak frame and a woven natural cane seat on the same warm grey backdrop](https://runware.ai/docs/assets/still-chair-cane.2ny2l6f3_ZVV4St.jpg)

*Oak and cane*

> **Prompt**: A mid-century dining chair with a pale oak frame and a woven natural cane seat, angled three-quarters to camera on a plain warm grey seamless studio backdrop. Even soft studio lighting, faint contact shadow under the legs. Photoreal furniture e-commerce packshot photography, square framing, no text.

[Watch video](https://runware.ai/docs/assets/output-chair-walnut.1EFD9CqT.mp4)

*seed 9048175*

> **Prompt**: The chair rotates slowly and steadily through a quarter turn to the right, the light moving across the frame and the seat pad as it goes. The camera holds still. Audio: quiet studio room tone, no music, no voice.

[Watch video](https://runware.ai/docs/assets/output-chair-black.BhFskoyu.mp4)

*seed 9048175*

> **Prompt**: The chair rotates slowly and steadily through a quarter turn to the right, the light moving across the frame and the seat pad as it goes. The camera holds still. Audio: quiet studio room tone, no music, no voice.

[Watch video](https://runware.ai/docs/assets/output-chair-cane.DYfKBTEI.mp4)

*seed 9048175*

> **Prompt**: The chair rotates slowly and steadily through a quarter turn to the right, the light moving across the frame and the seat pad as it goes. The camera holds still. Audio: quiet studio room tone, no music, no voice.

The three clips turn the same way, at a similar rate, under the same light, which is what makes them usable as a set on one category page. **Expect the amount of rotation to vary between them**, because a shared seed cannot fully hold motion when the starting still changes, so check the set and re-roll any that land noticeably short. Generated with fresh seeds instead, they would each pick their own staging and the grid would read as three shoots.

For the stills themselves, generating each colorway from a shared description with only the material swapped is what keeps the framing and the light consistent across the set. That work belongs to your image model, and it is worth doing carefully, because **every inconsistency in the stills is inherited by the video**.

### [Speaking from a portrait](https://runware.ai/docs/models/prunaai-p-video-2/guides/image-to-video#speaking-from-a-portrait)

A still with a person in it can deliver a line, which makes a single approved portrait into a whole library of clips. The identity comes from the image, the words from the prompt.

[Watch video](https://runware.ai/docs/assets/output-founder.D_Tod2Rd.mp4)

*One portrait, one quoted line*

> **Prompt**: She holds the lens for a beat, then says, "We started this workshop with two people and one bench." Then she rests and breathes. The camera holds still. Audio: her natural speaking voice, calm and measured, quiet workshop tone underneath, no music.

**Portrait**:

![A woman in her forties with short silver hair in a black roll-neck standing in a bright workshop with timber shelving behind her](https://runware.ai/docs/assets/still-founder.DpCb8SFP_21rWxH.jpg)

> **Prompt**: A woman in her forties with short silver hair, wearing a black roll-neck, standing in a bright workshop with pale timber shelving softly out of focus behind her, arms relaxed, looking straight into the lens. Soft daylight from a large window on the left. Photoreal founder portrait photography, vertical framing, chest-up, shallow depth of field, no text.

The pattern scales the way a script does. **One portrait plus N quoted lines is N clips of the same person**, which is how you build a FAQ set or a localized announcement without the identity drifting between them. The delivery rules are the same as for text-to-video, and [native audio](https://runware.ai/docs/models/prunaai-p-video-2/guides/native-audio) covers the pacing that keeps lip sync honest.

### [Tips](https://runware.ai/docs/models/prunaai-p-video-2/guides/image-to-video#tips)

1. **Decide the aspect when you make the still.** `width` and `height` are rejected alongside `frameImages`, so the still's ratio is the video's ratio. Two deliverable shapes means two stills.
    
2. **Prompt verbs, not nouns.** Name what moves, the camera, and the sound. A subject description competes with the image and the clip drifts.
    
3. **Keep the subject in frame.** Motion that swings the product out of shot discards the reason you started from a still.
    
4. **Pin one seed across a variant set.** Same motion prompt, same seed, different stills gives you clips that turn at the same rate and cut together as a set.
    
5. **Feed it a clean, well-lit still.** Low light, clutter and a flat frame each break the animation in their own way, and together they guarantee it.
    
6. **Pass the still by UUID inside a pipeline.** The image task's UUID is accepted directly, so a still generated a moment earlier needs no upload of your own.
    
7. **Use a preserve clause for materials that get reinterpreted.** "The woven cane seat stays woven cane" is short and it is not a scene description.
    
8. **Go 1080p for anything where surface detail is the product.** From the same still and seed it buys you grain and edge definition. On a square still that is the only change; on any other ratio the framing shifts slightly too, so check the first one rather than assuming.