---
title: Restoring and upscaling video — BytePlus Video Enhancement Pro | Runware Docs
url: https://runware.ai/docs/models/bytedance-video-enhancement-pro/guides/upscaling-and-enhancing-video
description: How to clean up and upscale soft, compressed, AI-generated, or archival footage to 4K with BytePlus Video Enhancement Pro, and when to reach for it.
---
### [Introduction](https://runware.ai/docs/models/bytedance-video-enhancement-pro/guides/upscaling-and-enhancing-video#introduction)

BytePlus Video Enhancement Pro rebuilds a clip shot by shot rather than just resizing it. In one pass it runs a thirty-plus operator restoration that **denoises, deblocks, deblurs, sharpens, corrects color, and upscales to 4K**, reconstructing fine detail a lighter pass averages away.

Reach for it when a clip has to look sharp but the source doesn't: soft AI-generated output, a compressed social or interview clip, aging archival footage, or a product shot that needs to read crisp at 4K.

[Watch video](https://runware.ai/docs/assets/bad-macro.CYO9Wbwo.mp4)

[Watch video](https://runware.ai/docs/assets/enhanced-macro.CW2ae4ic.mp4)

SourceEnhanced

The sections below walk through the jobs it does, then the settings that control the output.

> [!NOTE]
> Pro reconstructs detail by **synthesizing** it, so it makes footage look sharp and clean rather than producing a forensically faithful copy. On very low-quality input it will confidently invent texture that reads right but may not match the original.

### [The request](https://runware.ai/docs/models/bytedance-video-enhancement-pro/guides/upscaling-and-enhancing-video#the-request)

Each call takes one video and a few optional controls. Like every video task, delivery is **always async**: the immediate response acknowledges the task, and the finished clip arrives by polling or a webhook.

TypeScriptPythoncURLCLIJSON

```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: 'bytedance:video-enhancement@pro',
  deliveryMethod: 'async',
  inputs: {
    video: 'https://example.com/source.mp4'
  },
  resolution: '1080p'
})
```

```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": "bytedance:video-enhancement@pro",
            "deliveryMethod": "async",
            "inputs": {
                "video": "https://example.com/source.mp4"
            },
            "resolution": "1080p"
        })

asyncio.run(main())
```

```bash
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "upscale",
      "taskUUID": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "model": "bytedance:video-enhancement@pro",
      "deliveryMethod": "async",
      "inputs": {
        "video": "https://example.com/source.mp4"
      },
      "resolution": "1080p"
    }
  ]'
```

```bash
runware run bytedance:video-enhancement@pro \
  deliveryMethod=async \
  inputs.video=https://example.com/source.mp4 \
  resolution=1080p
```

```json
{
  "taskType": "upscale",
  "taskUUID": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "model": "bytedance:video-enhancement@pro",
  "deliveryMethod": "async",
  "inputs": {
    "video": "https://example.com/source.mp4"
  },
  "resolution": "1080p"
}
```

Response

```json
[
  {
    "taskType": "upscale",
    "taskUUID": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "videoUUID": "f1e2d3c4-b5a6-7890-1234-567890abcdef",
    "videoURL": "https://vm.runware.ai/video/os/a14d18/ws/2/vi/f1e2d3c4-b5a6-7890-1234-567890abcdef.mp4"
  }
]
```

- `inputs.video` takes a URL or a UUID from a previous task. The source can be **up to 2K and 10 GB**, you feed it a lower-quality clip to lift, not a finished master.
- `resolution` sets the output size, from `240p` to `4k`.
- `fps` raises the frame rate.
- `settings.resolutionLimit` and `settings.bitrate` tune output size and file weight.

### [Finishing AI-generated video](https://runware.ai/docs/models/bytedance-video-enhancement-pro/guides/upscaling-and-enhancing-video#finishing-ai-generated-video)

AI video models often output soft, sub-1080 clips with limited fine detail and some frame-to-frame flicker. Pro rebuilds that soft detail and steadies motion as it upscales, turning a rough generation into a clean deliverable.

[Watch video](https://runware.ai/docs/assets/bad-ai.C4ddf2Wq.mp4)

[Watch video](https://runware.ai/docs/assets/enhanced-ai.DhDIleHP.mp4)

AI sourceEnhanced

It slots in as a **second pass on a generation pipeline**: render at the model's native size, then lift here instead of asking the generator for a resolution it handles poorly. AI clips carry limited real detail, so a 2× lift usually reads cleaner than forcing 4K, and watch the faces, where Pro's sharpening can tip into over-processed.

### [Remastering old and archival footage](https://runware.ai/docs/models/bytedance-video-enhancement-pro/guides/upscaling-and-enhancing-video#remastering-old-and-archival-footage)

Aging footage carries heavy grain, softness, and faded color. Pro's shot-level restoration denoises and rebuilds facial and fabric detail while keeping the **period character** of the clip, so an old scan or export comes back watchable without looking artificially modern.

[Watch video](https://runware.ai/docs/assets/bad-archival.BNxRD29p.mp4)

[Watch video](https://runware.ai/docs/assets/enhanced-archival.DAqSCFTj.mp4)

SourceEnhanced

Feed it the raw degraded scan rather than a pre-cleaned copy, denoising it yourself first strips the signal Pro works from. It holds the period look and will not fully lift faded color, so run a separate color grade if you want it richer.

### [Sharpening faces and talking-head footage](https://runware.ai/docs/models/bytedance-video-enhancement-pro/guides/upscaling-and-enhancing-video#sharpening-faces-and-talking-head-footage)

Interviews, webcam recordings, and creator clips lose the most exactly where it matters, the face. Pro recovers **skin texture and edge detail** on compressed talking-head footage, so a soft or low-bitrate recording reads sharp.

[Watch video](https://runware.ai/docs/assets/bad-face.xlsnrKMD.mp4)

[Watch video](https://runware.ai/docs/assets/enhanced-face.30VSt5A4.mp4)

SourceEnhanced

Target 1080p rather than 4K on close-up faces. Pushing skin that far lets the synthesis turn plasticky, so check the face at full size before you commit the higher target.

### [Choosing the output resolution](https://runware.ai/docs/models/bytedance-video-enhancement-pro/guides/upscaling-and-enhancing-video#choosing-the-output-resolution)

`resolution` sets the output, anywhere from `240p` to `4k`. Pro reconstructs detail as it scales, so a soft 480p clip comes back as genuine 1080p rather than a blurry stretch.

When clips arrive at different sizes, `settings.resolutionLimit` is easier than a fixed target. It **caps the short side in pixels** and scales proportionally, so a mixed batch all lands under one ceiling. The two are **mutually exclusive**, set `resolution` or `resolutionLimit`, never both.

> [!NOTE]
> Input is capped at 2K. Pro lifts quality from a lower-resolution source, so a clip that is already at its target size, a finished 4K master, will not be accepted.

### [Smoothing motion](https://runware.ai/docs/models/bytedance-video-enhancement-pro/guides/upscaling-and-enhancing-video#smoothing-motion)

`fps` interpolates new frames for smoother motion, up to 120. The trail clip below runs at 15 fps, choppy on fast movement; resampled to 60 it reads fluid.

[Watch video](https://runware.ai/docs/assets/bad-fps.5aZRu83U.mp4)

[Watch video](https://runware.ai/docs/assets/enhanced-fps.C2kLUbf-.mp4)

15 fps60 fps

Keep the target to about **four times the source rate**. Past that, the model invents more motion than it measures and artifacts creep in.

> [!NOTE]
> Setting `fps` makes the model recompute the output bitrate from the target frame rate and resolution, so a `settings.bitrate` you pass alongside it is ignored.

### [Tips](https://runware.ai/docs/models/bytedance-video-enhancement-pro/guides/upscaling-and-enhancing-video#tips)

1. **Feed it recoverable input.** Pro lifts soft and moderately compressed footage well, but it cannot rebuild detail that was already destroyed. Enhance before quality is crushed, not after.
    
2. **Cap the short side for mixed batches.** Use `settings.resolutionLimit` instead of a fixed `resolution` when clips arrive at different sizes, and you avoid choosing a preset per file.
    
3. **Don't over-upscale.** The source tops out at 2K, and pushing a tiny clip to 4K spends runtime without adding detail the model can recover. Match the target to what the source can support.
    
4. **Raise frame rate within reason.** Stay near four times the source rate, and remember that setting `fps` overrides `settings.bitrate`.
    
5. **Drop the bitrate after cleanup.** Enhanced footage compresses better than a noisy source, so `settings.bitrate` set to `medium` on a cleaned clip often matches `high` on the original at a smaller file.
    
6. **Reserve Pro for where quality is the point.** It runs a slow, thirty-plus operator pass, so lean on a lighter enhancement tier for high-volume or latency-sensitive work.