Aller au contenu

flv: Serveur de streaming multimédia basé sur nginx-module-rtmp

Installation

Vous pouvez installer ce module dans toute 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-flv
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-flv

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

load_module modules/ngx_http_flv_live_module.so;

Ce document décrit nginx-module-flv v1.2.13 publié le 23 février 2026.


nginx-http-flv-module workflow

Un serveur de streaming multimédia basé sur nginx-rtmp-module.

中文说明.

Faites un don si vous aimez ce module. Un grand merci à vous !

PayPal

Caractéristiques

Caractéristiques nginx-http-flv-module nginx-rtmp-module Remarques
HTTP-FLV (pour lecture) x HTTPS-FLV et réponse en morceaux supportés
Cache GOP x
Hôte virtuel x
Omettre la directive listen Voir remarques Il DOIT y avoir au moins une directive listen
Support audio uniquement pour RTMP/HTTP-FLV Voir remarques Ne fonctionnera pas si wait_video ou wait_key est activé
Support mono-piste pour HLS x
Support reuseport x
Minuteur pour le journal d'accès x
Statistiques au format JSON x
Statistiques pour les enregistrements x
Indépendant de l'endianness Voir remarques Partiellement supporté dans la branche big-endian

Systèmes supportés

  • Linux (recommandé) / FreeBSD / MacOS / Windows (limité).

Lecteurs supportés

Remarque

Prérequis

  • GNU make pour activer le compilateur sur les systèmes de type Unix pour compiler des logiciels.

  • GCC pour la compilation sur les systèmes de type Unix ou MSVC pour la compilation sur Windows.

  • GDB pour le débogage sur les systèmes de type Unix.

  • FFmpeg ou OBS pour publier des flux multimédias.

  • VLC (recommandé) ou flv.js (recommandé) pour lire des flux multimédias.

  • PCRE pour NGINX si des expressions régulières sont nécessaires.

  • OpenSSL pour NGINX si un accès crypté est nécessaire.

  • zlib pour NGINX si une compression est nécessaire.

Utilisation

Pour des détails sur l'utilisation de nginx-rtmp-module, veuillez vous référer à README.md.

Publier

Pour simplifier, le transcodage n'est pas utilisé (donc -c copy est utilisé) :

ffmpeg -re -i MEDIA_FILE_NAME -c copy -f flv rtmp://example.com[:port]/appname/streamname

Remarque

Certaines versions anciennes de FFmpeg ne supportent pas l'option -c copy, les options -vcodec copy -acodec copy peuvent être utilisées à la place.

Le appname est utilisé pour faire correspondre un bloc d'application dans le bloc rtmp (voir ci-dessous pour plus de détails).

Le streamname peut être spécifié à volonté mais NE PEUT PAS être omis.

Le port par défaut pour RTMP est 1935, si d'autres ports sont utilisés, :port doit être spécifié.

Lire

via HTTP-FLV

http://example.com[:port]/dir?[port=xxx&]app=appname&stream=streamname

Remarque

  • Si ffplay est utilisé en ligne de commande pour lire le flux, l'url ci-dessus DOIT être entourée de guillemets, sinon les arguments dans l'url seront rejetés (certains shells pas si intelligents interpréteront "&" comme "exécuter en arrière-plan").

  • Si flv.js est utilisé pour lire le flux, assurez-vous que le flux publié est correctement encodé, car flv.js supporte UNIQUEMENT la vidéo encodée en H.264 et l'audio encodé en AAC/MP3.

Le dir est utilisé pour faire correspondre des blocs de localisation dans le bloc http (voir ci-dessous pour plus de détails).

Le port par défaut pour HTTP est 80, si d'autres ports sont utilisés, :port doit être spécifié.

Le port par défaut pour RTMP est 1935, si d'autres ports sont utilisés, port=xxx doit être spécifié.

La valeur de app (appname) est utilisée pour faire correspondre un bloc d'application, mais si le app demandé apparaît dans plusieurs blocs de serveur et que ces blocs ont la même configuration d'adresse et de port, le nom d'hôte correspondant à la directive server_name sera utilisé pour identifier le bloc d'application demandé, sinon le premier est apparié.

La valeur de stream (streamname) est utilisée pour faire correspondre le nom du flux publié.

Exemple

Supposons que la directive listen spécifiée dans le bloc http soit :

http {
    ...
    server {
        listen 8080; #pas le port par défaut 80
        ...

        location /live {
            flv_live on;
        }
    }
}

Et la directive listen spécifiée dans le bloc rtmp soit :

rtmp {
    ...
    server {
        listen 1985; #pas le port par défaut 1935
        ...

        application myapp {
            live on;
        }
    }
}

Et le nom du flux publié est mystream, alors l'url de lecture basée sur HTTP est :

http://example.com:8080/live?port=1985&app=myapp&stream=mystream

Remarque

Puisque certains lecteurs ne supportent pas la transmission HTTP en morceaux, il est préférable de spécifier chunked_transfer_encoding off; dans la localisation où flv_live on; est spécifié dans ce cas, sinon la lecture échouera.

via RTMP

rtmp://example.com[:port]/appname/streamname

via HLS

http://example.com[:port]/dir/streamname.m3u8

via DASH

http://example.com[:port]/dir/streamname.mpd

Images d'exemple

RTMP (JW Player) & HTTP-FLV (VLC)

RTMP & HTTP-FLV

