Eigener Live-Streaming-Server setup

Es gibt einige Dokumentation zu diesem Aufbau, die auf YT gezeigt werden. Oft sind die Anleitungen unvollständig oder es fehlen notwendige Informationen. Nach umfangreichen Recherchen und dem Einlesen in das Thema, habe ich dieses Setup zu fliegen gebracht. Vielen Dank an die Open Source Gemeinschaft, die unendliche viel Vorarbeit dazu geleistet hat.

Voraussetzung für die Installation auf Ubuntu vorher installierte Programme:
a) VLC-Media-Player
b) OBS Opern Broadcast System
c) Zip-Entpacker
d) hier genutztes Linux-Betriebssystem Ubuntu 18.03.

Die Anleitung ist Schritt für Schritt auszuführen. Für diese Installation sind folgende Grundkenntnisse erforderlich. Die Befehlszeilen können mit Strg+x kopiert werden und mit Strg+Shift in das Konsolen-Fenster eingefügt werden.
– Grundkenntnisse von dem Betriebssystem Ubuntu
– Umgang mit einem einfachen Text-Editor (HTML)

  1. Eine Konsole starten und die folgenden notwendigen Tools installieren:
$ sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev

2. Den Webserver enginx (gesprochen „engine-X“) herunterladen. Es derzeit einer der leistungsfähigen Webserver.

$ wget http://nginx.org/download/nginx-1.15.1.tar.gz

3. Quellen für das RTMP-Modul herunterladen

$ wget https://github.com/sergey-dryabzhinsky/nginx-rtmp-module/archive/dev.zip

4. Entpacken und in das Server-Verzeichnis wechseln

$ tar -zxvf nginx-1.15.1.tar.gz
$ unzip dev.zip
$ cd /nginx-1.15.1

5. Erstellen und Installieren des nginx-Server mit dem eingebundenem RTMP-Modul.

$ ./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-dev
$ make
$ sudo make install

6. Notwendige Verzeichnisstruktur anlegen für die Fragmente des Video-Streams.

$ sudo mkdir /HLS
$ sudo mkdir /HLS/live
$ sudo mkdir /HLS/mobile
$ sudo mkdir /video_recordings
$ sudo chmod -R 777 /video_recordings

Wird ubuntu mit Firewall betrieben (Standard ist aus), dann muss folgende Regel eingefügt werden.

$ sudo ufw allow 80 
$ sudo ufw allow 1935 sudo 
$ ufw enable

6. Der Server ist installiert im Standardverzeichnis: /usr/local/nginx und wird nun gestartet. Den Browser öffnen und http://<deine ip-adresse>/  oder „localhost“ eingeben. Es erscheint die Startseite des Servers. (Die IP-Adresse des Servers wird über das Komando $ ifconfig ausgegeben.)

Server starten mit:

$ sudo /usr/local/nginx/sbin/nginx

Server stoppen mit:

$ sudo /usr/local/nginx/sbin/nginx -s stop

6. Installieren von FFmpeg zum Konvertieren und Packen des Streams.

$sudo apt-get install software-properties-common
$sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next

6. Paketliste aktualisieren und installieren

$sudo apt-get update
$sudo apt-get install ffmpeg

7. Der Server konfigurieren vorher die original Konfigurationsdatei „nginx.conf „sichern.

$ sudo cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.original
$ sudo nano /usr/local/nginx/conf/nginx.conf

8. Den gesamten Inhalt in die vorhandene Datei „nginx.conf“ kopieren (überschreiben) und speichern. Die Platzhalter „meine-ip sind mit der IP-Adresse deines Server zu ersetzten. Beispiel: 192.168.254.178
Für „mein-streaming-key“, dein frei erfundener key z.B. 123 überall einsetzen.

