Eigentlich wollte ich nur live streamen. Klingt einfach, ist im Jahr 2026 aber offenbar ein Privileg, das man sich erst verdienen muss. Dieser Blog heißt nicht umsonst Unsupported — willkommen zur nächsten Folge der Serie “Dinge, die der Hersteller absichtlich nicht kann”.
Da liegt sie also, die GoPro Hero. Beworben als ultimative Action-Kamera, robust, wasserfest, 4K, kann alles. Außer dem einen, was man bei einer Kamera, die “Hero” heißt, vielleicht erwartet hätte: live streamen.
Die größeren Modelle (Hero 11, 12, 13) können es. Die kleine “Hero” — die ohne Nummer, die GoPro 2024 als günstige Einsteigerversion auf den Markt geworfen hat — kann es nicht. Kein RTMP, kein YouTube-Live, gar nichts. Wer streamen will, soll halt das doppelt so teure Modell kaufen. Ein klassischer Fall von “die Hardware könnte, aber die Firmware darf nicht”. Marktsegmentierung as a Service.
Man könnte sich darüber aufregen. Oder einfach das Smartphone aus der Schublade kramen, das seit zwei Jahren ungenutzt rumliegt.
Plan B: einfach auf YouTube streamen. Plattform der Wahl, kennt jeder, funktioniert. Sollte man meinen.
Tatsächlich darf man auf YouTube mobil erst dann live streamen, wenn man 50 Abonnenten hat. Schriftlich nachzulesen in den YouTube-Hilfeseiten, mit dem Charme einer Türsteher-Regelung: Du kommst hier nicht rein, bis genug andere Leute behaupten, dich gut zu finden.
Für Leute, die einfach nur mal eben dem Opa die Geburtstagsfeier oder dem Kumpel in Australien das Vereinsturnier zeigen wollen, ist das eine Mauer. Man wird dazu erzogen, erst eine Reichweite aufzubauen, bevor man die Funktion nutzen darf, für die man die Reichweite eigentlich aufbauen würde. Henne, Ei, Plattformkapitalismus.
Wenn der Hersteller nicht will und die Plattform einen aussperrt, bleibt nur die Eigeninitiative. Was vor zehn Jahren noch ein Wochenend-Projekt war, ist heute eine Sache von einer Stunde — vorausgesetzt, man hat einen Kubernetes-Cluster rumstehen und eine KI, die die langweilige Tipparbeit übernimmt.
Der Plan:
RuntimeDefault, NetworkPolicy. Wenn schon paranoid, dann richtig.Das ganze Repo entstand in einer Sitzung mit OpenCode (claude-opus-4.7). Dockerfile, nginx.conf, Helm-Chart, GitHub-Actions-Workflow für den Build nach ghcr.io — alles in einem Rutsch. Die KI hat sogar selbständig die zwei nervigen Bugs gefixt, die ein read-only Filesystem mit nginx hat (fehlende mime.types, fehlende temp_path-Direktiven), nachdem die Logs sie verraten haben. Selbstkorrigierende Pipelines sind eine schöne Sache, solange man die richtigen Fragen stellt.
Quellcode liegt auf github.com/eumel8/nginx-rtmp-server.
Während der Installation gab es einen kleinen Zwischenfall, den ich der Vollständigkeit halber erwähne: Mitten im Patchen des ingress-nginx Controllers hat die Node ihre DHCP-Adresse verloren und war minutenlang unerreichbar. Das hatte mit dem Deploy nichts zu tun, sondern mit einem DHCP-Server, der spontan beschlossen hatte, kein DHCP mehr machen zu wollen. Ein hektisches netplan-File später (mit der falschen Interface-Bezeichnung, weil ich ens3 getippt hatte und das Ding eigentlich ens18 heißt — danke an die KI fürs schnelle Gegenchecken), war der Cluster wieder da. Statisches IP setzen ist 2026 immer noch genauso lustig wie 2010.
Auf der Aufnahme-Seite läuft jetzt das alte Handy mit der App Streamlabs (gibt’s für iOS und Android). Stream-URL eintragen, Stream-Key vergeben, fertig. Streamlabs hat auch eine kostenlose Version, die ohne YouTube-Konto, ohne Twitch-Konto und ohne 50 Abonnenten auskommt. Verrückt.
Wer es lieber vom Laptop mit USB-Kamera macht, nimmt OBS Studio — das Schweizer Taschenmesser des Streamings, Open Source, läuft überall. Settings → Stream → Custom → Server: rtmp://rtmp.e.mcsps.de/live → Stream Key: irgendwas. Start Streaming. Das war’s.
Auf der Empfangs-Seite eine kleine HTML-Seite mit hls.js, die unter /watch automatisch ausgeliefert wird. Browser auf, Stream läuft. Latenz ist irgendwo zwischen 8 und 15 Sekunden, was für einen segmentierten HLS-Stream normal ist. Keine 50 Abonnenten nötig.
Einbetten in beliebige Webseiten ist Copy-Paste-Arbeit:
<video id="v" controls autoplay muted playsinline></video>
<script src="https://cdn.jsdelivr.net/npm/hls.js@1"></script>
<script>
const v = document.getElementById('v');
if (Hls.isSupported()) {
const hls = new Hls();
hls.loadSource('https://rtmp.e.mcsps.de/hls/test.m3u8');
hls.attachMedia(v);
} else {
v.src = 'https://rtmp.e.mcsps.de/hls/test.m3u8';
}
</script>
CORS ist serverseitig auf * gesetzt, weil ich zu der Sorte Mensch gehöre, die ihre eigenen Streams in eigene Webseiten einbetten möchte, ohne sich um Origin-Header zu streiten.
Drei Stunden Arbeit, davon zwei mit Warten auf GitHub Actions und einer mit dem netplan-Drama. Die KI hat den Rest erledigt. Eine Einzelperson kann sich heute eine Streaming-Infrastruktur hinstellen, für die man früher ein kleines Unternehmen gebraucht hätte.
Bleibt nur eine Frage: Warum tun das nicht alle? Weil der Komfort der Plattformen genau so kalibriert ist, dass die meisten Menschen die 50 Abonnenten lieber sammeln, als sich einen Streamingserver zu bauen. Das ist kein technisches, sondern ein didaktisches Problem.
Hier kommt dieser Blog ins Spiel. Unsupported, wie immer.
PS: 2 Minuten hat die KI noch zum Erstellen dieses Blogposts gebraucht.