OBS Studio in Docker & Neko im Browser

OBS Studio in Docker & Neko im Browser
Photo by César Abner Martínez Aguilar / Unsplash

Livestreaming mit der DJI Osmo Action 4 und OBS in Docker: Ein ungewöhnlicher Use Case

Manchmal setze ich mir Projekte in den Kopf, nur weil es mir Spaß macht, Lösungen für vermeintlich unnötige Probleme zu finden. Ob dieses Projekt wirklich Sinn ergibt, weiß ich bis heute nicht. Der Hintergrund: Ich wollte während meiner Motorradfahrten mit meiner DJI Osmo Action 4 Action-Cam live streamen.

Die Herausforderung

Das Problem hierbei: Meine Stimme wurde nur auf der linken Tonspur aufgenommen, während die Stimme meines Gesprächspartners auf der rechten Tonspur landete. In einem Video-Editing-Programm lässt sich das leicht korrigieren, aber bei einem Livestream ist das nicht so einfach.

Meine Lösung: Den Stream zuerst an einen Restreamer senden und von dort aus an eine OBS-Instanz weiterleiten, um das Audio zu korrigieren. Allerdings musste ich dabei eine Hürde überwinden: Es gab keine einfache Möglichkeit, OBS in einem Docker-Container zu betreiben.

Die Lösung: OBS in Docker mit Neko

Nach einiger Recherche bin ich auf Neko gestoßen. Neko bietet ein Framework, um Linux-Desktop-Applikationen wie Firefox oder VLC in einem Container auszuführen und den Bildschirm-Output an einen Browser zu streamen. Das war genau, was ich für mein OBS-Setup brauchte. Also entschied ich mich, OBS in Neko zu integrieren, um das Audio-Problem während des Livestreams zu beheben.

Technische Umsetzung

Link zum Repo

Die technische Umsetzung ist relativ einfach, wenn man mit Docker vertraut ist. Hier ist mein Dockerfile, das OBS in einem Neko-Container bereitstellt:

# Verwende m1k1o/neko als Basis-Image
ARG BASE_IMAGE=m1k1o/neko:base
FROM $BASE_IMAGE

# Installiere OBS Studio, Xvfb und andere notwendige Pakete
RUN apt-get update && apt-get install -y openbox obs-studio ffmpeg xvfb libxcb-xinerama0

# Kopiere die angepasste supervisord.conf in den Container
COPY supervisord.conf /etc/neko/supervisord/obs.conf

# Kopiere die Openbox-Konfigurationsdatei
COPY openbox.xml /etc/neko/openbox.xml

# Starte supervisord, um Xvfb und OBS zu starten
CMD ["supervisord", "-c", "/etc/neko/supervisord.conf"]

Dieses Dockerfile basiert auf dem m1k1o/neko Image und installiert OBS Studio sowie die benötigten Abhängigkeiten. Durch den Einsatz von Supervisord werden sowohl Xvfb als auch OBS in der richtigen Umgebung gestartet.

Für die Fensterverwaltung nutze ich Openbox, eine leichtgewichtige Window Manager-Option. Hier ist ein Auszug aus meiner openbox.xml, die dafür sorgt, dass OBS ohne Fensterdekorationen läuft:

<application class="obs">
  <decor>no</decor> <!-- Entfernt Fensterdekorationen (inkl. Minimieren-Knopf) -->
  <maximized>true</maximized> <!-- Startet OBS maximiert -->
</application>

Damit wird sichergestellt, dass OBS maximiert läuft und die Fensterleiste nicht sichtbar ist, was in einem Livestream-Setup von Vorteil ist.

Supervisord-Konfiguration

Die supervisord.conf übernimmt die Verwaltung der gestarteten Prozesse. Hier ist ein Auszug:

[program:obs]
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s"
command=/usr/bin/obs --display=%(ENV_DISPLAY)s --startstreaming
autostart=true
autorestart=true
exitcodes=0,2
startretries=9999
priority=200
user=%(ENV_USER)s
stdout_logfile=/var/log/neko/obs.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10
redirect_stderr=true

Diese Konfiguration sorgt dafür, dass OBS automatisch startet, und ermöglicht die Weiterleitung von Logs, sodass ich im Fehlerfall nachsehen kann, was schiefgelaufen ist.

Docker Compose File

Dann noch ein docker-compose.yaml:

services:
  neko:
    build: .
    shm_size: "2gb"
    network_mode: host
    environment:
      NEKO_SCREEN: 1920x1080@30
      NEKO_PASSWORD: neko
      NEKO_PASSWORD_ADMIN: admin
      NEKO_EPR: 52000-52100
      NEKO_ICELITE: 1
      NEKO_NAT1TO1: 10.13.0.19
    restart: unless-stopped
    volumes:
      - ./obs-config:/home/neko/.config/obs-studio # Volume für OBS Studio Einstellungen
      #- obs-data:/home/neko/.local/share/obs-studio # Speichern von Medien & Aufnahmen
    devices:
      - "/dev/dri:/dev/dri"

Ein wichtiger Hinweis

OBS läuft in dieser Docker-Konfiguration ohne GPU-Support, das bedeutet, alles wird über die CPU verarbeitet. Für meinen speziellen Use Case war das kein Problem, aber wer auf Hardwarebeschleunigung angewiesen ist, sollte dies im Hinterkopf behalten.

Im Browser

Nach dem Ausführen von docker-compose up -d im Verzeichnis des Repositories sieht es folgendermaßen aus:

Fazit

Auch wenn dieses Projekt am Ende keinen praktischen Nutzen für mich gefunden hat (ich bin schließlich kein bekannter Motovlogger), war es dennoch eine interessante Herausforderung, eine Lösung zu entwickeln. Der Spaß, eine Lösung zu finden, stand für mich im Vordergrund.

Da das Projekt nicht in meinem Alltag Anwendung gefunden hat, gibt es auch keine umfangreiche Dokumentation im GitHub-Repository. Trotzdem könnte der Code ein guter Ausgangspunkt sein, falls jemand einen ähnlichen Use Case hat oder einfach ein experimentelles Setup ausprobieren möchte.

Wer Lust hat, OBS in einem Neko-Container laufen zu lassen, findet im Repository alles Nötige, um das Setup selbst zu testen – auch ohne detaillierte Doku sollte es funktionieren.