worker_processes  1;
error_log  logs/error.log debug;
events {
worker_connections  1024;
}
rtmp {
server {
listen 1935;
allow play all;

#creates our "live" full-resolution HLS videostream from our incoming encoder stream and tells where to put the HLS video manifest and video fragments
application live {
allow play all;
live on;
record all;
record_path /video_recordings;
record_unique on;
hls on;
hls_nested on;
hls_path /HLS/live;
hls_fragment 10s;

#creates the downsampled or "trans-rated" mobile video stream as a 400kbps, 480x360 sized video
exec ffmpeg -i rtmp://meine-ip:1935/$app/$name -acodec copy -c:v libx264 -preset veryfast -profile:v baseline -vsync cfr -s 480x360 -b:v 400k maxrate 400k -bufsize 400k -threads 0 -r 30 -f flv rtmp://meine-ip:1935/mobile/$;
}

#creates our "mobile" lower-resolution HLS videostream from the ffmpeg-created stream and tells where to put the HLS video manifest and video fragments
application mobile {
allow play all;
live on;
hls on;
hls_nested on;
hls_path /HLS/mobile;
hls_fragment 10s;
}

#allows you to play your recordings of your live streams using a URL like "rtmp://meine-ip:1935/vod/filename.flv"
application vod {
play /video_recordings;
}
}
}


http {
include       mime.types;
default_type  application/octet-stream;

server {
listen 80;
server_name meine-ip;

#creates the http-location for our full-resolution (desktop) HLS stream - "http://meine-ip/live/mein-stream-key/index.m3u8"      
location /live {
types {
application/vnd.apple.mpegurl m3u8;
}
alias /HLS/live;
add_header Cache-Control no-cache;
}

#creates the http-location for our mobile-device HLS stream - "http://meine-ip/mobile/mein-stream-key/index.m3u8"        
location /mobile {
types {
application/vnd.apple.mpegurl m3u8;
}
alias /HLS/mobile;
add_header Cache-Control no-cache;
}   

#allows us to see how stats on viewers on our Nginx site using a URL like: "http://meine-ip/stats"     
location /stats {
stub_status;
}

#allows us to host some webpages which can show our videos: "http://meine-ip/my-page.html"     
location / {
root   html;
index  index.html index.htm;
}   
}
}

8. Das Program OBS (Open Broadcast Studio) starten und die Standard-Einstellungen belassen, bis auf den Eintrag „URL“ und „Stream-Schlüssel“

Encoder-x264
Variable bitrate (not CBR or Constant Bit Rate), Quality highest
Max bitrate-600kbps
Audio-Codec-AAC
Audio-Format-44.1khz
Audio-bitrate-64kbps
URL "rtmp://deine-ip:1935/live"
Stream Key-"mein-stream-key"
Resolution-640x480
FPS (frames per second)-30
CFR (Constant Frame Rate) - Yes
Keyframe interval-2 seconds (one keyframe every 2 seconds)
x264 Encoding Profile-baseline (may work with main—depends on player used)
x264 CPU Present-veryfast

a) In OBS eine Videoquelle auswählen, z.B. Webcam
b) die Schaltfläche „Streaming starten“ betätigen

Ergebnis: Die Beschriftung der Schaltfläche wechselt in „Streaming stoppen“ und es wird in der unteren Statuszeile die Übertragsrate angezeigt.

9. Nun folgt ein Test mit dem VLC-Media-Player. Den Menüpunkt des VLC, „Medien/Netzwerkstream öffnen“ und die folgende Adresse eingeben:

http://meine-ip/live/mein-stream-key/index.m3u8

Wenn alles geklappt hat, zeigt der VLC-Player deinen Stream. Gratulation!

10. Stream in einer Website mit dem Media-Player „Video.js“ einbinden.

a) Den video.js-Player herunter laden und im Verzeichnis /usr/local/nginx/html entpacken.

b) Folgende HTML-Seite mit dem Namen z.B. „meine-index.html“ in dem o.g. Verzeichnis erstellen.

 <!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Willkommen zu meiner Streaming-Seite!</title>
<link href="/video-js.css" rel="stylesheet">
<script src="/video.js"></script>
<script src="/videojs-contrib-hls.js"></script>
<script> var player = videojs('example-video');
player.play();
</script>

