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 236 KB ~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) ~61 fps — 83% of libde265's speed at 1/8th the size Baseline (faster, larger) Depends on threads/build Not published here — see their benchmarks
Validation Pixel-perfect vs ffmpeg on 128 bitstreams 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 — Chrome on Windows without an HEVC-capable GPU, Edge/Firefox without the Microsoft codec extension, 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.