Videostreaming komplett selbstgebaut

Zwar mache ich normnalerweise kein Video, aber Corona zwang mich dazu…

Vor 2 Wochen haben wir ein kleinmes Musik(er)festifal selber live per Video gestreamt - mit komplett eigenem Stack von Zuspieler bis CDN.

War eigentlich relativ einfach: die Musiker haben uns entweder vorab Videos geschickt, oder per Zoom (Problem: Soundqualität), Discord (maues Audio, massive Video-Audio-Drift), Skype (Soundqualität oder vielmehr deren Fehlen), NextCloudTalk (Sound gut, aber Video nicht so toll) in einem „privaten“ Videochat auf den OBS-PC gespielt. Das haben wir dann mit OBS Studio als Screen-Rip vom Monitor abgegriffen und per RTMP auf einen kleinen vServer (2 vCores, 1Gbit/s-Anbindung, 6€/Monat) hochgestreamt. Dort dann mit FFMPEG in einen HLS-Videostream umgewandelt. HLS lässt sich mit einem simplen Webserver weiterverteilen - ist ja schließlich nichts anderes als lauter Dateischnipsel…

Eine ausführlichere Zusammenschrift zum Nachbauen auf Deutsch und Englisch habe ich veröffentlicht auf
https://www.wyae.de/docs/video-streaming/

Was mich überrascht hatte: mein 9 Jahre alter Mittelklasse-PC hat das als OBS-Streamer incl. Web-Videochat-Client sauber in HD (720p) geschafft. Ohne GPU-Beschleunigung. Und die 2 vCores haben das Umrechnen-auf-Stream auch parallel zum Ausliefern geschafft. Mit 4 vCores hätte der Server wohl ~400 Streams ausliefern können und damit die 1Gbit/s-Leitung gesättiǵt. Das wäre dann wohl die nächste Stufe: skalieren über Server hinweg.

Nächste-Erkenntnis: Apple braucht mal wieder Sonderlocken, wenn es um Video im Browser geht. Insbesondere die Pads ind Phones. Egal ob Videochat oder auch nur HLS anschauen (im Browser).

War echt anstrengend. Audio-only ist da deutlich entspannter. Ich würd’ mich alleine schon deshalb freuen, unser kleines Festival nächstes Jahr wieder live, audio-only und in vollanalog fahren zu können…

5 Like

Habt ihr wahrscheinlich schon entdeckt? In Zoom kann man in den erweiterten Audioeinstellungen das gesamte Audioprocessing abschalten, wenn man den Ton selber im Griff hat.

Ja, man kann inzwischen beim aktuellen Mac-Programm „Original Sound“ ein- und alle Noise-Canceling-Optionen ausschalten (siehe u.a. https://www.musicrepo.com/zoom-music-mode/).

Aber das kann bei Weitem noch nicht jede Client-Version/App, und beim Web-Client scheint da was serverseitig (und nicht konfigurierbar) zu laufen.

Und dann muss man die teilweise massiv technikfernen Computerlaien auch noch durch die Einstellungs-Ebenen fernbetreuen. Ohne genau zu wissen oder zu sehen, was die da genauer machen.
Ja, man könnte dafür ScreenSharing machen. Aber das ist ja selbst wieder so eins der „fortgeschrittenen“ Technikwunder / Teufelszeugs.

1 Like

Wow!

Deine Anleitung ist wirklich hervorragend! Vielen Dank dafür!

Hi Volker,

erstmal sehr cooles Projekt! Hab mich mit Video-Streaming noch nicht allzu sehr beschäftigt und finde das Thema sehr spannend. Ich habe direkt ein paar Fragen/Anmerkungen:

mit komplett eigenem Stack von Zuspieler bis CDN

Wo ist denn in deinem Tech-Stack das CDN? Hab ich da was übersehen?

und per RTMP auf einen kleinen vServer

Da wäre auf jeden Fall RTMPS vorzuziehen

Apple braucht mal wieder Sonderlocken, wenn es um Video im Browser geht.

Ist HLS nicht sogar ein Protokoll von Apple? Würde mich jetzt sehr wundern, wenn man das nicht im Browser zum Laufen bekommt. Hast du da Ideen, woran es liegen könnte?

Mit 4 vCores hätte der Server wohl ~400 Streams ausliefern können

Da kann man doch bestimmt noch mit einer Caching-Infrastruktur optimieren? Hast du dir dazu schon einmal Gedanken gemacht?

1 Like

Naja, erst mal nur ein Solo Verteil-Server. Der Web-Server. Aber unser eigener. Für mehr müsste man den multiplizieren und einen LoadBalancer vorschalten. Machbar, war aber für uns nicht nötig. Und da alles stateless ist würde vermutlich sogar ein simples DNS-RoundRobin reichen. Man müsste nur die Dateien entsprechend kopieren. Oder es reicht für die erste/nächste Iteration gar ein einzelnes zentrales NFS mit FSC, das dann von den Webservern gemounted wird.

Der MediaPlayer von Apple läuft ohne Probleme. Dafür muss man aber den .M3U8 anklicken. Der iOS-Safari unterstützt die Web-Videostandards nur sehr, sehr eingeschränkt. Daher funktioniert der Staandard-Videoplayer HLS.JS unteriOS nicht.

Das Verteilen selber könnte 1 vCore vermutlich auf der linken Pobacke wegkauen. Denn statische Dateien cachen sich schon sehr prima im Dateisystemcache. Es werden ja im HLS-Stream ja immer dieselben .TS-Dateien und dieselbe .M3U8 angefragt. Und die liegen dann bei einem entsprechend „großen“ vServer dann schnell komplett im RAM. Und von da konnte schon 2007 ein Apache auf einem auch damals schon betagten 300MHz-Celeron eine 1 Gbit/s-Leitung sättigen.
Nur braucht es schon fast 2 vCores um RTMP auf HLS umzurechnen. Und der nächste Schritt bei vServer-Miete nach 2 vCores sind meist 4 vCores. Daher 4.