Aller au contenu

rtmp: Module RTMP de NGINX

Installation

Vous pouvez installer ce module dans n'importe quelle distribution basée sur RHEL, y compris, mais sans s'y limiter :

  • RedHat Enterprise Linux 7, 8, 9 et 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 et 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

Activez le module en ajoutant ce qui suit en haut de /etc/nginx/nginx.conf :

load_module modules/ngx_rtmp_module.so;

Ce document décrit nginx-module-rtmp v1.2.2 publié le 5 juillet 2025.


nginx-rtmp-module

Blog du projet

http://nginx-rtmp.blogspot.com

Manuel Wiki

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

Groupe Google

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

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

Fonctionnalités

  • Streaming en direct RTMP/HLS/MPEG-DASH

  • Vidéo à la demande RTMP FLV/MP4, jouée depuis le système de fichiers local ou HTTP

  • Support de relais de flux pour le streaming distribué : modèles push & pull

  • Enregistrement de flux dans plusieurs FLVs

  • Support H264/AAC

  • Transcodage en ligne avec FFmpeg

  • Appels HTTP (publier/jouer/enregistrer/mettre à jour, etc.)

  • Exécution de programmes externes sur certains événements (exec)

  • Module de contrôle HTTP pour l'enregistrement audio/vidéo et le rejet des clients

  • Techniques de mise en mémoire tampon avancées pour maintenir les allocations de mémoire à un niveau minimum pour un streaming plus rapide et une faible empreinte mémoire

  • Prouvé pour fonctionner avec Wirecast, FMS, Wowza, JWPlayer, FlowPlayer, StrobeMediaPlayback, ffmpeg, avconv, rtmpdump, flvstreamer et bien d'autres

  • Statistiques en XML/XSL sous forme lisible par machine et par humain

  • Linux/FreeBSD/MacOS/Windows

Limitations de Windows

Le support de Windows est limité. Ces fonctionnalités ne sont pas prises en charge :

  • execs
  • pulls statiques
  • auto_push

Format d'URL RTMP

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

app - doit correspondre à l'un des blocs application {} dans la configuration

name - interprété par chaque application peut être vide

Streaming en direct multi-travailleurs

Le module prend en charge le streaming en direct multi-travailleurs via le push automatique de flux vers les travailleurs nginx. Cette option est activée avec la directive rtmp_auto_push.

Exemple nginx.conf

