Skip to content

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

BrowserMinimum versionWebRTC H.264WebRTC H.265MSE/fMP4 fallbackNotes
Chrome / Chromium136 (May 2025)yesyes (HW-gated)yesHW decoder must be present for getCapabilities to advertise H.265.
Edge136yesyes (HW-gated)yesSame engine as Chrome.
Safari (macOS)18yesyesyesMost robust HEVC WebRTC implementation.
Safari (iOS)18yesyesyesConcurrent decoder count is lower than desktop.
Firefoxcurrent releaseyesnoyesH.265 streams route to MSE automatically.
Chrome (Linux)136yesno (usually)yesMost Linux distros ship without HEVC HW decoder.
Chrome (Android)136yesdevice-dependentyes~86% device coverage per Chrome Platform Status.

Transport selection rule

Source: frontend/src/lib/live-view-router.ts.

Camera codecBrowser capabilityServer capabilitySelected transport
h264anyanyWebRTC
h265advertises H.265 in getCapabilities('video')advertises h265 in /api/sfu/capabilitiesWebRTC
h265does not advertise H.265anyMSE/fMP4
unknownanyanyMSE/fMP4
anyanyanyMSE/fMP4 when MSE_LIVE_VIEW_ENABLED=on
h265anyanyMSE/fMP4 when MSE_LIVE_VIEW_ENABLED=hevc_only

Audio codec matrix

BrowserOpus (WebRTC)AAC (MSE)
Chrome / Edgeyesyes
Firefoxyesyes
Safari (desktop + iOS)yesyes

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

BrowserIssueWorkaround
Chrome ≤ 136.0.7103H.265 interop regression tracked at Pion #3137Upgrade Chrome to 136.0.7103.92 or later.
Safari 18.0Aggressive 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 SoCsHW decoder advertises H.265 but decode failsForce MSE in frontend config per device; no server-side fix.