Comparison

HEVC in the browser: four ways, compared

hevc.js vs libde265.js vs ffmpeg.wasm vs h265web.js — honestly.

These four projects solve different problems. This page exists so you pick the right one — including when that's not hevc.js.

hevc.js libde265.js ffmpeg.wasm h265web.js
Built for MSE streaming fallback for dash.js / Shaka Player Raw HEVC decoding (proof of concept) General A/V toolbox — file processing Complete standalone player (live FLV/TS/HLS focus)
WASM size 336 KB
~115 KB gzipped
~2 MB Tens of MB (core) Multiple builds (incl. 256/512 MB memory variants)
License MIT LGPL-3.0 MIT wrapper — FFmpeg core LGPL/GPL per build Custom (CYL_Free-1.0)
COOP/COEP headers Not required Not required Required for the multithreaded build (SharedArrayBuffer) Depends on build
Plugs into dash.js / Shaka Yes — drop-in plugins No No No — it is its own player
Output path Real SourceBuffer fed with H.264 — the player keeps buffer, seek & ABR control Canvas Files / buffers Canvas / WebGL rendering
Native HEVC passthrough Yes — SourceBuffer probe, dormant when native decode exists — — Hardware decode via WebCodecs in its own pipeline
CPU-aware quality control Yes — caps the host player's ABR when transcoding falls behind — — —
1080p decode (WASM, single-threaded) ~145 fps on a SAO stream (Apple M4 Pro, Node 24) Not re-measured with a comparable toolchain Depends on threads/build Not published here — see their benchmarks
Validation All 147 streams of the JCT-VC HEVC v1 conformance suite bit-exact vs the reference MD5 Mature libde265 core, early JS port FFmpeg itself Production usage at large platforms

Sizes, licenses and capabilities as published by each project (August 2026). Corrections welcome — open an issue.

Which one should you use?

Pick hevc.js if…

You already ship dash.js or Shaka Player and need HEVC streams to play on clients without native HEVC decode — Windows browsers with no usable HEVC decoder, Linux fleets. One function call, MIT license, no server changes, dormant when native decode exists.

Pick ffmpeg.wasm if…

You need general media processing in the browser — converting files, extracting frames, transmuxing across dozens of codecs and containers. It's a toolbox, not a playback fallback: no MSE pipeline, and the fast multithreaded build needs COOP/COEP headers.

Pick h265web.js if…

You want a complete, battle-tested standalone player — especially for live surveillance-style workflows (HttpFLV, TS, WebSocket) — and its custom license works for your product. You adopt its player UI and rendering pipeline rather than plugging into your own.

Pick libde265.js if…

You're experimenting with raw HEVC decoding and want the libde265 core in a browser context. It's an early-stage port without a streaming pipeline — for production streaming you'll be building the MSE layer yourself, and the LGPL license may matter for your distribution model.

See hevc.js run

30-second HEVC ABR stream, transcoded to H.264 live in your browser.