OBS Studio in Docker & Neko im Browser
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
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.