8080->48080, 8889->48889, 8888->48888, 9997->49997, 8189->48189 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
5.4 KiB
OBS setup
Configures OBS Studio on the Windows gaming PC to capture the game, encode with NVENC, and publish via WHIP to the local MediaMTX instance that the OBS script spawns.
Prerequisites:
- OBS Studio 30.0 or newer (WHIP output is built in from 30.x onward).
- You already ran
.\scripts\install.ps1in an elevated PowerShell, sobin\mediamtx.exeexists and theGameStream-UDP-48189firewall rule is registered (in the disabled state).
1. Load the OBS script
-
OBS -> Tools -> Scripts -> +
-
Select
obs-script/game_stream.pyfrom this repo. -
In the properties panel on the right, set:
Setting Value MediaMTX binary <repo>\bin\mediamtx.exeMediaMTX config <repo>\config\mediamtx.ymlFrontend directory <repo>\frontendFrontend HTTP port 48080(default)Firewall rule name GameStream-UDP-48189(must match the rule created by install.ps1)Public URL https://stream.hetherman.cloudMediaMTX API URL http://127.0.0.1:49997 -
Check the Script Log at the bottom - you should see
[game_stream] game_stream.py loaded.
2. OBS output settings
Settings -> Output, set Output Mode to Advanced.
Streaming tab
| Setting | Value |
|---|---|
| Audio Encoder | Opus (or FFmpeg AAC if Opus is unavailable - Opus is preferred for WebRTC) |
| Video Encoder | NVIDIA NVENC HEVC or NVIDIA NVENC H.264 |
Use H.264 for maximum browser compatibility (all browsers). HEVC works in Safari and recent Chrome but not Firefox - stick with H.264 unless you have a specific reason.
Encoder settings (H.264):
| Setting | Value |
|---|---|
| Rate Control | CBR |
| Bitrate | 8000 Kbps |
| Keyframe Interval | 2 s |
| Preset | P5 (Quality) |
| Tuning | Ultra Low Latency |
| Multipass | Two Passes (Quarter Resolution) |
| Profile | high |
| Look-ahead | off |
| Psycho Visual Tuning | on |
| GPU | 0 |
| Max B-frames | 0 (required for low-latency WebRTC) |
With a 600 Mbps upload and up to 6 viewers at 8 Mbps each, 8000 Kbps leaves generous headroom. Push to 12000-15000 Kbps if you want higher quality.
Audio tab
| Setting | Value |
|---|---|
| Audio Bitrate | 128 Kbps |
| Sample Rate | 48 kHz |
3. OBS stream settings
Settings -> Stream
| Setting | Value |
|---|---|
| Service | Custom |
| Protocol | WHIP |
| Server | http://localhost:48889/game/whip |
| Bearer Token | (leave blank) |
Save.
4. First stream
- Click Start Streaming.
- Check the OBS Script Log - you should see:
Firewall rule 'GameStream-UDP-48189' ENABLEDMediaMTX started (pid=...)Frontend HTTP server listening on 0.0.0.0:48080Viewers can watch at: https://stream.hetherman.cloud
- Open
https://stream.hetherman.cloudfrom another device, log in with Authentik, and verify video plays.
5. Stopping
Click Stop Streaming in OBS. The script will:
- Stop the MediaMTX subprocess
- Stop the frontend HTTP server
- Disable the firewall rule (
GameStream-UDP-48189-> disabled)
Verify the firewall state from PowerShell:
Get-NetFirewallRule -DisplayName "GameStream-UDP-48189" | Select-Object Enabled
Should report False while not streaming, True while streaming.
Troubleshooting
- "MediaMTX binary not found" in the script log: the path in the script properties panel is wrong. Re-select it with the file picker.
- OBS cannot connect to WHIP: MediaMTX did not start. Check the script log for the actual reason; most commonly a port conflict on 48889 or 48189 (another process is already using them).
- Viewers see "Stream offline" even after you click Start Streaming:
- Check that the MediaMTX API returns
ready: true:curl http://localhost:49997/v3/paths/get/game - Check OBS's own streaming indicator - if it's red, OBS is not actually sending to WHIP. Verify the URL and that the custom service / WHIP protocol is selected.
- Check that the MediaMTX API returns
- Viewers connect but playback freezes after a few seconds: the UDP port
path is broken. Verify the firewall rule is enabled (
Get-NetFirewallRule), the router port-forward to NPM for UDP 48189 is correct, and the NPM Stream entry points at<PC-LAN-IP>:48189. - Autoplay is blocked / no audio: browsers start the video muted so autoplay works. There is a "Click to unmute" button in the status bar.