</head>

<body>

<video poster="/logo.png" id="example-video" class="video-js vjs-default-skin" controls preload="auto" width="640" height="268" data-setup='{}'>

<source src="http://meine-ip/live/mein-streamkey/test.m3u8" type="application/x-mpegURL">
        <p class="vjs-no-js">To view this video please enable JavaScript, and consider upgrading to a web browser that
        <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a></p>
        </video>

</body>
</html>

12. Die erstellte Website im Browser aufrufen:

http://meine-ip/meine-index.html

Die Website erscheint mit dem eingefügtem Live-Player. Glückwunsch!

Hilfereiche Seiten für das beschriebene Setup
https://obsproject.com/forum/resources/how-to-set-up-your-own-private-rtmp-server-using-nginx.50/

https://www.vultr.com/docs/setup-nginx-on-ubuntu-to-stream-live-hls-video

https://www.vultr.com/docs/setup-nginx-rtmp-on-ubuntu-14-04

https://selimatmaca.com/index.php/live-streaming

Dir gefällt dieser Beitrag und möchtest deine Anerkennung zeigen? Ich freue mich über eine Spende.

20 Gedanken zu „Eigener Live-Streaming-Server setup“

  1. Hallo, ich habe damit erfolgreich einen Stream aufgesetzt, funktioniert sehr gut. Die Video Qualität ist sehr gut und es ist auch flüssig.

  2. Hallo, also auch für mich als Linux Neuling war die Setup Beschreibung sehr hilfreich. Stream läuft sauber auf alles Geräten (auch Smartphone). Danke für die coole Beschreibung. Jetzt wäre es nur gut zu wissen wie ich den von „ausserhalb“ meines Heimnetzwerkes abrufen kann. Bisher hab ich das noch nicht hinbekommen. Ich nutze einen V-DSL DS-lite Anschluss und bin daher auf Drittanbieter Betreffs IPv6 Routig angewiesen. Die Fritzbox – Myfritz – Portfreigabe hat bisher auch keinen Erfolg gebracht.

    1. Gerhard Peilstöcker

      Hi Falk,
      Gratulation! Danke für dein Feedback und als Linux-Neuling – Hut ab! Da hast du ein ganzes Stück konzentrierte Arbeit geleistet.
      Gerne helfe ich dir weiter bei dem Zugriff von außen. Ich habe zwei Drittanbieter getestet und bin von dem kostenlosen und äußerst stabilen Service von Selfhost.de überrascht. Der Dyn-DNS Service ist schnell eingerichtet. Du musst dazu noch auf deinem Router die betreffenden Ports freigeben, jeweils TSP und UDP und unter den Einstellungen „Dynamisches DNS“, die Zugangsdaten von Selfhost.de eintragen. Wenn alles klappt kann die ganze Welt deinen Videostream auf von deinem eigenen Server stehen. Viel Erfolg!

      1. Hey Gerhard, Danke für Deine schnelle Antwort. Mein Problem ist aber das mir mit einem Dyn DNS Anbieter vermutlich nicht geholfen ist. Ich hatte es bei einigen probiert bis ich herausgefunden habe das mein Internetzugang über ein DS-lite Tunnel erfolgt. Das kann ich umgehen indem ich die DynDNS von der MyFritz! Freigabe benutze. Jetzt wäre interessant zu wissen welche Ports ich dafür freigeben muss. UDP also auch…. ich glaube wir kommen der Sache langsam näher 🙂

        1. Gerhard Peilstöcker

          Genau, in der Fritzbox gibst du die DynDNS Zugangsdaten von deinem Anbieter an und gibst die Ports 80 und 443 frei. Damit bohrst du dann zwei Löcher in deine Firewall 🙂 Hintergrund: Du bekommst von deinem DynDNS-Anbieter eine feste URL bereitgestellt z.B. mylive-cam.selfhost.co und einen Benutzername und Kennwort, damit ist dein Live-Streaming-Server immer über das Internet erreichbar auch wenn dein Internetserviceprovider (ISP) alle 2 Tage deine öffentliche IP-Adresse aus Sicherheitsgründen ändert. Ich habe das Setup auch schon mit einer Raspberry-Cam gebaut und die überwacht unser Grundstück.Raspberry PI2 mit motioneyeos

  3. Hallo Gerhard.
    Erst mal Danke für Deine Mühen!
    Ich habe Deine Anleitung befolgt (altes nginx vorher deinstalliert). Bei mir (Ubuntu Server 18.04.4) musste ich allerdings noch libnginx-mod-rtmp nach installieren. Es klappt soweit bis zum Test mit dem vlc. Dann komme ich zum Video.js und bekomme die Meldung „The media could not be loaded, either because the server or network failed or because the format is not supported“. Das Fenster bleibt dunkel.

    Das JS-Modul videojs-contrib-hls.js hatte ich nicht gefunden und hab es von hier geholt: https://github.com/videojs/videojs-contrib-hls/releases/download/v5.15.0/videojs-contrib-hls.js aber keine Änderung.

    Im error.log finden sich mehrere dieser Zeilen:
    2020/05/23 09:12:40 [debug] 27879#0: *1 hls: update fragment
    und in access.log in der Art:
    192.168.178.79 [23/May/2020:09:15:27 +0000] PLAY „live“ „123“ „“ – 413 89167 „“ „LNX 9,0,124,2“ (1s)

    1. Hallo Harry, schau doch bitte mal welches JS-Modul ich damals verwendet hatte. Es klingt für mich so, als sei es eine nicht kompatible Version. Mit den Systemmeldungen solltest du eigentlich weiter die erforderliche Konfiguration aufbauen können. Bekanntlich hat ja jede Linux-Distribution eine unterschiedliche Funktionsumfang, so ist es auch üblich und oft erforderliche Module/Libraries noch zu installieren. Die Systemmeldungen von Linux sind dabei oft sehr hilfreich und weisen auf fehlende Komponenten hin. Wünsche dir weiterhin viel Erfolg.

    2. Korrektur: libnginx-mod-rtmp brauchte ich nicht installieren. Jedoch muss ich beim ./configure zusätzlich –with-http_stub_status_module angeben.

      Im Debugger (FF und Chrome) bekomme ich die JS-Meldung:
      TypeError: The element or ID supplied is not valid. (videojs)

      Aber ich habe den Verdacht, dass es am Mimetyp liegt? Es kam auch in der Console die Meldung, dass application/x-mpegURL nicht unterstützt. Diese steht auch nicht in der Konfiguration von nginx. Andere Typen, zb video/mp4 gehen auch nicht.

  4. Erst hatte ich 7.6.5 und bin dann auf die neueste 7.8.1 gegangen aber es hat sich nicht geändert. videojs-contrib-hls ist die Version 5.15.0

    Ich versuch dann mal weiter.
    Danke!

  5. habe einen aktuellen Server (ubuntu20.04/nginx1.19+rtmp modul)aufgesetzt und mit dieser Anleitung ans laufen bekommen. Danke dafür.
    Nur der mobile stream wollte nicht. Lösung war ein tipp?-Fehler im exec ffmpeg Befehl.
    Ich habe maxrate durch -maxrate ausgetauscht und /$ am ende durch /$name. Dann lief es.

    1. Gerhard Peilstöcker

      Hallo Julian,
      super, danke für dein Feedback, wir leben davon 🙂 Ich schaue mir gleich mal die Anleitung diesbezüglich an, möglicherweise ist es ein Tipp-Fehler. Auf jeden Fall, ist dein Hinweis bereits jetzt hilfreich für die Community. Thx

    1. Gerhard Peilstöcker

      Hi Florian,
      danke für deine Anfrage. Einen Webserver auf dem PI zu installieren ist eine super Idee und funktioniert hervorragend. Das ist für viele Anwendung ideal, da der PI lautlos arbeitet und kaum Strom verbraucht. Für einen Streaming Server ist der kleine Pi aber restlos überfordert. Seine Stärken liegen in anderen Bereichen.

  6. Hallo Gerhard,

    bin recht neu was nginx und rptm angeht! ist es möglich videos die im mp4 format auf dem server liegen mittels nginx (rtpm, hls, ffmpg) zu twitch streamen! Möcht dort ein 24 std stream einrichten bei dem die mp4 videos die auf dem server liegen nach einander abgespielt werden. Da es ein vps server ist kann kein obs genutzt werden.
    Schon mal danke für deine hilfe!

    1. Gerhard Peilstöcker

      Hi Jerome,

      vielen Dank für deine Frage. Was hält dich davon ab, auf einem VPS Server OBS zu installieren? Dazu gibt es Tutorials im Netz, also kein Problem. Selbstverständlich würde ich ein VPS mit Ubuntu Linux empfehlen. Um eine noch größere Reichweite deines „Senders“ zu erreichen, könntest du auch gleichzeitig und 24/7 auf weitere Streaming Server (Facebook, Youtube, Periscope, Vimeo, etc.) deine Viedeos ausstrahlen. Wünsche dir viel Erfolg bei deinem Projekt.

  7. Ja auf die alternative mit obs wollte ich zuerst zugreifen, aber dazu ist opengl 3.2 fähige hardware nötig, der server stellt da durch das es nur ein vps ist, nur opengl 3.0 zurverfügung. Aus diesem grund wollte ich auf nginx und die dazu gehörigen Module zurück greifen.

  8. Danke für die Anleitung !
    eigentlich läuft alles wie beschrieben, bitte eine Frage, wie bekomme ich den Stream auf eine bestehende Website eingebunden? Ich habe mehrere Versuche unternommen, es kommt die Meldung hls Video File not found….
    Mit VLC Player funktioniert alles.
    Danke

    1. Hallo Heiko,

      danke für dein Feedback. Du hast den Aufbau also fast geschafft, prima! Um deine Frage beantworten zu können, bräuchte ich mehr Indizien. Wie ist dein konkretes Setup (Netzwerkkonfiguration, Router, CMS, Firewall, etc.)? Wie/wer hostet die Website ggf. auf welchem Webserver? Mit welchem Code hast du den Live-Stream auf der Website eingebunden? Sind ggf. die notwendigen Ports der Firewall geöffnet? Wie sind die Einstellungen für das dynamisches DNS? Ist dein Live-Server-Server über das Internet zu erreichen? Wie ist die URL?

      Sorry Heiko für die vielen Fragen, aber ohne gehts nicht. 🙂 Vielleicht helfen dir meine Fragen bereits, um selbst die richtige Konfiguration zu finden.

      Viele Grüße
      Gerhard

      1. Danke für deine Antwort !
        Ich habe inzwischen Fortschritte gemacht, soll heißen das ich den Stream auf meiner Website einbinden konnte und dieser auch läuft, leider sehr „ruckelig“. Ich denke damit sind erstmal viele Fragen geklärt wie Firewall, Ports etc., denn wenn das nicht „frei“ bzw. offen ist oder falsch konfiguriert, dann würde es ja nicht „ruckelig“ funktionieren.
        Das ganze ist momentan ein reines „Test/Experiment“ Projekt. Ich nutze den Provider für meine Homepage zum testen „Serverprofis“. Der StreamServer steht an einer anderen Stelle, mit 100000 DSL Anbindung. Es wird „lokal“ per OBS an den StreamServer gesendet und in/auf meiner Homepage habe ich FlowPlayer als Test eingebunden. Es geht aber nicht flüssig….
        Falls du Lust und Zeit hast für Tests etc. könnte ich die alle Daten zukommen lassen, aber nicht hier in der Öffentlichkeit. Oder du schreibst mir an shp@freenet.de
        Ich würde mich über Hilfe und Ratschläge sehr freuen, Streaming ist neuland für mich, aber ich bin ja lernfähig
        Danke Heiko

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.