Video to 4K
Convert a supported video to a unified 4K master:
| Spec | Value |
|---|---|
| Resolution | 3840×2160 |
| Frame rate | Source fps kept (no fps= filter, no RIFE) |
| Video | H.265 Main10 (libx265, yuv420p10le) |
| Video bitrate | 40 Mbps |
| Audio | AAC 320 kbps |
| Container | MP4 (.mp4, hvc1 tag) |
Pipeline
- Probe with ffprobe (width, height, fps, audio).
- Already 4K? (
width ≥ 3840andheight ≥ 2160) → skip Video2X. - Below 4K → Video2X Real-ESRGAN upscale (scale 2 or 4) to intermediate under
video-to-4k/upscaled/. - Always FFmpeg final encode →
video-to-4k/at the unified specs above.
Rules
When this skill applies, read and follow skill-dependency-manager — run scripts as documented, install missing tools into .dependency/.
- Run
convert.pythrough.dependency/python/python. Never use hostpython/ffmpeg/video2x. - Never overwrite sources. Outputs go under
video-to-4k/(final) andvideo-to-4k/upscaled/(Video2X intermediate). - Use the bundled script — do not hand-write equivalent
video2x/ffmpegcommands. - One file per run — pass
--videowith a single file; repeat for each clip in a batch.
Setup (first run)
FFmpeg + Python
Populate ffmpeg and python under .dependency/ per skill-dependency-manager.
Video2X (CLI)
Download the CLI release (not the Qt6 installer) from video2x releases and extract to .dependency/video2x/:
| Platform | Release asset |
|---|---|
| Windows | video2x-windows-amd64.zip → video2x.exe |
| Linux | Video2X-x86_64.AppImage (or distro package) → register as bin |
Register in .dependency/manifest.json:
"video2x": {
"populated": true,
"bin": ".dependency/video2x/video2x.exe"
}
Use video2x (no .exe) or the AppImage path on Unix. Requires a Vulkan GPU and AVX2 CPU. Docs: Command Line.
Quick Start
.dependency/python/python .ai/video-to-4k/convert.py --video path/to/clip.mp4
Example:
assets/video/clip.mp4
→ assets/video/video-to-4k/upscaled/clip.mkv (Video2X, only if below 4K)
→ assets/video/video-to-4k/clip.mp4 (final master)
Already-4K source → only video-to-4k/clip.mp4 (FFmpeg only).
Anime / cartoon content (Real-ESRGAN anime model):
.dependency/python/python .ai/video-to-4k/convert.py --video clip.mp4 --anime
Defaults
| Setting | Default | Notes |
|---|---|---|
| Upscaler | Real-ESRGAN realesrgan-plus |
General / live-action |
--anime |
realesr-animevideov3 |
Anime / illustration |
| Scale | Auto 2 or 4 | Smallest factor that meets or exceeds 4K |
| Intermediate | High-bitrate HEVC MKV in video-to-4k/upscaled/ |
Kept for re-encode; delete manually or --clean-upscaled |
| Final | Always re-encode | Even if source already matches specs |
Common Flags
--video · -o / --output · --anime · --gpu · --clean-upscaled
.dependency/python/python .ai/video-to-4k/convert.py --video clip.mp4
.dependency/python/python .ai/video-to-4k/convert.py --video clip.mp4 --gpu 0 --clean-upscaled
.dependency/python/python .ai/video-to-4k/convert.py --video clip.mp4 -o out/clip.mp4
Never overwrite source files. Input must be a single video file (--video), not a directory. Supported inputs: .mp4, .mkv, .mov, .avi, .webm, .wmv, .flv, .m4v, .mpeg, .mpg, .ts, .mts, .m2ts, .3gp, .ogv.
Agent Notes
- Use the bundled script only.
- Missing Python / FFmpeg / Video2X → populate
.dependency/, setpopulated: true, retry the same command. - Tell the user where
video-to-4k/(andvideo-to-4k/upscaled/if used) outputs are; they swap assets manually. - Default model is general (
realesrgan-plus). Pass--animefor anime/cartoon. - Do not force fps. Keep the source frame rate. Need 60fps interpolation → video-to-60fps first (RIFE at source resolution).
- Pipeline / FFmpeg / Video2X details: reference.md
Tests
From repo root:
.dependency/python/python .ai/video-to-4k/test_convert.py
Manual CLI examples: cli/video-to-4k.md