Zum Inhalt

rtmp: NGINX RTMP-Modul

Installation

Sie können dieses Modul in jeder RHEL-basierten Distribution installieren, einschließlich, aber nicht beschränkt auf:

  • RedHat Enterprise Linux 7, 8, 9 und 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 und Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-rtmp
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-rtmp

Aktivieren Sie das Modul, indem Sie Folgendes am Anfang von /etc/nginx/nginx.conf hinzufügen:

load_module modules/ngx_rtmp_module.so;

Dieses Dokument beschreibt nginx-module-rtmp v1.2.2 veröffentlicht am 05. Juli 2025.


nginx-rtmp-module

Projektblog

http://nginx-rtmp.blogspot.com

Wiki-Handbuch

https://github.com/arut/nginx-rtmp-module/wiki/Directives

Google-Gruppe

https://groups.google.com/group/nginx-rtmp

https://groups.google.com/group/nginx-rtmp-ru (Russisch)

Funktionen

  • RTMP/HLS/MPEG-DASH Live-Streaming

  • RTMP Video on Demand FLV/MP4, Wiedergabe vom lokalen Dateisystem oder HTTP

  • Stream-Relay-Unterstützung für verteiltes Streaming: Push- & Pull-Modelle

  • Aufzeichnen von Streams in mehreren FLVs

  • H264/AAC Unterstützung

  • Online-Transkodierung mit FFmpeg

  • HTTP-Callbacks (veröffentlichen/wiedergaben/aufzeichnen/aktualisieren usw.)

  • Ausführen externer Programme bei bestimmten Ereignissen (exec)

  • HTTP-Steuermodul zum Aufzeichnen von Audio/Video und Trennen von Clients

  • Fortschrittliche Puffertechniken, um Speicherzuweisungen auf einem Minimum Niveau für schnelleres Streaming und geringen Speicherverbrauch zu halten

  • Bewährt mit Wirecast, FMS, Wowza, JWPlayer, FlowPlayer, StrobeMediaPlayback, ffmpeg, avconv, rtmpdump, flvstreamer und vielen mehr

  • Statistiken in XML/XSL in maschinen- & menschen- lesbarer Form

  • Linux/FreeBSD/MacOS/Windows

Einschränkungen unter Windows

Die Unterstützung für Windows ist eingeschränkt. Diese Funktionen werden nicht unterstützt:

  • execs
  • statische Pulls
  • auto_push

RTMP-URL-Format

rtmp://rtmp.example.com/app[/name]

app - sollte mit einem der application {} Blöcke in der Konfiguration übereinstimmen

name - wird von jeder Anwendung interpretiert kann leer sein

Multi-Worker Live-Streaming

Das Modul unterstützt Multi-Worker Live-Streaming durch automatisches Stream-Pushing zu NGINX-Workern. Diese Option wird mit der Direktive rtmp_auto_push umgeschaltet.

Beispiel nginx.conf

