Desktop-App (macOS & Windows) zum Streamen von Playlists oder einer Livequelle nach YouTube Live. Gebaut mit Electron + React + TypeScript, Streaming-Engine über FFmpeg.
- Welcome: Bei YouTube anmelden oder ohne Anmeldung fortfahren.
- YouTube-Setup: OAuth-Anmeldung (Loopback + PKCE) und vollständiges Broadcast-Formular — alle an YouTube übermittelbaren Felder (Titel, Beschreibung, Tags, Sichtbarkeit, Latenz, Auto-Start/Stop, DVR, Einbetten, Aufzeichnen, Untertitel, Monitor-Stream, „Für Kinder“, Kategorie). Legt Broadcast + Stream an, bindet sie und holt Ingest-URL + Stream-Key.
- Livequelle: Eingang wählen (Kamera/Capture-Karte, Bildschirm, NDI), lokal monitoren, „Livestream“ starten. Funktioniert auch ohne YouTube-Login (manuelles RTMP-Ziel).
- Playlist-Editor: Videos hinzufügen/sortieren, Bumper automatisch zwischen Videos, Crossfade-Übergänge, Endlos-Loop. Clips werden in ein einheitliches Format normalisiert und als durchgehender Stream abgespielt.
- Monitor: Live-Vorschau + Technik-Dashboard (Encoder-Bitrate, FPS, Speed, Dropped Frames, gesendete Daten) und Bandbreiten-Ampel (benötigt vs. verfügbarer Upload).
- Node.js ≥ 18 und npm.
- FFmpeg wird über
ffmpeg-staticmitgeliefert (kein System-FFmpeg nötig). - Für YouTube: eigene Google-Cloud-OAuth-Client-Credentials (Typ „Desktop“) mit aktivierter YouTube Data API v3 und ein für Live freigeschaltetes YouTube-Konto. Die App führt durch das Setup.
- NDI ist optional: setze die Umgebungsvariablen
YTLIVE_NDI_FINDER(CLI, das Quellnamen ausgibt) undYTLIVE_NDI_BRIDGE(CLI, das eine NDI-Quelle als MPEG-TS auf stdout streamt). Ohne diese werden Kamera/Capture/Screen unverändert unterstützt.
npm install
npm run dev # startet Electron im Dev-Modus
npm run typecheck # TypeScript-Prüfung (Node + Web)npm run package:mac # erzeugt .dmg (arm64 + x64) unter release/
npm run package:win # erzeugt NSIS-Installer (.exe) unter release/src/main/– Electron-Main: FFmpeg-Steuerung (ffmpeg.ts,encode.ts), Live-Engine (live.ts), Playlist-Engine (playout.ts), Geräte (devices.ts,ndi.ts), Bandbreite (bandwidth.ts), lokaler Monitor-Server (previewServer.ts), YouTube (youtube/), IPC (ipc.ts).src/preload/– contextBridge-API (window.ytlive).src/renderer/– React-UI (Screens + Komponenten, Zustand-Store).src/shared/– geteilte Typen und IPC-Kanalnamen.
Ein langlaufender FFmpeg-Prozess encodiert einmal und verteilt per tee-Muxer gleichzeitig an
das RTMP(S)-Ziel und einen lokalen MPEG-TS-Feed, den der Renderer via mpegts.js als
Monitor abspielt. Progress läuft über fd 3 und speist Bitrate/Speed/Drop-Statistik.