Live-Streaming-Server Setup (RTMP). Eine Schritt für Schritt Anleitung

Es sind diverse Dokumentationen zum Aufbau eines RTMP-Server zu finden. Oft sind die Anleitungen aber unvollständig oder es fehlen notwendige Informationen. Nach umfangreichen Recherchen und Tests habe ich dieses Setup zum “Fliegen” gebracht. Es ist eine in 16 Schritten mehrfach erfolgreich getestete Anleitung. Vielen Dank an die Open Source Gemeinschaft, die erhebliche Vorarbeit dazu geleistet hat.

// *************************************************************
Autor: Gerhard Peilstoecker
Copyright (c) 2019 - 2021 [https://it-service-peilstoecker.de]
Aenderungen: 
05.01.2021 "mein.streaming-key" nach "mein.stream-key" geaendert
06.09.2020 nginx Version von 1.15.1. nach 1.18.0 geaendert
// *************************************************************

Voraussetzung für die Installation auf Ubuntu, vorher installierte Programme:

a) VLC-Media-Player
b) OBS Open Broadcast Software
c) Zip-Entpacker
d) hier genutztes Linux-Betriebssystem Ubuntu 18.03.

 

Diese Anleitung ist Schritt für Schritt auszuführen. Für die Installation sind folgende Voraussetzungen erforderlich.
– Grundkenntnisse von dem Betriebssystem Ubuntu
– Umgang mit einem einfachen Text-Editor (HTML)

 

Tipp: Die hier angegebenen Befehlszeilen können einfach mit [Strg]+[c] kopiert werden und mit
[Strg]+[Shift] +[v] in das Konsolen-Fenster eingefügt werden.

 

Vor der Installation solltest Du Dein System auf den aktuellen Stand bringen.

  1. Mit der Tastenkombination [Strg]+[Alt]+[T] öffnest Du die Konsole und gibst dazu folgende Befehlszeile ein. Gib dann Dein Passwort ein und bestätige mit [Enter]. Mit [J] wird das Update durchgeführt.
$ sudo apt-get update && sudo apt-get dist-upgrade

2. Die folgenden notwendigen Komponeten sind als nächstes  zu installieren:

$ sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev

3. Den Webserver enginx (gesprochen “engine-X”) herunterladen. Er ist derzeit einer der leistungsfähigsten Webserver.

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

4. Die Quell-Dateien für das RTMP-Modul herunterladen.

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

5. Entpacken und in das Server-Verzeichnis wechseln

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

6. Erstellen und Installieren des nginx-Server mit dem eingebundenen RTMP-Modul.

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

7. 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

Es folgen noch weitere 9 Schritte.

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

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

Server starten mit:

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

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

Server stoppen mit:

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

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

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

10. Paketliste aktualisieren und installieren

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

11. 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

12. 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-stream-key”, dein frei erfundener key z.B. tuy31nevyqz9 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;
}   
}
}

13. Das Program OBS (Open Broadcast Studio) starten und die Standard-Einstellungen belassen, bis auf den Eintrag “URL” und “Stream Key”

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.

14. 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!

15. 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>Meine Live-Streaming-Server</title>
<link rel="stylesheet" type="text/css" href="videojs-matrix.css">
<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>
<h1></h1>


<body>



 <video poster="/logo.jpg" width="640px" height="267px"  id="video" class="vjs-matrix video-js vjs-big-play-centered " controls autoplay preload="auto" data-setup='{ "aspectRatio":"640:267"}'>

<source src="http://<meine-ip>/live/123/index.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>

16. Die erstellte Website im Browser aufrufen:

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

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

Glückwunsch! 

Du hast konzentriert und exakt gearbeitet und besitzt nun einen eigenen Live-Streaming-Server !

Weiter hilfereiche Seiten für das von mir beschriebene Setup:

