P-Video-2

P-Video-2 is Pruna AI's quality-focused successor to P-Video, creating clips from text, images, or audio-conditioned inputs through one model. It produces sharper close-ups and foreground subjects, stronger identity and input-image consistency, improved lip synchronization for natively generated speech, and clearer on-screen text while generating dialogue, music, and sound effects with the video. It supports optional first-and-last-frame guidance, draft iteration, durations up to 20 seconds, 720p or 1080p output, and 24 or 48 FPS.

Complete technical specification for integration
Ready-to-use code snippets for common workflows
Step-by-step tutorials for advanced use cases
← All GuidesResolution, aspect ratio, frame rate and length
How to size a Pruna P-Video-2 clip: the two mutually exclusive ways to state dimensions, the fourteen accepted pairs, what 48 fps buys, and what happens when you omit duration.
Introduction
P-Video-2 accepts seven aspect ratios at two resolution tiers, which is fourteen exact output sizes and nothing in between. There is no arbitrary sizing here, and the parameters that get you to those sizes are mutually exclusive in a way that catches most people once.
The thing to understand before you pick one is that a ratio is not a crop. The same prompt on the same seed at two ratios does not frame more or less of one shot, it re-stages the scene:
An unbranded matte black insulated water bottle standing upright and centred on a pale limestone plinth against a plain warm sand-coloured wall, the shadow of a monstera leaf drifting slowly across the wall and the bottle as if moved by air. Even soft daylight from the left. Photoreal product lifestyle cinematography, locked-off camera, no text.
An unbranded matte black insulated water bottle standing upright and centred on a pale limestone plinth against a plain warm sand-coloured wall, the shadow of a monstera leaf drifting slowly across the wall and the bottle as if moved by air. Even soft daylight from the left. Photoreal product lifestyle cinematography, locked-off camera, no text.
The set survives, the staging does not. Same bottle, same plinth, same leaf shadow, and the subject sits at a different scale in the frame with different amounts of wall around it. Neither is a crop of the other, and cropping one to get the other would throw away the composition the model built for that shape.
The practical rule is that each placement is its own generation, planned at the ratio it ships in. A campaign needing a landscape hero and a vertical cutdown is two runs, and the prompt for the vertical one should say what belongs in the extra height.
Two ways to say how big, and you must pick one
resolution and the width/height pair both set the output size, and the request is rejected if it carries both. This is enforced in the schema rather than resolved by precedence.
{ "resolution": "1080p" }
{ "width": 1920, "height": 1088 }resolution takes 720p or 1080p and defaults to 720p, so a request with neither is a 720p request. On its own it gives you the provider's default 16:9 framing at that tier, which is why the showcase above uses explicit pairs: width and height are the only way to choose a non-16:9 shape in text-to-video.
width and height are also required together. Sending one without the other fails, and the pair has to be one of the fourteen exactly.
Both of these are separately rejected alongside inputs.frameImages. With a first frame in the request you cannot state dimensions at all: the aspect comes from the still and resolution picks the tier. See animating a still.
The fourteen pairs
| Aspect | 720p | 1080p |
|---|---|---|
| 16:9 | 1280 × 704 | 1920 × 1088 |
| 9:16 | 704 × 1280 | 1088 × 1920 |
| 4:3 | 1088 × 832 | 1664 × 1216 |
| 3:4 | 832 × 1088 | 1216 × 1664 |
| 3:2 | 1152 × 768 | 1792 × 1152 |
| 2:3 | 768 × 1152 | 1152 × 1792 |
| 1:1 | 960 × 960 | 1408 × 1408 |
Three things about that table are worth knowing, because none of them is what the parameter names suggest.
The tier is a pixel budget, not an edge length. Every 720p size lands near 0.9 megapixels and every 1080p size near 2.0, and the model spends that budget on whichever shape you asked for. That is why the 720p square is 960 × 960 and the 1080p square is 1408 × 1408, neither of which contains the number in its own tier name. Reading one dimension tells you nothing: 1152 is the long edge of a 720p 3:2 clip and the short edge of a 1080p one.
Every dimension is a multiple of 64, which is where the odd numbers come from. The pairs are the nearest multiples of 64 to each ratio at each budget, so most of them are slightly off the ratio they are named after. 16:9 at 720p is 1280 × 704, which is 1.82:1 rather than 1.78:1. The deviation runs up to about 3.7% at 1080p 3:2. Only four are exact: both squares, and 3:2 and 2:3 at 720p.
The two tiers of one ratio are not the same shape. 9:16 is 704 × 1280 at 720p and 1088 × 1920 at 1080p, which are 0.550 and 0.567. Stepping a clip up a tier reframes it slightly as well as resolving it, and the square is the only ratio where that does not happen.
None of the 16:9 sizes is exactly 16:9. Dropping a 1280 × 704 clip onto a 1920 × 1080 timeline will pillarbox or crop it, so a deliverable with a fixed target frame needs a scale-and-crop pass in your edit rather than a straight drop.
720p or 1080p
The tier decides how much detail lands in the frame. Both clips below start from the same still, which is the only way to make this comparison honestly, for reasons the callout after them explains:

