DCP Transcode

FFmpeg + OpenH264/x264/SVT-AV1/x265 on WASM, on DCP

Drop a video. Watch a real DCP worker fleet transcode it, live, into a real 1080p/720p/480p/240p ABR ladder. Real AV1 and HEVC renditions ride alongside H.264, so you can watch each cost more compute per encode and land noticeably smaller. Optional real-decode passes along the way: EBU R128 loudness normalization, multi-audio-track passthrough, and HDR10 color-metadata passthrough. When it's done, download every rendition straight to disk.

Proof-of-concept, not a production pipeline

Concrete constraints of this demo build: single video track only (no multi-angle, no subtitles/captions); containers limited to MP4/MOV, MKV, MPEG-TS, and WAV; video decodable as H.264, HEVC, or AV1, audio as AAC or PCM only; up to 8 audio tracks; HDR10 passthrough only (no Dolby Vision - needs a licensed SDK this project doesn't have); and libopenh264 itself hard-caps at 4096×2304 (DCI 4K, 9,437,184px) - this demo's own renditions top out at 1920×1080 (2,073,600px), well under that, but it would matter at true 4K+ output. Documented scope, not a bug list.

Your DCP account

Compute group(s)

Both persist in this browser's local storage across reloads (clear). Get your own API key from your DCP portal. Not specifying a compute group deploys the job to the Global (public) group.

1. Drop a video

Drag a video file here, or click to choose one.

H.264/AAC MP4 works best (matches this project's tested decode path).

Loudness normalization runs a real decode → avfilter (loudnorm) → re-encode pass on the audio track. A real upload's own multiple audio tracks or HDR10 metadata already pass through automatically, no toggle needed.

ABR ladder renditions to encode:

Higher renditions cost real extra dispatch/compute - uncheck any to skip it for this run. Uncheck all of them and there's nothing for section 5 to play back.

Bake-off comparison renditions to run (section 4):

Each is real extra dispatch/compute cost on top of the ABR ladder - uncheck any to skip it entirely for this run (no job units, no cost). Doesn't affect the ABR ladder or the job itself.

Checked: more, smaller slices, so more workers can grab pieces at once - each chunk re-transmits once per slice instead of once per chunk (480p/240p/h264-240p-quality share one slice to cut some of that; every other rendition gets its own). Unchecked: one slice per chunk, looping every rendition inside the sandbox - less data transmitted, less parallelism.

Unchecked: this tab also transcodes every chunk×rendition itself, sequentially, in its own wasm module - so you can watch the fleet visibly beat single-threaded local encoding.