Video 4K Normalization
Re-encode a clip to one merge-safe 4K master (same delivery specs as
video-to-4k, plus unified BT.709 SDR color):
| Spec | Value |
|---|---|
| Resolution | 3840×2160 |
| Frame rate | 60 FPS |
| Video | H.265 Main10 (libx265, yuv420p10le) |
| Video bitrate | 40 Mbps |
| Audio | AAC 320 kbps |
| Color | BT.709 / bt709 / tv (HDR → tone-mapped SDR) |
| Container | MP4 (.mp4, hvc1 tag) |
Not AI upscaling — use video-to-4k first when
SD/HD needs Real-ESRGAN quality. This skill uses FFmpeg scale + encode only.
Why
Hard-cut video-merge is stream-copy. Mixed
HDR (BT.2020 + PQ) and SDR (BT.709) clips look fine alone, but after
concat the player often applies the first clip's HDR tags to later SDR →
oversaturated cuts. Normalization unifies pixels and color tags first.
Rules
When this skill applies, read and follow skill-dependency-manager — run scripts as documented, install missing tools into .dependency/.
- Run
normalize.pythrough.dependency/python/python. Never use hostpython/ffmpeg. - Never overwrite sources. Outputs go under
video-4k-normalization/. - Use the bundled script — do not hand-write equivalent FFmpeg commands.
- One file per run — pass
--videowith a single file; repeat for each clip in a batch.
Quick Start
.dependency/python/python .ai/video-4k-normalization/normalize.py --video path/to/clip.mp4
Example:
assets/shots/01.mp4 (HDR)
→ assets/shots/video-4k-normalization/01.mp4
assets/shots/10.mp4 (SDR)
→ assets/shots/video-4k-normalization/10.mp4
Then hard-cut merge the video-4k-normalization/ folder:
.dependency/python/python .ai/video-merge/merge.py --folder path/to/clips/video-4k-normalization
Defaults
| Setting | Default | Notes |
|---|---|---|
| Target color | BT.709 SDR limited (tv) |
HDR (PQ/HLG/BT.2020) → hable tone map |
| Scale | FFmpeg lanczos to 3840×2160 | No Video2X |
| FPS | Forced 60 | Frame dup/drop, not RIFE |
Common Flags
--video · -o / --output
.dependency/python/python .ai/video-4k-normalization/normalize.py --video clip.mp4
.dependency/python/python .ai/video-4k-normalization/normalize.py --video clip.mp4 -o out/masters/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 → populate
.dependency/, setpopulated: true, retry. - Tell the user
video-4k-normalization/paths; they runvideo-mergeon that folder when stitching. - For low-res quality upscale →
video-to-4k, then optionally re-normalize if color still mixed. - Pipeline / filter details: reference.md
Tests
From repo root:
.dependency/python/python .ai/video-4k-normalization/test_normalize.py
Manual CLI examples: cli/video-4k-normalization.md