75 Gedanken zu „Live-Streaming-Server Setup (RTMP). Eine Schritt für Schritt Anleitung“

  1. Bernfried Grosse-Venhaus

    Hallo Gerhard!
    Auch ich bin fast am Ziel: Wenn die Livezuspielung startet, kann ich mit der entsprechenden URL auf dem PC, Tablet und Handy im Browser die Videos live mit mehr oder weniger Zeitversatz sehen. Freu!!
    Ziel meines RTMP Servers ist, dass befugte Personen das Video eines Feuerwehr-Kopters mitverfolgen können, was innerhalb meines Heimnetzwerks testweise ja auch funktioniert. RTMP Übertragung ist in der Kopter-Steuersoftware/App vorhanden und funktioniert auch.
    Die Videos bleiben ja lt. Config im Verzeichnis video_recordings gespeichert. Die FFmpeg Videos werden ja nach dem RTMP Live-Streaming gelöscht.
    Nun würde ich gerne den Inhalt der dauerhaft gespeicherten Videos auf der gleichen Webseite zur Auswahl bereitstellen und ebenfalls mittels FFmpeg encodiert anbieten wollen. Wie beim Livestream.
    Wenn ich das Prinzip richtig verstehe, müsste man die gespeicherten Videos im Verzeichnis video_ recordings auf der Webseite an FFmpeg übergeben.
    Gibt es da Ideen und Code, den ich nutzen kann?

    Danke und Grüße
    Bernie

  2. Hallo Gerhard
    das war eine super Anleitung habe zum aller ersten mal mit Linux gearbeitet und es hat alles super geklappt ein paar Sachen wollten nicht aber habe mich bei Google ein bisschen erkundigt und es hat geklappt.
    So jetzt zu meinen Problemen. ich kann vom lokalen netz überall auf das stream zugreifen und von jedem pc über Obs auf nginx streamen allerdings komme ich von draußen (Internet) nicht auf dem server. also von meinem Smartphone (mobile daten) kann ich nicht den stream sehen obwohl ich in meinem mikrotik router den port für nginx 1935 frei gemacht habe (TCP) muss ich vielleicht in der conf datei statt die lokale ip die statische ip eingeben oder stimmt etwass mit dem portforwarding nicht? allerdings muss ich sagen das ich einen shoutcast server auf einem anderem pc laufen habe und den port 8000 frei gemacht habe und es dort super funktioniert wieso geht es hier nicht ist es vl ein einstellungspunkt oder weil es auf einer virtuellen Maschine läuft. Ich danke im voraus für deine Antwort.

  3. Hallo Gerhard!
    Kompliment zur Anleitung!
    Zwei Fragen habe ich:
    Gilt die Anleitung auch für die Installtion auf einem Raspi 4?
    Deine Antwort vom 9.6.2020 habe ich gelesen, aber vielleicht ist der 4er ja potent genug?
    Bräuchte es einen Lizenzschlüssel bzgl. Videoverarbeitung? Da war mal was beinem Raspi Videorekorderprojekt…
    Wie bekomme ich es hin, dass ich die gespeicherten Videodateien per Webbrowser anzeigen, auswählen und im Broswer abspielen lassen kann?
    Danke für Hinweise!

    1. Lieber Bernie,
      danke für deine Nachfrage!
      Für video processing gilt, je mehr Rechen-Power, um so besser. Nach obern gibt es da keine Grenzen, “Viel hilft viel”! .-)
      Klar wäre das eine tolle Lösung mit dem Raspberry Pi 4 B, aber mit 4x 1,5 GHz, 4 GB RAM ist der Einplatinenrechner für einen Streaming-Server nicht konzepiert. BTW – I love RASPIs

      Lizenzschlüssel werden nicht gebraucht bei dem Live-Streaming-Server, möglicherweise meinst du die Codecs. Wenn sie nicht auf dem Server installiert sind, ist das zu erledigen. Es hängt natürlich davon ab in welchem Format oder Qualität du deinen Stream deinem Publikum zur Verfügung stellen möchtest.

      In der Konfigurationsdatei kannst du einstellen ob dein Livestream mitgeschnitten werden soll. In diesem Fall ist zusätzlich noch Pfad bzw. die URL der Cloud anzugeben. Es wird dann eine Archiv angelegt und dieses ist wie eine Mediathek zu bedienen.

      Wünsche dir viel Spaß beim Setup!

  4. Ich habe leider das Problem daß im VLC alle paar Sekunden das Bild Stockt also einfriert danach dann wieder ein paar Sekunden läuft woran kann das liegen ?

  5. Hey, leider ist meine Installation nicht erfolgreich. Der Befehl “make” kann nicht ausgeführt werden. Folgender Fehler tritt dabei auf:
    make: *** No rule to make target ‘build’, needed by ‘default’. Stop.
    Das ganze sollte auf einem KVM Server mit Ubuntu 18.04.5 LTS installiert werden. Zuerst dachte ich es länge an einer Fehlerhaften Installation, aber auch ein 2. und 3. Versuch scheiterten.
    Ich hoffe jemand kann mir dabei helfen das Problem zu lösen.
    Liebe Grüße
    Sven

    1. Lieber Markus,
      es freut mich, dass dir die Anleitung gefällt. Gute Idee, die Beschreibung auch noch um das Thema SSL zu erweitern. Auf das https-Protokoll umzustellen, ist ja im Grunde nichts Anderes als bei jeder beliebigen Website und ich denke, da gibt es genug Infos im Web dazu. Wollte einfach meine Setup-Anleitung für den eigenen Live-Stream-Server nicht überfrachten.

  6. Hallo,

    ich habe eine Frage, ich würde gerne diesen eigenen Server für eine Drohne verwenden.
    Welchen rtmp pfad muss ich dort eingeben, damit diese Streamen kann?

    Danke schon mal im vorraus

    1. Hallo Herr Bersch,
      ob USB-Cam, ext. Webcam, Studiokamera oder ein “Fliegendes Auge”, diese Anleitung ist gilt für alle Videogeräte.

  7. Guten Abend, ich habe den Server auf einem VServer erfolgreich installiert. Bei mir musste ich in der nginx.config den “Stats” deaktivierem. NGINX ist mit folgenden Code nicht gestartet. ”
    Meine Richtige IP ist in der URL drin, habe hier im Post “x” gesetzt.

    #allows us to see how stats on viewers on our Nginx site using a URL like: “http://xx.xxx.x.xxx/stats”
    #location /stats {
    #stub_status;
    #}

    Hat wer vielleicht eine Anleitung für einen Linux Neuling wie ich die Status Abfrage hinbekomme, damit ich sehe wie viele User meine Stream sehen ?

    Viele Grüße Mario

    1. Hallo Ich hoffe ich kann dir weiterhelfen. Du musst beim ./configure “–with-http_stub_status_module” das mit einfügen dann sollte das gehen.
      Der befehl sollte das erforderliche plugin installiern.
      Viele Grüße Jonathan

      PS @den ADMIN das Captcha System ist gelinde gesagt eine Katastrophe…

  8. Hallo, vielen Dank für die Anleitung. Ich habe noch 2 Probleme. Installation unter Ubuntu 20.04.1 LTS.
    Was funktioniert:
    1. Stream im VLC rtmp://../live/key
    2. Video Recoder des Streams .flv
    Meine Probleme
    1. Stream im VLC rtmp://../mobile/key
    2. Stream im video js Player (Fehlermeldung: kein Video im Unterstütztem Format und MIME Type gefunden)
    Bin für Hinweise dankbar. Der Stream video js laüft auf dem selben Server. Können Nutzerrechte für die HLS Ordner ein Ansatz sein?
    Danke

    1. Lieber Hans, die Kernfunktion von Linux Mint 20 sind gleich der von ubuntu 20, deshalb gilt diese Anleitung auch für Linux Mint und es sollte alles wie beschrieben funktionieren.

  9. Hallo zusammen, habe eine Frage zur nginx.conf

    Den gesamten Inhalt der originalen ngnix.conf löschen und den CODE aus Punkt 8 reinkopieren und editieren ?

    1. Ja, genau Mario! Der gesamte Inhalt, der mit der Installation angelegten Datei “nginx.conf” wird gelöscht und mit dem hier beschriebenen Inhalt überschrieben. Die vorgesehenen Platzhalter sind natürlich danach zu ersetzten.

  10. Wer mag mir sagen auf welchem VSERVER der Nginx erfolgreich ohne Probleme installiert wurde.
    Mich würde der Anbieter und die Ubuntu Version interessieren.
    Habe aktuell Ubuntu 16.04 LTS, eine neue Version oder wie in der Anleitung 18.03 ist da nicht verfügbar.

    Abolouter Respekt für die hervorragende Anleitung, freue mich als Ubuntu Neuling auf die Installation:-)

  11. Du schreibst man solle “mein-streaming-key” überall ersetzen, aber in der Config hast du “mein-streaming-key”, ausser in den Kommentaren, nie verwendet. Muss ich den nur in OBS nutzen und in der URI selbst und Nginx weiss was es zu tun hat? Oder habe ich was übersehen?

    1. Hallo, vielen Dank für die Frage! Tatsächlich bezieht sich der Platzhalter “mein-streaming-key” auf den betreffenden Eintrag in das Feld der Anwendung OBS für den Streamingkey. Ich habe diese kleine Unschönheit in der Setup-Anleitung eben verbessert.

  12. Hallo Gerhard,

    ich hatte am Anfang einige Probleme, musste mehr mals den vServer neu azfsetzten, aber jetzt am ende hat alles geklappt.
    Allerdings habe ich eine Frage:
    Ich würde gerne den WebPlayer (html-code) auf eine andere Hompage als meinen Streaming-Server einbinden.
    Das video script einfach auf die andere Homapge in einen Ordner zu packen und den Link zum Streaming-Server zu verlinken hat nicht ganz funktioniert.
    Fehler: “The media could not be loaded, either because the server or network failed or because the format is not supported.”

    Dennoch weiss ich das die Datei funktioniert, da über den link http://meine-ip/livestream.html alles wunderbar läuft.

    Nun meine Frage:
    wie klann ich den Streaming-Link auf eine andere Hompage weiterleiten.

    Gruß Rönne/Sven
    P.s.: dennoch sehr tolle Anleitung!

    1. Hi Sven,
      das sollte kein Problem sein, bitte prüfe doch nochmal die gesetzten Links. Sind die Ports an der Firewall des externen Servers, auf dem du den Player installierst auch freigeschaltet?

      1. Hallo Gerhard,
        also ich habe nochmals nach geschaut und die Port 1935 sollte frei geschaltet sein.
        Habe aber meinen Webseite-Anbieter nochmals angeschreben, da die externe Hompage als Webspace gemietet wurde und nicht über ein vServer oder änlichem läuft.

        Die Links sind so alle korrekt eingetragen.
        Hoffe du hattest tolle Festtage.

        Gruß Sven

      2. Hallo ich habe das selbe Problem. Der Video.js geht da wird alles geladen. Auch der Link geht, wenn ich diesen kopiere und 1&1 in vlc einfüge kann ich den Stream sehen. Die Firewall habe ich testweise komplett deaktiviert sodass alle Ports offen sind. Trotzdem kommt auf dem externen Server die meldung “The media could not be loaded, either because the server or network failed or because the format is not supported.” Kann mir jemand helfen?

        1. Ich habe die Lösung gefunden.
          1. Muss https eingerichtet werden
          2. muss in der nginx.conf die zeile “add_header ‘Access-Control-Allow-Origin’ ‘*’;” unter location / angegeben werden sonst kann der video.js nicht drauf zugreifen.
          Ich hatte probleme mit certbot und habe um diese zu umgehen einfach eine andere configdatei benutzt und dann die pfade zum zertifikat eingefügt.
          Ich hoffe ich konnte Weiterhelfen.
          Viele Grüße Jonathan

          PS: 15 − dreizehn = 2 als prüfung ging nicht….

      3. Guten Tag,

        vielen Dank für diese detaillierte und wirklich sehr gute Anleitung.
        Ich möchte einen RMTP-Server im Internet aufsetzen, um einen Stream vom Handy über das Internet auf eine Webseite mit integriertem HTML5-Player zu streamen. Was muss ich bei der Auswahl eines Servers (Provider) beachten? Reicht da ein normaler Linux-Server, den man mieten kann, oder muss ich für RTMP noch mehr beachten?

        1. Hallo Andreas,
          ein gemieteter Linux V-Server genügt den meisten Standardanforderungen für das Live-Streaming. Spezielle Anforderungen hängen natürlich direkt von deinem Vorhaben und dem Mengengerüst ab. Die hier beschriebene Lösung, mit dem schnellsten Webserver der zur Zeit auf dem Markt ist, kannst du schon viel abdecken und bietet dir eine gute Performance. Ich würde einen Lösungsansatz wählen, der gut erweiterbar ist. Eine detaillierte Dokumentation von deinem Projekt ist hilfreich bei dem Betrieb und der Wartung & Pflege.

          Viel Spaß und viel Erfolg bei deinem Vorhaben!

      4. Hallo, ich möchte “von außen” (also per DynDNS) auf meinen Livestream über meine Fritzbox zugreifen. Für meine Nextcloud auf einem Raspi war das schnell eingerichtet und läuft, aber ich kriege die Freigabe für OBS einfach nicht hin (im LAN läuft der Livestream einwandfrei).

        (1) Welches Protokoll (TCP/UDP/ESP/GRE) muss ich in der Fritzbox-Freigabe auswählen, und welchen Port intern (1935?)? (Beispiel: “:1234 —> Freigabe Fritzbox leitet weiter —> 10.10.10.20:1935”)

        (2) Wie sieht dann der Link für einen externen VLC aus: “rtmp://:/live/”?

        1. Oha, alles in eckigen Klammern wird leider automatisch gelöscht. 🙁
          Neuer Versuch mit runden Klammern:

          (1) Welches Protokoll (TCP/UDP/ESP/GRE) muss ich in der Fritzbox-Freigabe auswählen, und welchen Port intern (1935?)? (Beispiel: „(MeinDynDns):1234 —> Freigabe Fritzbox leitet weiter —> 10.10.10.20:1935“)

          (2) Wie sieht dann der Link für einen externen VLC aus: „rtmp://(MeinDynDns):(MeinFritzboxFreigabePort)/live/“?

      5. Erst einmal vielen Dank für diese Anleitung und für die Arbeit und deine Zeit, die da drin steckt.
        Bis auf eine Sache hat auch alles super funktioniert.
        Leider konnte ich ffmpeg nicht vom PPA Repository installierten, da es scheinbar für Ubuntu 18.04 kein entsprechendes Package gibt. Ich habe daher ffmpeg aus den standard quellen installiert. Das funktioniert auch.
        Als alles lief hab ich das gleiche, ohne Probleme, nochmal mit einem ubuntu 20.04 als Basis getestet.

        Falls es jemand nützlich findet, habe ich daraus ein Docker image gebastelt:

        FROM ubuntu:20.04
        RUN apt-get update && \
        apt-get dist-upgrade && \
        export DEBIAN_FRONTEND=noninteractive && \
        apt-get install build-essential libpcre3 libpcre3-dev libssl-dev wget unzip software-properties-common ffmpeg tzdata -y && \
        ln -fs /usr/share/zoneinfo/Europe/Berlin /etc/localtime && \
        dpkg-reconfigure –frontend noninteractive tzdata && \
        wget http://nginx.org/download/nginx-1.18.0.tar.gz && \
        wget https://github.com/sergey-dryabzhinsky/nginx-rtmp-module/archive/dev.zip && \
        tar -zxvf nginx-1.18.0.tar.gz && \
        unzip dev.zip && \
        cd /nginx-1.18.0 && \
        ./configure –without-http_gzip_module –with-http_stub_status_module –with-http_ssl_module –add-module=../nginx-rtmp-module-dev && \
        make && \
        make install && \
        mkdir /HLS && \
        mkdir /HLS/live && \
        mkdir /HLS/mobile && \
        mkdir /video_recordings && \
        chmod -R 777 /video_recordings
        COPY nginx.conf /usr/local/nginx/conf/nginx.conf
        EXPOSE 80
        EXPOSE 1935
        CMD /usr/local/nginx/sbin/nginx -g ‘daemon off;’

        1. Erst einmal vielen Dank für diese Anleitung,als ubuntu 20.xx Newbie habe ich dennoch die eine oder andere Frage.
          Zitat: Falls es jemand nützlich findet, habe ich daraus ein Docker image gebastelt
          Ist das sozusagen ein install Script ? ,das heißt ich erstelle ein neues File , kopiere alles rein , bennen es Z.B install-nginx.sh ?
          Ausführung wäre dann ./install.nginx

          1. Hi Eddi,
            danke für die Wertschätzung! Der Einstieg mit ubuntu lohnt sich auf jeden Fall. Wenn Windows nicht mehr auf deinem Rechner läuft, wirkt ubuntu wie ein Turbo. Was ich damit sagen möchte, beschäftige dich ruhig erstmal mit der elementaren Schritt, für Schritt Anleitung. Die sehr prima Beiträge zur Weiterentwicklung für ein Installations-Script habe ich nicht getestet. Frage doch ganz einfach bei dem Autor nach, bestimmt hilft er dir schnell weiter. Viel Erfolg beim Testen!

        2. Hallo,
          leider scheitert bei mir die serverseitige Installation (auf nem Strato-VServer mit Ubuntu 20.04) am make. Ich bekomme die Fehlermeldung “No rule to make target ‘build’, needed by ‘default’. Stop.”
          Gibt es dazu ne Idee?
          Liebe Grüße
          Steffen

        3. Nochmal ein Nachtrag: Habe jetzt alles zum laufen bekommen, mit ein paar Anpassungen. Ein paar Fehlermeldungen gab es auch beim Repositry. Es funktionierte zwar am Ende, aber der Fehler bleibt.

          Ich nutze Unbuntu 20.04.1 LTS (focal)

          1. Brauchte ein zusätzliches Paket (libghc-zlib-dev), also
          $sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev libghc-zlib-dev

          2. Musste in der /auto/options (im entpacketen nginx-Verzeichnis) die Option “HTTP_STUB_STATUS=NO” auf “HTTP_STUB_STATUS=YES” umstellen.

          3. $sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next gibt folgendes aus:
          ” This PPA provides backported release ffmpeg for current releases Ubuntu (Trusty, Utopic, etc.)
          Mehr Informationen: https://launchpad.net/~kirillshkrogalev/+archive/ubuntu/ffmpeg-next
          [ENTER] drücken zum Weitermachen oder Strg-c, um das Hinzufügen abzubrechen.

          Ign:1 http://ppa.launchpad.net/kirillshkrogalev/ffmpeg-next/ubuntu focal InRelease
          Holen:2 http://security.ubuntu.com/ubuntu focal-security InRelease [107 kB]
          Fehl:3 http://ppa.launchpad.net/kirillshkrogalev/ffmpeg-next/ubuntu focal Release
          404 Not Found [IP: 91.189.95.83 80]
          OK:4 http://de.archive.ubuntu.com/ubuntu focal InRelease
          OK:5 http://de.archive.ubuntu.com/ubuntu focal-updates InRelease
          OK:6 http://de.archive.ubuntu.com/ubuntu focal-backports InRelease
          Paketlisten werden gelesen… Fertig
          E: Das Depot »http://ppa.launchpad.net/kirillshkrogalev/ffmpeg-next/ubuntu focal Release« enthält keine Release-Datei.
          N: Eine Aktualisierung von solch einem Depot kann nicht auf eine sichere Art durchgeführt werden, daher ist es standardmäßig deaktiviert.
          N: Weitere Details zur Erzeugung von Paketdepots sowie zu deren Benutzerkonfiguration finden Sie in der Handbuchseite apt-secure(8).”

          4. Es wäre schön, wenn ich den ganzen Kram mit “systemctl enable nginx” laufen lassen könnte, damit auch bin einem Neustart alles wieder mit hoch kommt. Da fehlt mir die Erfahrung wie ich das so anpasse das es läuft.

          Ansonsten funktioniert alles super. Nachmals vielen Dank für die Anleitung!

        4. Erstmal vielen Dank für diese Anleitung.

          Brauchte für den ./configure Befehl aber noch das Paket libghc-zlib-dev, da dieser mit folgender Fehlermeldung gemeckert hatte:

          “./configure: error: the HTTP gzip module requires the zlib library.
          You can either disable the module by using –without-http_gzip_module
          option, or install the zlib library into the system, or build the zlib library
          statically from the source with nginx by using –with-zlib= option.”

          Ich bin noch im ganzen Installationsvorgang und frage mich gerade wo die ganzen Verzeichnisse hin sollen, die da angelegt werden sollen. Tatasächlich in “/”?

        5. Hi,

          ich benötige ein RTMP signal rein und ein HTTPS:…/xy.m3u8 Signal/File damit ich im Browser bei Nutzern meiner APP keine Fehlermeldung bekommen, dass die Verbindung unsicher ist.

          Wie mache ich das?

          1. Vielen Dank für deine Frage! Wie ist dein konkreter Systemaufbau? Es ist keine große Herausforderung eine sichere Verbindung zum Live-Stream-Server aufzubauen. Da gibt es viele einfache und kostenfreie Lösungen. Ich würde einfach mein eigenes VPN aufbauen und selbst ein Zertifikat erstellen. Dann hast du eine https-Verbindung und der Stream von deinem Live-Streaming-Server ist sicher. Der Browser wirft keine Hinweismeldung mehr, der Nutzer bekommt keine Angst mehr 🙂 So entstehen keine zusätzliche Koste, wie wenn du einen Vertrag bei einem VPN-Service-Provider abschließt. Ein weiterer Vorteil ist, deine Nutzer*innen können deinen Live-Stream weltweit empfangen, da das Problem mit Geoblocking damit auch ausgehebelt wird. Oh.. durfte ich das überhaupt verraten? :-)) Have a lot of fun..

        6. Hallo Gerhard,
          ich hatte schon mit nginx rumgespielt.
          Ich bin ein wenig irritiert, wird bei der .conf auch der Stream gespeichert?
          record all + record_unique on deutet für mich darauf hin..

          Wenn ich es recht erkenne wird der ankommende rtmp-Stream umgewandelt und dann ausgesendet.
          Wie ist da die Latenz?

          Gruß Thomas

            1. Danke Thomas für die Frage. Bei dem hier beschriebenen Setup empfehle ich dir die aktuelle Version des nginx zu verwenden. Höhere Versionen sind Fehlerbereinigt und Weiterentwicklungen. Ganz einfach alle Angaben zur Version die ich in der Anleitung verwendet habe, durch die aktuelle Version des nginx Webserver ersetzen. Der Live-Stream-Server läuft selbstverständlich auch mit der aktuellen Version. Könnte ich eigentlich auch mal anpassen, sodass die Anleitung aktuell bleibt. Wünsche dir viel Spaß und Erfolg beim Aufbau!

            2. Hi Thomas,
              im Grunde genommen ist der Stream ja nur eine Anzahl von vielen einzelnen Bilder die wie bei einem Daumenkino hintereinander in einer hohen Geschwindigkeit hintereinander gezeigt werden. Die Bilder lernen das Laufen :-). Jedes einzelne Bild wird zwischengespeichert und konvertiert. Für einige Anwendungsfälle macht es Sinn, den Stream zu speichern, z.B. um ihn später als Konserve den Kunden anzubieten. z.B. den Live-Mitschnitt später in einer eigenen Mediathek anzubieten. In der .conf lassen sich diese Einstellungen konfigurieren. Thomas, wie du schreibst, wird der rtmp-Stream umgewandelt und dann “gesendet”. Mit dem derzeit schnellsten Webserver der nginx, schaffst du die beste Performance. Selbstverständlich sind alle weiteren Komponenten relevant für die User Experience. Bei meinem Live-Stream-Server konnte ich keine nennenswerte Latenzen feststellen. Klar, das der Live-Stream in Relation zur Real-Time bei den Consumer zeitversetzt ankommt, dieser Zeitversatz bleibt aber stabil. Dieses Verhalten haben wir aber auch bei jeder Live-Übertrag beim TV oder auch Radio.
              Auf was zielt deine Frage konkret ab? Latenzen sind aus meiner Sicht nur kritisch in einer bidirektionalen Übertragung und wirkt sich dann nachteilig auf die User Experience aus. Der hier beschriebene Live-Stream-Server ist ja als Sender zu sehen.

              1. Hallo Gerhard,
                danke für die ausführlichen Antworten.
                Ich bin Amateurfunker und bin Sysop eines Amateurfunk-Fernsehrelais. Alles ambitioniertes Hobby
                Wir streamen die Funkaussendung auf unsere Internetseite um auch den Interessierten ausserhalb der Funkreichweite die Möglichkeit zu geben, bei uns reinzuschauen.
                Da kommt es auch schon mal bidirektionalen Austausch, wo lange Latenzen (>5 Sekunden) stören.
                Daher meine Frage.

                Wenn ich es richtig sehe, ist der ausgesendete Stream kein RTMP mehr und somit nicht vom EOL im November betroffen?

                Ich werde dann mal ein wenig experimentieren.

                Wir haben unsere Seiten mit WordPress gemacht und dann muss eine Seite entsprechend eingerichtet werden.

                Vielen Dank für Deinen Beitrag und die Mühe.

                Gruß Thomas

            3. Hallo Gerhard,
              ich würde gern wissen, wie gute Erfahrung du mit HEVC und NGINX gemacht hast. Ist es überhaupt möglich, einen eingehenden H256 zu transcodieren und in anderen Formen als H256 wieder ausugeben?

            4. Danke für die Anleitung, super !
              Da ich einen kleinen Milestone Server am anderen Ende besitze, für die Viewer, wäre es hübsch, den Stream irgendwie zu transcodieren um ab zugreifen? (Onvif oder universal Treiber?)
              Ich kenne das rtmp-modul noch nicht sehr gut… könnte da etwas möglich sein?
              Danke & Grüsse Martin

              1. Gerhard Peilstöcker

                Danke dir TINO für deine Frage und Anregung. Ich habe mich damit nicht intensiver beschäftigt, gerne stelle ich aber diese Frage den Leser*innen dieses Beitrags. Möglicherweise hat jemand ein link für dich?

              1. Gerhard Peilstöcker

                Für meine hier beschriebene Lösung war es nicht erforderlich. Eine Umsetzungen weiterer Sicherheitsanforderungen hängen direkt von den Anwendungsfällen ab und selbstverständlich von allen Details der Systemarchitektur.

            5. 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

              2. 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.

                1. Hi, @Jerome
                  bist du mit deinem Vorhaben erfolgreich gewesen, ich such(t)e nach einer Möglichkeit 24/7 zu streamen. Bei meinem VPS Provider habe ich keine GUI, leider nur komandozeile (glaube ich, bin auch kein Pro in Sachen Linux) und möchte auch auf verschiedenen Plattformen gleichzeitig streamen.

                  Komme so alleine nicht weiter!

              3. 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.

                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.

              4. 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

                2. Vielen Dank für deine Antwort.
                  Ich habe sehr lange nach dem Fehler gesucht und dein Kommentar hat mir bei der Lösung des Problems geholfen 🙂

              5. 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!

              6. 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.

              7. 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

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

Kommentare

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