HTTP-FLV (flv.js)

HTTP-FLV

Exemple de nginx.conf

Remarque

Les directives rtmp_auto_push, rtmp_auto_push_reconnect et rtmp_socket_dir ne fonctionneront pas sur Windows sauf sur Windows 10 17063 et les versions ultérieures, car relay en mode multi-processus nécessite l'aide de sockets de domaine Unix, veuillez vous référer à Unix domain socket on Windows 10 pour plus de détails.

Il est préférable de spécifier la directive worker_processes à 1, car ngx_rtmp_stat_module peut ne pas obtenir de statistiques d'un processus de travail spécifié en mode multi-processus, car les requêtes HTTP sont réparties aléatoirement entre les processus de travail. ngx_rtmp_control_module a le même problème. Le problème peut être optimisé par ce patch per-worker-listener.

De plus, la fonctionnalité vhost est correcte en mode à processus unique mais pas encore parfaite en mode multi-processus, en attente d'être corrigée. Par exemple, la configuration suivante est correcte en mode multi-processus :

rtmp {
    ...
    server {
        listen 1935;
        server_name domain_name;

        application myapp {
            ...
        }
    }
}

Tandis que la configuration suivante ne fonctionne pas correctement pour les demandes de lecture destinées au deuxième server (que le port soit 1935 ou non) des processus de travail non éditeurs :

rtmp {
    ...
    server {
        listen 1935;
        server_name 1st_domain_name;

        application myapp {
            ...
        }
    }

    server {
        listen 1945;
        server_name 2nd_domain_name;

        application myapp {
            ...
        }
    }
}

Si NGINX fonctionne en mode multi-processus et que l'option de socket SO_REUSEPORT est supportée par la plateforme, ajouter l'option reuseport pour la directive listen résoudra le problème de l'herd tonitruant.

rtmp {
    ...

    server {
        listen 1935 reuseport;
        ...
    }
}

Exemple de configuration

worker_processes  1; #devrait être 1 pour Windows, car il ne supporte pas les sockets de domaine Unix
#worker_processes  auto; #à partir des versions 1.3.8 et 1.2.5

#worker_cpu_affinity  0001 0010 0100 1000; #disponible uniquement sur FreeBSD et Linux
#worker_cpu_affinity  auto; #à partir de la version 1.9.10

error_log logs/error.log error;

#si le module est compilé en tant que module dynamique et que des fonctionnalités pertinentes
#pour RTMP sont nécessaires, la commande ci-dessous DOIT être spécifiée et DOIT être
#située avant la directive events, sinon le module ne sera pas chargé
#ou sera chargé sans succès lorsque NGINX est démarré

#load_module modules/ngx_http_flv_live_module.so;

events {
    worker_connections  4096;
}

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

    keepalive_timeout  65;

    server {
        listen       80;

        location / {
            root   /var/www;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location /live {
            flv_live on; #ouvrir le streaming en direct flv (s'abonner)
            chunked_transfer_encoding  on; #ouvrir la réponse 'Transfer-Encoding: chunked'

            add_header 'Access-Control-Allow-Origin' '*'; #ajouter un en-tête HTTP supplémentaire
            add_header 'Access-Control-Allow-Credentials' 'true'; #ajouter un en-tête HTTP supplémentaire
        }

        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }

            root /tmp;
            add_header 'Cache-Control' 'no-cache';
        }

        location /dash {
            root /tmp;
            add_header 'Cache-Control' 'no-cache';
        }

        location /stat {
            #configuration des statistiques de streaming et d'enregistrement

            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            root /var/www/rtmp; #spécifier où se trouve stat.xsl
        }

        #si des statistiques au format JSON sont nécessaires, pas besoin de spécifier
        #stat.xsl mais une nouvelle directive rtmp_stat_format

        #location /stat {
        #    rtmp_stat all;
        #    rtmp_stat_format json;
        #}

        location /control {
            rtmp_control all; #configuration du module de contrôle de rtmp
        }
    }
}

rtmp_auto_push on;
rtmp_auto_push_reconnect 1s;
rtmp_socket_dir /tmp;

rtmp {
    out_queue           4096;
    out_cork            8;
    max_streams         128;
    timeout             15s;
    drop_idle_publisher 15s;

    log_interval 5s; #intervalle utilisé par le module de journalisation pour enregistrer dans access.log, très utile pour le débogage
    log_size     1m; #taille du tampon utilisée par le module de journalisation pour enregistrer dans access.log

    server {
        listen 1935;
        server_name www.test.*; #pour le correspondance par suffixe de nom d'hôte virtuel

        application myapp {
            live on;
            gop_cache on; #ouvrir le cache GOP pour réduire le temps d'attente pour la première image de la vidéo
        }

        application hls {
            live on;
            hls on;
            hls_path /tmp/hls;
        }

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

    server {
        listen 1935;
        server_name *.test.com; #pour le correspondance par préfixe de nom d'hôte virtuel

        application myapp {
            live on;
            gop_cache on; #ouvrir le cache GOP pour réduire le temps d'attente pour la première image de la vidéo
        }
    }

    server {
        listen 1935;
        server_name www.test.com; #pour le correspondance complète de nom d'hôte virtuel

        application myapp {
            live on;
            gop_cache on; #ouvrir le cache GOP pour réduire le temps d'attente pour la première image de la vidéo
        }
    }
}

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