rtmp {

    server {

        listen 1935;

        chunk_size 4000;

        # TV-Modus: ein Publisher, viele Abonnenten
        application mytv {

            # Live-Streaming aktivieren
            live on;

            # Die ersten 1K des Streams aufzeichnen
            record all;
            record_path /tmp/av;
            record_max_size 1K;

            # Aktuellen Zeitstempel zu jeder flv hinzufügen
            record_unique on;

            # Nur von localhost veröffentlichen
            allow publish 127.0.0.1;
            deny publish all;

            #allow play all;
        }

        # Transkodierung (ffmpeg benötigt)
        application big {
            live on;

            # Bei jedem veröffentlichten Stream diesen Befehl (ffmpeg) ausführen
            # mit Ersetzungen: $app/${app}, $name/${name} für Anwendung & Streamnamen.
            #
            # Dieser ffmpeg-Aufruf erhält den Stream von dieser Anwendung &
            # reduziert die Auflösung auf 32x32. Der Stream wird veröffentlicht an
            # die 'small' Anwendung (siehe unten) unter demselben Namen.
            #
            # ffmpeg kann alles mit dem Stream machen, wie Video/Audiodaten
            # transkodieren, die Größe ändern, Container-/Codec-Parameter ändern usw.
            #
            # Mehrere exec-Zeilen können angegeben werden.

            exec ffmpeg -re -i rtmp://localhost:1935/$app/$name -vcodec flv -acodec copy -s 32x32
                        -f flv rtmp://localhost:1935/small/${name};
        }

        application small {
            live on;
            # Video mit reduzierter Auflösung kommt hier von ffmpeg
        }

        application webcam {
            live on;

            # Stream von der lokalen Webcam
            exec_static ffmpeg -f video4linux2 -i /dev/video0 -c:v libx264 -an
                               -f flv rtmp://localhost:1935/webcam/mystream;
        }

        application mypush {
            live on;

            # Jeder hier veröffentlichte Stream
            # wird automatisch an
            # diese beiden Maschinen gepusht
            push rtmp1.example.com;
            push rtmp2.example.com:1934;
        }

        application mypull {
            live on;

            # Alle Streams von der entfernten Maschine ziehen
            # und lokal abspielen
            pull rtmp://rtmp3.example.com pageUrl=www.example.com/index.html;
        }

        application mystaticpull {
            live on;

            # Statischer Pull wird beim Start von NGINX gestartet
            pull rtmp://rtmp4.example.com pageUrl=www.example.com/index.html name=mystream static;
        }

        # Video on Demand
        application vod {
            play /var/flvs;
        }

        application vod2 {
            play /var/mp4s;
        }

        # Viele Publisher, viele Abonnenten
        # keine Überprüfungen, keine Aufzeichnung
        application videochat {

            live on;

            # Die folgenden Benachrichtigungen erhalten alle
            # die Sitzungsvariablen sowie
            # bestimmte Aufrufargumente in der HTTP POST
            # Anfrage

            # HTTP-Anfrage stellen & HTTP-Rückgabecode verwenden
            # um zu entscheiden, ob das Veröffentlichen
            # von dieser Verbindung erlaubt ist oder nicht
            on_publish http://localhost:8080/publish;

            # Gleiches beim Abspielen
            on_play http://localhost:8080/play;

            # Veröffentlichung/Wiedergabe beendet (wiederholt bei Trennung)
            on_done http://localhost:8080/done;

            # Alle oben genannten Benachrichtigungen erhalten
            # die Standard-Connect()-Argumente sowie
            # play/publish-Argumente. Wenn Argumente mit
            # GET-ähnlicher Syntax zum Abspielen & Veröffentlichen gesendet werden,
            # werden diese ebenfalls einbezogen.
            # Beispiel-URL:
            #   rtmp://localhost/myapp/mystream?a=b&c=d

            # 10 Video-Keyframes (kein Audio) alle 2 Minuten aufzeichnen
            record keyframes;
            record_path /tmp/vc;
            record_max_frames 10;
            record_interval 2m;

            # Asynchrone Benachrichtigung über ein aufgezeichnetes flv
            on_record_done http://localhost:8080/record_done;

        }

        # HLS

        # Damit HLS funktioniert, erstellen Sie bitte ein Verzeichnis in tmpfs (/tmp/hls hier)
        # für die Fragmente. Der Inhalt des Verzeichnisses wird über HTTP bereitgestellt (siehe
        # http{}-Abschnitt in der Konfiguration)
        #
        # Der eingehende Stream muss in H264/AAC sein. Für iPhones verwenden Sie das Baseline H264
        # Profil (siehe ffmpeg-Beispiel).
        # Dieses Beispiel erstellt einen RTMP-Stream aus einem Film, der für HLS bereit ist:
        #
        # ffmpeg -loglevel verbose -re -i movie.avi  -vcodec libx264
        #    -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1
        #    -f flv rtmp://localhost:1935/hls/movie
        #
        # Wenn Sie einen Live-Stream transkodieren müssen, verwenden Sie die 'exec'-Funktion.
        #
        application hls {
            live on;
            hls on;
            hls_path /tmp/hls;
        }

        # MPEG-DASH ist ähnlich wie HLS

        application dash {
            live on;
            dash on;
            dash_path /tmp/dash;
        }
    }
}

# HTTP kann verwendet werden, um auf RTMP-Statistiken zuzugreifen
http {

    server {

        listen      8080;

        # Diese URL bietet RTMP-Statistiken im XML-Format
        location /stat {
            rtmp_stat all;

            # Verwenden Sie dieses Stylesheet, um XML als Webseite
            # im Browser anzuzeigen
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            # XML-Stylesheet zur Anzeige von RTMP-Statistiken.
            # Kopieren Sie stat.xsl, wo immer Sie möchten
            # und geben Sie hier den vollständigen Verzeichnispfad an
            root /path/to/stat.xsl/;
        }

        location /hls {
            # HLS-Fragmenten bereitstellen
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /tmp;
            add_header Cache-Control no-cache;
        }

        location /dash {
            # DASH-Fragmenten bereitstellen
            root /tmp;
            add_header Cache-Control no-cache;
        }
    }
}

Multi-Worker Streaming Beispiel

rtmp_auto_push on;

rtmp {
    server {
        listen 1935;

        application mytv {
            live on;
        }
    }
}

GitHub

Sie finden möglicherweise zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub Repository für nginx-module-rtmp.