Browser-Overlay mit Live-SB-Daten¶
Eigenes HTML-Overlay als OBS-Browser-Source das Live-Daten aus Streamer.bot empfängt (Sub-Counter, Heart-Rate, Recent-Events).
Voraussetzung: WebSocket-Server aktiv (siehe setup.md) Patterns: JavaScript-Browser-Code + WS-Verbindung zu SB
Konzept¶
- Eigenes HTML-File mit WebSocket-Client-JS
- OBS lädt das File als Browser-Source
- Browser-Source verbindet sich mit SB via WS
- SB pusht bei jedem Event/State-Change an verbundene Browser
- JS empfängt + updated DOM live
Minimal-HTML-Overlay¶
C:\sb-overlays\sub-counter.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
body { font-family: sans-serif; background: transparent; color: white; }
.counter { font-size: 5em; text-shadow: 2px 2px 4px #000; }
</style>
</head>
<body>
<div class="counter">💎 <span id="count">0</span> Subs</div>
<script>
const ws = new WebSocket('ws://localhost:8080/');
ws.onopen = () => console.log('connected to SB');
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === 'subCount') {
document.getElementById('count').textContent = data.value;
}
};
ws.onclose = () => setTimeout(() => location.reload(), 2000);
</script>
</body>
</html>
OBS einbinden¶
- In OBS: + Source → Browser
- Local file: ✅
- File:
C:\sb-overlays\sub-counter.html - Width/Height: passend
- Refresh browser when scene becomes active: ✅
SB sendet Update bei Sub¶
In [Event] Sub Hype (Doku) eine Sub-Action ergänzen:
Sub-Action: Broadcast to Custom Server¶
Pfad: Streamer.bot → WebSocket → Broadcast (oder ähnlich je nach SB-Version)
| Feld | Wert |
|---|---|
| Custom Server | (deiner) |
| Data | {"type":"subCount","value":%subscriberCount%} |
Vorher Sub-Count abrufen:
[Event] Sub Hype
├── ... (existing logic) ...
├── X. Get Subscriber Count
└── Y. Broadcast: {"type":"subCount","value":%subscriberCount%}
Bei jeder neuen Sub aktualisiert das Overlay live.
Use-Case A: Heart-Rate-Live-Overlay¶
Statt OBS-Set-GDI-Text (siehe HR-Display) ein schöner HTML-Overlay mit Animation:
<div class="hr-display">
<span class="emoji">❤</span>
<span class="bpm" id="bpm">--</span> BPM
</div>
<script>
const ws = new WebSocket('ws://localhost:8080/');
ws.onmessage = (e) => {
const d = JSON.parse(e.data);
if (d.type === 'hr') {
document.getElementById('bpm').textContent = d.value;
document.querySelector('.emoji').classList.add('beat');
setTimeout(() => document.querySelector('.emoji').classList.remove('beat'), 200);
}
};
</script>
<style>
.emoji.beat { transform: scale(1.3); transition: transform 100ms; }
</style>
SB sendet bei jedem HR-Pulse:
[Event] HR Pulse → Browser
Trigger: Heart Rate Pulse
└── Broadcast: {"type":"hr","value":%heartRate%}
Browser updated mit Pulse-Animation.
Use-Case B: Live-Chat-Reaction-Overlay¶
Bei jedem !cheer-Command animation im Overlay:
HTML:
<div id="reactions"></div>
<script>
const ws = new WebSocket('ws://localhost:8080/');
ws.onmessage = (e) => {
const d = JSON.parse(e.data);
if (d.type === 'cheer') {
const el = document.createElement('div');
el.textContent = '🎉 ' + d.user;
el.style.animation = 'fadeUp 2s';
document.getElementById('reactions').appendChild(el);
setTimeout(() => el.remove(), 2000);
}
};
</script>
<style>
@keyframes fadeUp {
0% { opacity: 0; transform: translateY(20px); }
100% { opacity: 1; transform: translateY(-20px); }
}
</style>
SB:
Use-Case C: Top-Donator-Leaderboard¶
Persistent Top-3 anzeigen via Globals + WS:
[Cmd] !donate (oder via Cheer-Event)
├── 1. (Globals updaten)
├── 2. Get Top 3 (würde C# brauchen — pragmatisch via Globals direkt:)
└── 3. Broadcast: {"type":"leaderboard","top":[{"name":"%top1%","val":"%top1val%"},...]}
Browser baut sich die Leaderboard-Liste dynamisch.
Tipps für Browser-Overlays¶
- Transparenz:
body { background: transparent; }plus in OBS keine Background-Color - Auto-Reconnect:
ws.onclosetriggert Reload nach 2s, damit Overlay sich neu verbindet wenn SB neu startet - CSP-Probleme bei externen CDNs — alles lokal vendoren (vendor JS/CSS direkt)
- Debug-Hinweise: Im Browser-Tab
F12öffnen während OBS noch nicht läuft, OBS-internen Browser kann man via--remote-debugging-portdebuggen
Variante: Mit Web-Frontend statt OBS¶
Du kannst das HTML auch in einem normalen Browser öffnen — als Mod-Dashboard auf einem Zweit-Monitor.
Häufige Fallen¶
- Browser cached die HTML — bei Änderungen "Refresh cache" in OBS-Browser-Settings
- Audio im Overlay — Browser-Source muss "Audio over OBS" haben damit Stream-Audio rauskommt
- CORS bei externen Ressourcen — alles lokal halten, file:// statt http://
- Übertragene Strings müssen valide JSON sein — Quotes-Escape beachten
Quellen¶
- Custom Server Trigger: custom-server-trigger.md
- WebSocket Setup: setup.md