An overhead macro photograph of a folded cream cable-knit wool jumper resting on a dark walnut surface, the cable twists and the individual wool fibres sharply resolved, filling the frame. Soft directional daylight raking from the left picking out the depth of the stitching. Photoreal knitwear detail photography, square framing, no hands, no people, no text.
The light rakes slowly across the fabric from left to right, lifting the texture of each cable as it passes and settling again. Nothing else moves and the camera holds still. Audio: quiet room tone, no music, no voice.
The light rakes slowly across the fabric from left to right, lifting the texture of each cable as it passes and settling again. Nothing else moves and the camera holds still. Audio: quiet room tone, no music, no voice.
On a knit close-up the tier is the whole point, because the fibre is the product. On a wide interior or a flat motion-design piece it is close to invisible, and you are paying a higher per-second rate for pixels the viewer's feed will re-compress anyway.
A seed does not survive a change of shape. Run the same text-to-video prompt at 720p and again at 1080p on one seed and you get two unrelated shots, not one shot at two resolutions. The same is true of changing fps, duration, or the aspect ratio: anything that alters the size of the output changes the generation itself.
The only thing that holds a composition across those changes is a first frame. Both clips above share one still, which is why the difference between them is detail rather than staging.
That has a direct cost consequence, and it is the opposite of what you would assume. You cannot explore cheaply at 720p and then re-run the winner at 1080p, because the winner will not come back. If the composition matters, either commit to the tier from the start, or lock the frame you approved and drive the final render from it as an image-to-video request.
A workable policy, given that 1080p costs roughly twice as much per second:
- 1080p for anything where material, skin or fine surface is being sold. Product detail, garment texture, beauty, jewelry, food.
- 720p for wides, interiors, illustrated and motion-design work, social cutdowns, and every draft.
- 720p for the whole exploration, then commit. What you cannot do is re-run the approved 720p clip at 1080p and get it back, so if the exact shot matters, take the frame you approved and drive the final render from it.
24 or 48 frames
fps takes 24 or 48 and defaults to 24. Doubling it doubles the frames the model has to produce, and what you get for that is motion clarity rather than picture quality. Both clips below run from one still, for the same reason the tier pair does:

A sprinter in a navy vest and white shorts at full stride on a red outdoor running track, caught mid-step with one spike about to strike the surface, arms driving, seen side-on at full body length. Bright hard midday sun, empty stadium seating softly out of focus behind. Photoreal sports photography, wide framing, no text.
He runs at full pace from left to right, arms driving and spikes striking the track surface. The camera pans smoothly to hold him centred in frame. Audio: track ambience and the rhythm of spikes on the surface, no music, no voice.
He runs at full pace from left to right, arms driving and spikes striking the track surface. The camera pans smoothly to hold him centred in frame. Audio: track ambience and the rhythm of spikes on the surface, no music, no voice.
At 24 the fast limbs smear into each other. At 48 each position is discrete. Reach for 48 when something in frame moves faster than the frame rate can describe: sport, a whip of fabric, a fast pan, water, anything you might want to slow down in post.
Check the result rather than assuming, because 48 fps asks the model for twice as many frames of a fast subject and a stride cycle that steps unevenly is more obvious at the higher rate, not less. Where the motion is the deliverable, a 24 fps take with honest motion blur often beats a 48 fps one with a broken gait.
Stay at 24 for the rest, and specifically for anything that should read as film. 48 fps looks like broadcast or live video, which is the right texture for a workout demo and the wrong one for a brand film. It is a look, not an upgrade.
Pruna report that 1080p combined with 48 fps can return black frames on some runs. Until that is resolved, treat the two as an either-or: take the tier at 24, or take the frame rate at 720p. If you need both, check the output rather than shipping it unwatched.
How long
duration is an integer from 1 to 20 seconds, and it has no default. Leaving it out is not the same as passing a fallback: the model chooses the length from the prompt.
That is worth using deliberately. Two prompts describing actions of obviously different lengths, neither carrying a duration:
A single ripe strawberry drops into a glass of sparkling water and bubbles rush up around it. Photoreal beverage cinematography, locked-off macro camera, plain white background, no text. Audio: the plink of fruit hitting water and fizzing bubbles, no music, no voice.
A woman in an apron unpacks a cardboard grocery box that sits on a kitchen island in front of her, lifting out one vegetable at a time and setting each one down in a neat row on the counter to the right of the box, until four vegetables stand in a line. She then lifts the empty box off the counter and sets it down on the floor beside her. Photoreal lifestyle cinematography, locked-off camera, soft daylight, no text. Audio: quiet kitchen tone, cardboard and produce handling, no music, no voice.
The prompt is the length hint. A single event gets a short clip and a sequence of events gets a longer one, so a prompt that lists four actions is asking for time whether or not you said so.
Forcing that same sequence into three seconds shows what the parameter costs when it fights the prompt:
A woman in an apron unpacks a cardboard grocery box that sits on a kitchen island in front of her, lifting out one vegetable at a time and setting each one down in a neat row on the counter to the right of the box, until four vegetables stand in a line. She then lifts the empty box off the counter and sets it down on the floor beside her. Photoreal lifestyle cinematography, locked-off camera, soft daylight, no text. Audio: quiet kitchen tone, cardboard and produce handling, no music, no voice.
The actions do not get dropped, they get rushed into a speed no hand moves at. The fix is to match the two: either lengthen the duration or shorten the prompt to one action. The same principle governs spoken lines, where compression breaks lip sync first, as native audio covers.
Since billing runs per second of finished video, duration is the single biggest lever on what a clip costs. Twenty seconds costs four times five seconds. Explore at three to five, deliver at the length the edit needs.
duration is rejected when inputs.audio is present, because the track sets the length instead. That also means the 20-second ceiling applies to imported audio: a longer track needs cutting into sections. See audio-driven generation.
Choosing for the deliverable
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: 'An unbranded matte black insulated water bottle standing upright and centred on a pale limestone plinth against a plain warm sand-coloured wall, the shadow of a monstera leaf drifting slowly across the wall and the bottle as if moved by air. Even soft daylight from the left. Photoreal product lifestyle cinematography, locked-off camera, no text.',
width: 704,
height: 1280,
duration: 5,
fps: 24,
seed: 4408192,
deliveryMethod: 'async'
})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": "An unbranded matte black insulated water bottle standing upright and centred on a pale limestone plinth against a plain warm sand-coloured wall, the shadow of a monstera leaf drifting slowly across the wall and the bottle as if moved by air. Even soft daylight from the left. Photoreal product lifestyle cinematography, locked-off camera, no text.",
"width": 704,
"height": 1280,
"duration": 5,
"fps": 24,
"seed": 4408192,
"deliveryMethod": "async"
})
asyncio.run(main())curl https://api.runware.ai/v1 \
-H "Authorization: Bearer $RUNWARE_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{
"taskType": "videoInference",
"taskUUID": "f38a2c71-5d94-4b06-8e13-7a2c9d5f1b40",
"model": "prunaai:p-video@2",
"positivePrompt": "An unbranded matte black insulated water bottle standing upright and centred on a pale limestone plinth against a plain warm sand-coloured wall, the shadow of a monstera leaf drifting slowly across the wall and the bottle as if moved by air. Even soft daylight from the left. Photoreal product lifestyle cinematography, locked-off camera, no text.",
"width": 704,
"height": 1280,
"duration": 5,
"fps": 24,
"seed": 4408192,
"deliveryMethod": "async"
}
]'runware run prunaai:p-video@2 \
positivePrompt="An unbranded matte black insulated water bottle standing upright and centred on a pale limestone plinth against a plain warm sand-coloured wall, the shadow of a monstera leaf drifting slowly across the wall and the bottle as if moved by air. Even soft daylight from the left. Photoreal product lifestyle cinematography, locked-off camera, no text." \
width=704 \
height=1280 \
duration=5 \
fps=24 \
seed=4408192 \
deliveryMethod=async{
"taskType": "videoInference",
"taskUUID": "f38a2c71-5d94-4b06-8e13-7a2c9d5f1b40",
"model": "prunaai:p-video@2",
"positivePrompt": "An unbranded matte black insulated water bottle standing upright and centred on a pale limestone plinth against a plain warm sand-coloured wall, the shadow of a monstera leaf drifting slowly across the wall and the bottle as if moved by air. Even soft daylight from the left. Photoreal product lifestyle cinematography, locked-off camera, no text.",
"width": 704,
"height": 1280,
"duration": 5,
"fps": 24,
"seed": 4408192,
"deliveryMethod": "async"
}Response
[
{
"taskType": "videoInference",
"taskUUID": "f38a2c71-5d94-4b06-8e13-7a2c9d5f1b40",
"videoUUID": "2c7d5a91-8e34-4b60-9f18-5a3c1d7f9e26",
"videoURL": "https://vm.runware.ai/video/os/a14d18/ws/2/vi/2c7d5a91-8e34-4b60-9f18-5a3c1d7f9e26.mp4"
}
]| Deliverable | Size | fps | Duration |
|---|---|---|---|
| Reels, TikTok, Shorts | 704 × 1280 | 24 | 5 to 8 |
| Feed post, square | 960 × 960 | 24 | 5 to 6 |
| PDP or listing loop | 1408 × 1408 or 1216 × 1664 | 24 | 3 to 5 |
| Product detail, texture | 1920 × 1088 | 24 | 5 |
| Site hero banner | 1920 × 1088 | 24 | 5 to 8 |
| Workout or technique demo | 704 × 1280 | 48 | 8 to 12 |
| Sport or fast action | 1280 × 704 | 48 | 5 to 8 |
| Draft of any of the above | keep the ratio, drop to 720p | 24 | 3 |
The last row needs the caveat from earlier. Dropping to 720p for a draft gets you a cheap look at what a prompt produces, but it does not get you a preview of the 1080p version, because the tier change regenerates the shot. Use the low tier to settle the prompt, the staging language and the length, then accept that the final run is its own take. When the exact composition has to carry through, draft mode is the better lever, since it changes quality without changing the output shape.
Tips
-
The tier is a pixel budget, not an edge. 720p is about 0.9 MP and 1080p about 2.0, spent on whatever shape you asked for. The 720p square is 960 × 960, not 720 × 720.
-
Pick
resolutionor the pair, never both. They are mutually exclusive, andresolutionalone gives you 16:9. Non-16:9 text-to-video needswidthandheight. -
Send
widthandheighttogether. One without the other is rejected, and the pair must be one of the fourteen. -
A seed does not survive a change of shape. Different
resolution,fps,durationor ratio means a different shot, not the same shot resized. Anchor with a first frame when the composition has to hold. -
48 fps is a look, not a quality setting. It buys motion clarity and costs you the filmic texture. Use it for sport and fast movement, not for brand films, and watch the result: fast gaits step more visibly at the higher rate.
-
Avoid 1080p with 48 fps for now. Black frames have been reported on that combination. Take one or the other, or check every output.
-
Omit
durationwhen you want the model to pace the prompt. A single action gets a short clip, a sequence gets a longer one, and the result is usually better matched than a number you guessed. -
Count the actions in your prompt before setting a duration. Four actions in three seconds produces hands moving at impossible speed, not an edited-down version.
-
Duration is your biggest cost lever. Per-second billing means 20 seconds is four times 5. Explore short.