Docs/ORB Web Admin/Live Streaming

Live Player Streaming

ORB Web Admin can stream any player's live game view directly into the web panel using WebRTC. The companion resource orb-stream handles the capture and publishing.

ORB Web Admin — watching a player's live game view from the Players page, with the action sidebar
ORB Web Admin — watching a player's live game view from the Players page, with the action sidebar

How It Works

  1. 01An admin with the stream.view permission clicks Stream on a player
  2. 02The server tells orb-stream on that player's client to start publishing
  3. 03orb-stream captures the game view on the GPU via FiveM's CEF external_texture binding
  4. 04The frames are published over a peer-to-peer WebRTC connection to the admin's browser
  5. 05The admin watches the live feed; clicking Stop ends the session

Why It's Zero-Cost

Because the capture reads the already-rendered game framebuffer on the GPU (rather than taking repeated screenshots), the streamed player sees no measurable FPS drop. There is no dependency on screenshot-basic.

Technical Summary

AspectDetail
TransportWebRTC (peer-to-peer)
CodecVP8
CaptureWebGL / CEF external_texture (GPU)
SignalingWebSocket, served by the same Node.js server
EncryptionDTLS-SRTP (standard WebRTC)

Requirements

  • orb-stream must be ensured in your server.cfg
  • Config.Stream.enabled must be true in config.js
  • The viewing admin needs the stream.view permission

ICE Servers (STUN / TURN)

The video travels directly between the player's machine and the admin's browser — it does not pass through your server. The two ends find a path using the ICE servers in Config.Stream.iceServers:

  • STUN (the default) works for most networks.
  • TURN is a relay for restrictive networks. Add one if an admin can't see streams.
js
Config.Stream.iceServers = [
    { urls: 'stun:stun.l.google.com:19302' },
    {
        urls: ['turns:your-turn-host:443?transport=tcp'],
        username: 'turnuser',
        credential: 'turnpassword',
    },
];
There is no single "port" to open for streaming — WebRTC uses dynamic UDP ports. A TURN server (ideally `turns:` over TCP/443) is the reliable fix for restrictive networks.

Troubleshooting

The stream view shows a live status line that pinpoints where a connection stops:

StatusMeaningFix
publisher not startedThe player's client never began publishingMake sure orb-stream is started on the server
ICE failed / no media — NAT/firewallSignaling worked, but the video can't get throughThe admin's network is blocking the P2P path — add a TURN server
could not open signalingThe WebSocket never connectedIf the panel is behind a reverse proxy, forward WebSocket upgrades for /ws/stream
**Quick test:** if a stream fails on one network but works from a phone hotspot, it's a NAT/firewall issue → add a TURN server.