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.
Un serveur de streaming multimédia basé sur nginx-rtmp-module.
中文说明.
Faites un don si vous aimez ce module. Un grand merci à vous !
Caractéristiques
-
Toutes les fonctionnalités fournies par nginx-rtmp-module.
-
Autres fonctionnalités fournies par nginx-http-flv-module par rapport à nginx-rtmp-module :
| 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
-
Le lecteur Flash ne sera plus officiellement supporté par Adobe après le 31 décembre 2020, veuillez vous référer à la page d'information générale sur la fin de vie d'Adobe Flash Player pour plus de détails. Les plugins utilisant le lecteur Flash ne fonctionneront plus après que les principaux navigateurs auront supprimé le lecteur Flash.
-
flv.js ne peut fonctionner qu'avec des navigateurs qui supportent Media Source Extensions.
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.
-
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)

HTTP-FLV (flv.js)

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.
