live
MODEL IDprunaai:p-video@upscale

P-Video-Upscale

Pruna AI
by

P-Video-Upscale is Pruna AI's video upscaling model for raising an existing clip to 720p, 1080p, 2K, or 4K while keeping its aspect ratio and audio track. It sharpens what is already in the frame without a prompt, can raise the frame rate to as much as 60 FPS by interpolating new frames, and offers a turbo mode that trades a little quality for speed. It works on live action, anime, game footage, and archival film, for bringing low-resolution generations or older footage up to delivery resolution.

P-Video-Upscale

Upscaling video

How to upscale video with Pruna P-Video-Upscale: the request, the size each preset returns, the frame cap on clip length, the audio track and turbo mode.

Introduction

P-Video-Upscale is Pruna AI's video upscaler. You send it a finished clip and a target preset, and it returns the same clip at a higher resolution with its aspect ratio, frame rate and audio track carried over. The model works only from what is already in the frame, so the request is a clip and a preset.

SourceUpscaled

The cardigan above went in as a compressed 480p export and came back at 1080p. Drag the handle across her back as she turns: the source shows the cables as soft ridges, and the upscale separates every twist with a clean shadow line between them. The fine horizontal ribbing inside the diamond panels, which the compression had blurred into a flat cream, comes back as distinct rows.

This guide covers the request, the size each preset returns, how long a clip each preset accepts, the audio track and turbo mode. Two more guides build on it: raising the frame rate for fps and interpolation, and upscaling generated video for finishing P-Video-2-Pro clips at delivery resolution.

The request

An upscale is one clip in and one clip out. Put the source in inputs.video, name the model, and pick a preset in resolution.

Try in Playground
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@upscale',
  deliveryMethod: 'async',
  resolution: '1080p',
  inputs: {
    video: 'https://vm.runware.ai/video/os/a14d18/ws/2/vi/4b5c6d7e-8f90-4a1b-b2c3-d4e5f6a7b8c9.mp4'
  }
})
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@upscale",
            "deliveryMethod": "async",
            "resolution": "1080p",
            "inputs": {
                "video": "https://vm.runware.ai/video/os/a14d18/ws/2/vi/4b5c6d7e-8f90-4a1b-b2c3-d4e5f6a7b8c9.mp4"
            }
        })


asyncio.run(main())
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "upscale",
      "taskUUID": "7d2e4f61-3a8b-4c5d-9e0f-1a2b3c4d5e6f",
      "model": "prunaai:p-video@upscale",
      "deliveryMethod": "async",
      "resolution": "1080p",
      "inputs": {
        "video": "https://vm.runware.ai/video/os/a14d18/ws/2/vi/4b5c6d7e-8f90-4a1b-b2c3-d4e5f6a7b8c9.mp4"
      }
    }
  ]'
runware run prunaai:p-video@upscale \
  deliveryMethod=async \
  resolution=1080p \
  inputs.video=https://vm.runware.ai/video/os/a14d18/ws/2/vi/4b5c6d7e-8f90-4a1b-b2c3-d4e5f6a7b8c9.mp4
{
  "taskType": "upscale",
  "taskUUID": "7d2e4f61-3a8b-4c5d-9e0f-1a2b3c4d5e6f",
  "model": "prunaai:p-video@upscale",
  "deliveryMethod": "async",
  "resolution": "1080p",
  "inputs": {
    "video": "https://vm.runware.ai/video/os/a14d18/ws/2/vi/4b5c6d7e-8f90-4a1b-b2c3-d4e5f6a7b8c9.mp4"
  }
}
Response
[
  {
    "taskType": "upscale",
    "taskUUID": "7d2e4f61-3a8b-4c5d-9e0f-1a2b3c4d5e6f",
    "videoUUID": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
    "videoURL": "https://vm.runware.ai/video/os/a14d18/ws/2/vi/e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b.mp4"
  }
]
  • inputs.video is the only input. It takes a public URL or the UUID of an earlier Runware task, up to 512 MiB.
  • resolution is the preset: 720p, 1080p, 2k or 4k, with 1080p as the default.
  • fps keeps the source rate when you leave it out. A higher value interpolates new frames, covered in raising the frame rate.
  • settings.turbo runs a faster pass, covered in turbo mode below.
  • settings.safetyFilter set to true checks the clip against the content policy before it is processed.

Sizing the output

Each preset is a pixel budget, not a height. The output keeps the shape of the source and fills that budget, so a vertical or square clip comes back at a different size from a 16:9 one under the same preset.

