Dawn Stream browser and input
The reference player and TypeScript SDK live under Gems/DawnStream/Frontend. Prefer current Chrome / Edge / Firefox (WebRTC, DataChannel, Pointer Lock).
Reference player
cd Gems/DawnStream/Frontend
npm install && npm run build
# Serve the build, then open player.html with query params
Example:
http://localhost:8080/player.html?signaling=ws://127.0.0.1:8090&token=<viewer-token>&autoConnect
Keys are case-insensitive. Boolean flags accept a bare name (?forceTurn == ?forceTurn=true); values false / 0 / off / no are false.
Common URL parameters
| Param | Purpose |
|---|---|
signaling | Signaling WebSocket URL |
token | Viewer auth token |
streamer | Target streamer id (default matches engine StreamerId) |
autoConnect | Connect on load (hideUI also auto-connects) |
hideUI | Minimal chrome |
forceTurn | Prefer TURN for ICE |
preferredCodec | Codec preference hint (e.g. h264) |
waitForStreamer | Retry join until streamer is up |
streamerAutoJoinIntervalMs | Join retry interval |
mouseInput / keyboardInput / touchInput / gamepadInput | Toggle device classes |
keyFilterMode / keyAllowlist / keyBlocklist | Client-side key filter |
controlScheme | Set locked for pointer-lock style control |
startVideoMuted / autoPlay | Media autoplay policy helpers |
statsPanel / settingsPanel / fullScreenControls / videoQpIndicator | UI element modes |
graphs | Stats graphs (default on with builtin stats panel) |
upstreamVideo / upstreamAudio | Experimental uplink (needs matching engine flags) |
webxr / onScreenController / recordingControls | Optional UI / experimental features |
For embedding into your own page, build the Frontend package and use the SDK entry under Frontend/src/sdk/ (signaling connection, input controller, stats). Start from player.html / player.ts as the reference wiring.
Input Owner
- With the MVP default
MaxViewers=1, the authenticated viewer becomes Input Owner automatically. - Only the owner’s input is injected into AzFramework via
RemoteInputDevice. - Blur or disconnect triggers
ReleaseAllso keys/buttons do not stick. - Host can change owner at runtime: console
ps_setInputOwner <viewerId|->(-revokes). Arbitration policies (Input.ControlArbitration) matter whenMaxViewers > 1—see Configuration.
Engine-side input settings
| Concern | Keys |
|---|---|
| Keep local devices active while streaming | Input.AllowLocalInput (default true) |
| Release remote presses on focus loss | Input.ReleaseOnFocusLost (default true) |
| Filter keys | KeyFilterMode = Off / allow / block + lists |
| Gamepad / text / XR notifications | GamepadInput, TextInput, XrInput |
Client URL filters and engine KeyFilter can both apply—keep allow/block lists consistent when debugging “video but no keys”.
Optional entity component
Everyday streaming needs no level components. Optional:
- DawnStream Video (
DawnStreamVideoComponent) — display an upstream camera track. RequiresExperimental.UpstreamVideoand a viewer that enablesupstreamVideo.
Next steps
- Configuration — full Input / Experimental tables.
- Diagnostics — input rejected / stuck keys.
- Deployment — HTTPS player hosting.