Supported browsers
NovaVMS live view runs in the browser. WebRTC is the default transport; MSE/fMP4 is the fallback for codecs the browser cannot decode over WebRTC. This page lists every browser the team tests.
Sources: frontend/src/lib/browser-caps.ts, frontend/src/lib/live-view-router.ts, docs/ttff-reports/.
Browser compatibility matrix
| Browser | Minimum version | WebRTC H.264 | WebRTC H.265 | MSE/fMP4 fallback | Notes |
|---|---|---|---|---|---|
| Chrome / Chromium | 136 (May 2025) | yes | yes (HW-gated) | yes | HW decoder must be present for getCapabilities to advertise H.265. |
| Edge | 136 | yes | yes (HW-gated) | yes | Same engine as Chrome. |
| Safari (macOS) | 18 | yes | yes | yes | Most robust HEVC WebRTC implementation. |
| Safari (iOS) | 18 | yes | yes | yes | Concurrent decoder count is lower than desktop. |
| Firefox | current release | yes | no | yes | H.265 streams route to MSE automatically. |
| Chrome (Linux) | 136 | yes | no (usually) | yes | Most Linux distros ship without HEVC HW decoder. |
| Chrome (Android) | 136 | yes | device-dependent | yes | ~86% device coverage per Chrome Platform Status. |
Transport selection rule
Source: frontend/src/lib/live-view-router.ts.
| Camera codec | Browser capability | Server capability | Selected transport |
|---|---|---|---|
h264 | any | any | WebRTC |
h265 | advertises H.265 in getCapabilities('video') | advertises h265 in /api/sfu/capabilities | WebRTC |
h265 | does not advertise H.265 | any | MSE/fMP4 |
| unknown | any | any | MSE/fMP4 |
| any | any | any | MSE/fMP4 when MSE_LIVE_VIEW_ENABLED=on |
h265 | any | any | MSE/fMP4 when MSE_LIVE_VIEW_ENABLED=hevc_only |
Audio codec matrix
| Browser | Opus (WebRTC) | AAC (MSE) |
|---|---|---|
| Chrome / Edge | yes | yes |
| Firefox | yes | yes |
| Safari (desktop + iOS) | yes | yes |
The gateway transcodes camera audio to Opus for WebRTC. MSE keeps AAC to save gateway CPU. PCMU / PCMA are not first-class WebRTC audio codecs on the cloud — only Opus is registered in the WHEP MediaEngine (cloud/internal/webrtc/whep/mediaengine.go); Pion’s default registrations cover PCMU/PCMA at the wire level but they are not negotiated in production.
Known issues
| Browser | Issue | Workaround |
|---|---|---|
| Chrome ≤ 136.0.7103 | H.265 interop regression tracked at Pion #3137 | Upgrade Chrome to 136.0.7103.92 or later. |
| Safari 18.0 | Aggressive PLI cadence (every ~2 s on decoder hiccup) | Handled server-side by the 1 Hz PLI rate-limit on keyframe replay. |
| Android Chrome on some Qualcomm SoCs | HW decoder advertises H.265 but decode fails | Force MSE in frontend config per device; no server-side fix. |
Related
- Live view transport — WebRTC-first, MSE-fallback model
- Grid tile limits — per-browser tested tile counts
- Live view does not show video — symptom-level fix