> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbit.devotel.io/llms.txt
> Use this file to discover all available pages before exploring further.

# WHEP in-browser guest player

> Share a no-SDK playback link for a live broadcast: the /voice/video/player/… route plays any WHEP endpoint in a stock browser, with sub-second latency and no Orbit SDK on either side.

# WHEP in-browser guest player

WHEP (WebRTC-HTTP Egress Protocol) is an open IETF draft that plays a live
media stream over WebRTC — the browser POSTs an SDP offer to an HTTPS endpoint
and the gateway answers in kind. For a broadcast, that means glass-to-glass
latency of roughly one second, versus the multi-second playlist latency of
HLS. Because the negotiation is plain WHEP, no Orbit vendor SDK is involved on
either side: any stock browser (or an external WHEP client such as OBS or VLC)
can reach the same endpoint.

The dashboard route **`/voice/video/player/…`** is a dedicated page that plays
one WHEP URL on its own — the kind of link you can hand to a guest viewer with
no dashboard role, or embed in your own front-end without wiring up the video
SDK.

Use the guest player when a viewer needs to **watch** a live broadcast. Use
the [Orbit video SDK](/guides/video-meetings) when the person must **join** a
room as a participant — with their own camera and microphone publishes, room
controls, and access-token claims. Watching does not need the SDK.

## Build a player link yourself

The route takes one path segment: the WHEP playback URL,
percent-encoded. Construct deep-links with `encodeURIComponent`:

```text theme={null}
/voice/video/player/<encodeURIComponent(whepUrl)>
```

A URL that does not decode to an `http(s)` address renders the page's empty
sheet — a paste-a-URL hint instead of a blank screen or a thrown error — so
an accidentally malformed link still tells the visitor what the shape should
be.

Because the WHEP draft carries the capability in the URL itself, no bearer
header or additional authentication is needed on this path. Treat a WHEP URL as
you would a share link: anyone holding it can watch the live broadcast.

## Where the dashboard produces these links

Open a broadcast's **live viewer page** (for example from **Voice →
Broadcasts**, or the room's live sessions view). Under the player you find:

1. An **HLS / WHEP toggle** — WHEP plays in-browser with the same stock-WebRTC
   negotiation; HLS remains the default for maximum compatibility.
2. The **WHEP URL row**, which copies the raw endpoint and carries a **Play in
   browser** action. That action opens the guest player route above in a new
   tab — the link it opens is exactly the `/voice/video/player/<encoded-url>`
   construction you would hand-build.

Copy the URL from that row to construct share links, or open the player
directly and share the resulting address.

## The playback walk

1. **Join** — open the link; the page immediately negotiates the WHEP
   connection and shows a connecting state.
2. **Live** — when the first video track arrives, playback starts on the
   `<video>` element. Standard browser controls cover mute/unmute and volume
   for the audio leg.
3. **Leave** — closing the tab or navigating away closes the peer connection
   against the SFU; nothing on the guest page lingers.

The page watches-one-way: it is a viewer surface, so it does not publish
video or audio, and it does not report a "watching now" heartbeat the way the
authenticated broadcast viewers page does — the route is keyed by a raw WHEP
URL, not a room.

## Troubleshooting

* **Connection stalls in *connecting*** — the ICE handshake timed out before a
  track arrived. Check the recipient's network egress: WHEP needs UDP (or a
  TURN path) to reach the media server, so corporate proxies that force all
  traffic through TCP-only paths block it. Have the viewer retry from an
  unconstrained network.
* **Connection failed with a retry button** — the WHEP endpoint answered
  non-200 or returned an unparsable SDP answer. The broadcast may have ended,
  or the URL is stale. WHEP endpoints are minted per live broadcast; re-copy
  the row from the live viewer page.
* **Negotiated but waiting-for-track** — the handshake succeeded but no media
  is flowing yet (the broadcast publisher has not started, or is muted at the
  source). This is an explicit state, not a frozen frame; playback starts as
  soon as a track arrives.
* **Unsupported browser** — WHEP depends on `RTCPeerConnection` with send/
  receive SDP negotiation. Every current Chrome, Edge, Firefox, and Safari
  build supports it; very old or heavily locked-down browser builds that
  disable WebRTC cannot play and will hit the retry state.

## Adjacent guides

* [Video room history](/guides/video-room-history) — where ended sessions,
  recordings, and transcripts surface after the broadcast closes.
* [Video room recording to your own bucket](/guides/video-recording-byo-storage)
  — routing recordings to tenant-owned or region-pinned storage.
* [Video broadcasts](/guides/voice-broadcasts) — starting the broadcast whose
  WHEP endpoint this page plays.
