Install
openclaw skills install @leooooooow/upload-video-converterConvert videos for compatibility and uploads — pick the right container/codec/bitrate for each destination (marketplaces, social platforms, ad managers, CMS), fix rejected uploads, and shrink files without visible quality loss.
openclaw skills install @leooooooow/upload-video-converterGet any video file accepted by any upload target — the right format, size, and specs on the first try.
| Decision | Strong | Acceptable | Weak (avoid) |
|---|---|---|---|
| Default target | MP4 (H.264) + AAC, yuv420p | MOV (H.264) for Apple-centric flows | WebM/MKV/AVI for platform uploads |
| Size reduction | Re-encode with CRF 20-23 + right resolution | Two-pass to a bitrate target | Chopping resolution to 480p first |
| Resolution | Match destination max (usually 1080p) | Keep source if below max | Upscaling to "meet" a spec |
| Frame rate | Keep source (30/60) | Constant-rate conversion when required | Mixing variable frame rate into edits |
| Audio | AAC 128-192kbps stereo, 44.1/48kHz | Copy if already AAC | PCM/FLAC in upload files |
| Color | SDR BT.709, yuv420p | Tone-mapped HDR→SDR | Uploading raw HDR/10-bit to SDR-only targets |
| Verification | Probe output specs + test upload | Probe output specs | "Looks fine in my player" |
Get codec, container, resolution, frame rate (and whether VFR), bit depth, pixel format, color space, audio codec, duration, size. Everything downstream depends on this. Commands in references/ffmpeg-recipes.md.
Look up the target's requirements (references/platform-upload-specs.md as baseline; the destination's current docs win). Note hard caps: size, duration, resolution, codec whitelist.
Decision order: (1) if source already complies → remux or pass through, don't re-encode; (2) if only the container is wrong → remux (-c copy); (3) otherwise re-encode to MP4/H.264/AAC/yuv420p at the destination's ceiling. Special cases (HDR, VFR, 10-bit, ProRes) in references/troubleshooting-guide.md.
Compute the bitrate budget: (size_cap_MB × 8192) ÷ duration_s − audio_kbps. Prefer CRF mode when there's headroom; switch to two-pass bitrate targeting when the cap is tight. Drop resolution only after bitrate targeting alone would fall below sane quality floors (references/ffmpeg-recipes.md table).
Run the conversion, then probe the output and check against the spec: codec, size, duration, pixel format, audio. Play 10 seconds at start/middle/end for sync and artifacts.
Report what was produced per destination: specs, size, what changed, any quality tradeoffs, and the exact command used (reproducibility). Follow references/output-template.md and check assets/conversion-checklist.md.
Input: 1.8GB MOV, 2560×1440 @ 60fps VFR (screen recording, HEVC 10-bit), 22 min, destination accepts MP4 ≤100MB, ≤1080p.
Output (core section):
Path: full re-encode (HEVC 10-bit + VFR + over-res: three strikes, no remux possible). Budget: 100MB ≈ 819,200 kbit ÷ 1320s ≈ 620 kbps total → 128 kbps audio → ~490 kbps video. That's tight for 1440p60 but fine for screen content at 1080p with a low frame rate. Decisions: downscale to 1920×1080; force CFR 30fps (screen content, no fast motion); H.264 two-pass at 470 kbps;
-tune stillimage-adjacent settings avoided (text clarity: use-preset slow, high profile); audio AAC 128k mono→stereo kept as source. Result: 96.4MB, text legible at 100% zoom, no VFR stutter. Tradeoff noted: fast cursor motion softens slightly at 30fps; acceptable for tutorial content. Command included for re-runs.
Input: 45s product master, ProRes 422, 3840×2160, 25fps, 4.2GB. Destinations: (a) marketplace video slot — MP4 H.264 ≤500MB ≤1080p; (b) Meta ad — MP4 ≤4GB, ≤30s needs trim flag; (c) email — needs <5MB looping clip.
Output (core section):
(a) Marketplace: re-encode → 1920×1080, CRF 20, preset slow, AAC 160k → 58MB. Well under cap; CRF mode used since there's headroom. (b) Meta ad: blocked on duration — 45s master vs 30s placement guidance. Flagged for cut (product-video-cutter), then same encode ladder as (a); do not silently truncate. (c) Email clip: 8s highlight loop, 640×360, no audio, H.264 CRF 28 → 3.1MB MP4. Noted: animated GIF at this size would be ~3× larger and lower quality — recommend MP4 with autoplay-muted, GIF fallback only if the ESP requires it. Verification: all outputs probed (codec/size/duration) and spot-played; spec sheet attached per file.
-c copy preserves 100% quality in seconds.-movflags +faststart for web.references/output-template.md — delivery spec-sheet templatereferences/platform-upload-specs.md — baseline upload requirements by destination typereferences/ffmpeg-recipes.md — probe commands, encode ladders, size-budget mathreferences/troubleshooting-guide.md — rejected uploads, HDR/VFR/sync fixesassets/conversion-checklist.md — pre-delivery checklist