Preset16:99:161:1
720p1280 × 720720 × 1280960 × 960
1080p1920 × 10801080 × 19201440 × 1440
2k2560 × 14401440 × 25601920 × 1920
4k3840 × 21602160 × 38402880 × 2880

Shapes outside the table land in between: a 4:3 clip at 1080p comes back at 1660 × 1246. The workout clip below is vertical, and 1080p returned it at full vertical HD for a Reels or Shorts upload.

SourceUpscaled

The pegboard behind him is where the 366-pixel-wide source gave up most. In the upscale each hook and handle stands apart, and the resistance bands hang as separate colored cords instead of a striped smear.

A preset only raises the size. A clip that is already larger than the preset comes back at its own size, so a 1080p clip sent with 720p returns at 1920 × 1080.

How long a clip can be

Length is capped by the number of frames the model processes, and each preset has its own cap. The count is the clip's duration times the output frame rate, with no more than 30 frames counted per second.

PresetFrame capAt 24 fpsAt 30 fps
720p2,400100 s80 s
1080p1,20050 s40 s
2k60025 s20 s
4k30012.5 s10 s

A clip over the cap is rejected, not trimmed. To fit one, send a shorter clip or step down a preset. Raising fps counts more frames per second up to 30, so a 24 fps clip that fits at its own rate can stop fitting once you ask for 30 or 60.

The audio track

Whatever sound the source carries is copied into the output as it is, so speech and music stay on the same frames they started on. A silent source comes back silent.

480p source upscaled to 1080p, audio carried over

The listing intro above went in at 480p with the agent's voice on it. Turn the sound on: her line comes through intact and in sync with her mouth, because the model upscales the picture and leaves the soundtrack alone.

Turbo mode

Set settings.turbo to true for a faster pass at the same price. Its documented trade is slightly lower quality. On the sneakers below, upscaled from 480p to 4k, the turbo pass finished in 78 seconds against 121 for the standard one in the run behind this guide.

The 480p source
4k, standard
4k, turbo

At page width the two passes are indistinguishable, so the crops below take the same patch of the toe box from each clip. The double stitching and the perforations come through the same in both passes, and both are a long way from the source.

On footage like this, turbo is the faster way to the same result. The documented trade has not gone away, though, so before you switch a batch over, run a sample of your own footage both ways and compare it at 100%.

What it can recover

The model rebuilds detail from the signal the source still carries, and where that signal is gone it draws something plausible in its place. The backyard clip below shows both. The original is a clean 768p clip. The phone copy is that clip crushed to 360p with heavy compression and noise, the way footage looks after a few rounds through messaging apps. The upscale is the phone copy at 1080p.

The original
The 360p phone copy sent to the model
The phone copy, upscaled to 1080p

The upscale is clean and sharp, and it is not the original. Switch between the three: the man on the left lost his curls, the woman's face and smile changed shape, and the lemon slice on her glass became a plain yellow cup. The compression had reduced those details to blocks, and the model drew new ones that fit the blocks.

So a rough source gives you a sharper clip rather than a recovered one, and faces can come back changed. Check them against the original whenever identity matters, such as a testimonial or a demo with a real presenter.

Check small text as well. A sign or a label too small to read in the source can come back as letters that were never there, since the model sharpens the shapes it finds without knowing what they spell. Watch any clip with on-screen text at full size before you ship it.

Tips

  1. Pick the preset by where the clip plays. 1080p covers feeds and most players. Save 2k and 4k for large screens and for footage that will be cropped or reframed in an edit.

  2. Check the frame cap before you send a long clip. At 4k the cap is 300 frames, 12.5 seconds at 24 fps. A longer clip is rejected, so step down a preset or shorten it.

  3. Leave fps out to keep the timing. The source rate passes through untouched, and raising it counts more frames against the cap. See raising the frame rate.

  4. Upscale the cleanest copy you have. Detail that a re-encode destroyed comes back redrawn, not recovered. Send the original export, not a copy that has been through a messaging app.

  5. Check faces on rough sources. A heavily compressed face is rebuilt from blocks and can come back as a slightly different person.

  6. Try turbo on a sample. It costs the same and finished in about two thirds of the time here. Compare it at 100% on your own footage before you switch a batch over.

  7. Watch on-screen text at 100%. Unreadable signs and labels can come back as invented lettering.

  8. Upscale after the edit. Cut and grade first, then upscale the finished piece, so the sharpened frames are not softened again by a later re-encode.