rtmp {

    server {

        listen 1935;

        chunk_size 4000;

        # Mode TV : un éditeur, plusieurs abonnés
        application mytv {

            # activer le streaming en direct
            live on;

            # enregistrer les premiers 1K du flux
            record all;
            record_path /tmp/av;
            record_max_size 1K;

            # ajouter l'horodatage actuel à chaque flv
            record_unique on;

            # publier uniquement depuis localhost
            allow publish 127.0.0.1;
            deny publish all;

            #allow play all;
        }

        # Transcodage (ffmpeg nécessaire)
        application big {
            live on;

            # À chaque flux publié, exécutez cette commande (ffmpeg)
            # avec substitutions : $app/${app}, $name/${name} pour le nom de l'application et du flux.
            #
            # Cet appel ffmpeg reçoit le flux de cette application &
            # réduit la résolution à 32x32. Le flux est publié dans
            # l'application 'small' (voir ci-dessous) sous le même nom.
            #
            # ffmpeg peut faire n'importe quoi avec le flux comme le
            # transcodage vidéo/audio, le redimensionnement, la modification des paramètres de conteneur/codec, etc.
            #
            # Plusieurs lignes exec peuvent être spécifiées.

            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;
            # La vidéo avec une résolution réduite arrive ici depuis ffmpeg
        }

        application webcam {
            live on;

            # Flux depuis la webcam locale
            exec_static ffmpeg -f video4linux2 -i /dev/video0 -c:v libx264 -an
                               -f flv rtmp://localhost:1935/webcam/mystream;
        }

        application mypush {
            live on;

            # Chaque flux publié ici
            # est automatiquement poussé vers
            # ces deux machines
            push rtmp1.example.com;
            push rtmp2.example.com:1934;
        }

        application mypull {
            live on;

            # Tirer tous les flux depuis la machine distante
            # et jouer localement
            pull rtmp://rtmp3.example.com pageUrl=www.example.com/index.html;
        }

        application mystaticpull {
            live on;

            # Le pull statique est démarré au démarrage de nginx
            pull rtmp://rtmp4.example.com pageUrl=www.example.com/index.html name=mystream static;
        }

        # vidéo à la demande
        application vod {
            play /var/flvs;
        }

        application vod2 {
            play /var/mp4s;
        }

        # Plusieurs éditeurs, plusieurs abonnés
        # pas de vérifications, pas d'enregistrement
        application videochat {

            live on;

            # Les notifications suivantes reçoivent toutes
            # les variables de session ainsi que
            # les arguments d'appel particuliers dans la requête HTTP POST

            # Faire une requête HTTP & utiliser le code de retour HTTP
            # pour décider s'il faut autoriser la publication
            # depuis cette connexion ou non
            on_publish http://localhost:8080/publish;

            # Même chose pour jouer
            on_play http://localhost:8080/play;

            # Fin de publication/jouer (se répète lors de la déconnexion)
            on_done http://localhost:8080/done;

            # Toutes les notifications mentionnées ci-dessus reçoivent
            # les arguments standard connect() ainsi que
            # ceux de play/publish. Si des arguments sont envoyés
            # avec une syntaxe de style GET pour jouer & publier
            # ceux-ci sont également inclus.
            # Exemple d'URL :
            #   rtmp://localhost/myapp/mystream?a=b&c=d

            # enregistrer 10 images clés vidéo (pas de son) toutes les 2 minutes
            record keyframes;
            record_path /tmp/vc;
            record_max_frames 10;
            record_interval 2m;

            # Notification asynchrone d'un flv enregistré
            on_record_done http://localhost:8080/record_done;

        }

        # HLS

        # Pour que HLS fonctionne, veuillez créer un répertoire dans tmpfs (/tmp/hls ici)
        # pour les fragments. Le contenu du répertoire est servi via HTTP (voir
        # section http{} dans la configuration)
        #
        # Le flux entrant doit être en H264/AAC. Pour les iPhones, utilisez le profil H264
        # de base (voir l'exemple ffmpeg).
        # Cet exemple crée un flux RTMP à partir d'un film prêt pour HLS :
        #
        # ffmpeg -loglevel verbose -re -i movie.avi  -vcodec libx264
        #    -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1
        #    -f flv rtmp://localhost:1935/hls/movie
        #
        # Si vous devez transcoder un flux en direct, utilisez la fonctionnalité 'exec'.
        #
        application hls {
            live on;
            hls on;
            hls_path /tmp/hls;
        }

        # MPEG-DASH est similaire à HLS

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

# HTTP peut être utilisé pour accéder aux statistiques RTMP
http {

    server {

        listen      8080;

        # Cette URL fournit des statistiques RTMP en XML
        location /stat {
            rtmp_stat all;

            # Utilisez cette feuille de style pour afficher le XML sous forme de page web
            # dans le navigateur
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            # Feuille de style XML pour afficher les statistiques RTMP.
            # Copiez stat.xsl où vous le souhaitez
            # et mettez le chemin complet du répertoire ici
            root /path/to/stat.xsl/;
        }

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

        location /dash {
            # Servir les fragments DASH
            root /tmp;
            add_header Cache-Control no-cache;
        }
    }
}

Exemple de streaming multi-travailleurs

rtmp_auto_push on;

rtmp {
    server {
        listen 1935;

        application mytv {
            live on;
        }
    }
}

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-rtmp.