Cameras
go2rtc: low-latency camera live view
Fix laggy in-browser camera viewing — why RTSP/HLS is seconds behind, and how go2rtc's MSE and WebRTC give near-real-time live view (ports 1984/8554/8555).
Problem summary
Watching a camera in a browser feels seconds behind because the page is using HLS or a transcoded RTSP path. go2rtc fixes this with MSE (low latency) and WebRTC (sub-second), restreaming the camera once. The gotchas are codec compatibility (WebRTC wants H.264/PCMU audio), and WebRTC needing a reachable host:port (8555) for its candidates.
Identify the transport the browser is actually using.
http://<host>:1984
You know whether live view is HLS, MSE, or WebRTC.
Don't expose 8555 to the public internet — reach it over the tunnel.
Layer path
Step-by-step runbook
Start here. Do each check in order, compare it to the expected result, and stop when the evidence explains the failure or the safe stop point applies.
Restream the camera through go2rtc
Check: Define the camera once in go2rtc and confirm it plays in the 1984 UI.
Expected result: go2rtc shows the stream connected with a known codec.
If not: If go2rtc can't pull it, fix the source/URL/codec first.
Use a browser-friendly codec for live view
Check: Serve an H.264 stream for the live view (substream is fine), or let go2rtc transcode.
Expected result: MSE/WebRTC play in all your browsers.
If not: H.265-only can fail MSE in some browsers.
Embed the MSE/WebRTC player
Check: Point your dashboard/app at go2rtc's MSE or WebRTC stream instead of an HLS embed.
Expected result: Live view is near-real-time.
If not: MSE is the compatible default; WebRTC is lowest latency.
Make WebRTC reachable if you want sub-second
Check: Ensure 8555 (TCP+UDP) is reachable from the client, on LAN and over the VPN.
Expected result: WebRTC establishes and live view is sub-second.
If not: If you can't make 8555 reachable, use MSE — don't expose 8555 publicly.
Match standalone vs embedded ports
Check: Use standalone go2rtc ports (1984/8554/8555) or, in Frigate, its fronted MSE plus 8555 for WebRTC.
Expected result: The player connects on the correct port for your deployment.
If not: Mismatched ports are a common 'works in UI, not in app' cause.
Decision tree
If: Live view is seconds behind.
Then: Player is using HLS/transcoded RTSP.
Action: Switch to go2rtc MSE (or WebRTC) for the live view.
If: MSE works on LAN but fails in some browsers.
Then: H.265-only stream MSE can't decode.
Action: Provide an H.264 stream for live view (substream) or transcode.
If: WebRTC won't connect (esp. remotely).
Then: 8555 / candidate not reachable from the client.
Action: Make 8555 reachable over the VPN, or fall back to MSE.
Safe stop: Don't expose 8555 to the public internet — reach it over the tunnel.
If: go2rtc itself can't play the stream.
Then: Source/codec/URL problem upstream.
Action: Fix the source in go2rtc (URL, codec, transport) before blaming the player.
Evidence table
| Symptom | Evidence to collect | Likely layer | Next action |
|---|---|---|---|
| Multi-second live-view lag. | Whether the player is HLS vs MSE/WebRTC. | Transport / protocol | Use go2rtc MSE/WebRTC. |
| Live view blank in one browser. | Stream codec (H.265 vs H.264) for MSE. | Codec compatibility | Serve H.264 for live view or transcode. |
| WebRTC fails, MSE works. | Reachability of 8555 / advertised candidate. | WebRTC port / candidate | Route 8555 to the client (over VPN); else use MSE. |
| Nothing plays even in go2rtc UI. | go2rtc source connection/codec. | Upstream source | Fix the RTSP source/codec first. |
Commands and settings paths
Open the go2rtc web UI
http://<host>:1984
Where: In a browser on the LAN.
Expected: The stream lists and plays via MSE/WebRTC with low latency.
Failure means: If it won't play here, it's the source/codec, not the embedding page.
Safe next step: Resolve the source in go2rtc; then embed the low-latency player.
Test the WebRTC port
nc -vz <host> 8555 (TCP) and verify UDP 8555 routing
Where: From the viewing client (LAN or across the VPN).
Expected: 8555 is reachable from the client.
Failure means: If blocked, WebRTC can't establish and live view fails or falls back.
Safe next step: Route 8555 over the tunnel to the client, or use MSE.
Compare MSE vs WebRTC latency
go2rtc UI player: switch stream mode (mse / webrtc) and watch a clock in-frame
Where: On the live camera in the go2rtc UI.
Expected: WebRTC shows sub-second, MSE ~half a second; both far below HLS.
Failure means: If only HLS is low-latency-free, you're not on the go2rtc player.
Safe next step: Use the go2rtc MSE/WebRTC player for live monitoring.
Hardware and platform boundary
Change only when
- Adopt go2rtc for live view as soon as in-browser lag bothers you or you embed cameras in a dashboard — it's the standard low-latency path.
Evidence that matters
- An H.264 substream for live view, go2rtc restreaming, and a reachable WebRTC port (8555) if you want sub-second remotely.
Evidence that does not matter
- Chasing HLS tuning for 'real-time' — HLS buffers in segments; it's the wrong tool for live monitoring.
Avoid
- Exposing go2rtc's WebRTC port to the public internet (reach it over the VPN) or serving only H.265 to browsers that can't decode it via MSE.
Related tool/calculator
Use the linked calculator or tool to turn this runbook into numbers for your exact setup.
Camera bandwidth calculatorRelated problems
Last reviewed
2026-06-03 · Reviewed by HomeTechOps. Built from June-2026 research verified against the go2rtc README and WebRTC notes (default ports 1984/8554/8555, MSE vs WebRTC latency) and Frigate's embedded-go2rtc behavior; leads with HLS-is-why-it-lags, the MSE-vs-WebRTC tradeoff, the H.264 codec requirement, and the reachable-8555 WebRTC gotcha, cross-linking the remote-access page for the over-VPN case.
Sources/assumptions
- Assumes go2rtc (standalone or embedded in Frigate) restreaming an RTSP camera for browser live view.
- go2rtc defaults: web UI/API on 1984, RTSP on 8554, WebRTC on 8555 (TCP+UDP); inside Frigate, MSE is fronted by Frigate's own port.
- Latency depends on codec and transport — WebRTC needs reachable candidates, so remote WebRTC may need the host:port exposed over your VPN.
Source-backed checks
HomeTechOps turns official docs and conservative safety rules into a shorter runbook. These links are the source trail for the page direction.