flv: Medien-Streaming-Server basierend auf nginx-module-rtmp
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-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
Aktivieren Sie das Modul, indem Sie Folgendes an den Anfang von /etc/nginx/nginx.conf hinzufügen:
load_module modules/ngx_http_flv_live_module.so;
Dieses Dokument beschreibt nginx-module-flv v1.2.13, veröffentlicht am 23. Februar 2026.
Ein Medien-Streaming-Server basierend auf nginx-rtmp-module.
中文说明.
Spenden Sie, wenn Ihnen dieses Modul gefällt. Vielen Dank!
Funktionen
-
Alle Funktionen, die das nginx-rtmp-module bietet.
-
Weitere Funktionen, die vom nginx-http-flv-module im Vergleich zum nginx-rtmp-module bereitgestellt werden:
| Funktionen | nginx-http-flv-module | nginx-rtmp-module | Anmerkungen |
|---|---|---|---|
| HTTP-FLV (zum Abspielen) | √ | x | HTTPS-FLV und chunked response unterstützt |
| GOP-Cache | √ | x | |
| Virtueller Host | √ | x | |
listen-Direktive weglassen |
√ | Siehe Anmerkungen | Es MUSS mindestens eine listen-Direktive geben |
| Audio-Only-Unterstützung für RTMP/HTTP-FLV | √ | Siehe Anmerkungen | Funktioniert nicht, wenn wait_video oder wait_key aktiviert ist |
| Unterstützung für Einzelspur-HLS | √ | x | |
reuseport-Unterstützung |
√ | x | |
| Timer für Zugriffsprotokoll | √ | x | |
| JSON-Style-Statistiken | √ | x | |
| Statistiken für Aufnahmen | √ | x | |
| Unabhängig von Endianness | √ | Siehe Anmerkungen | Teilweise unterstützt im Branch big-endian |
Unterstützte Systeme
- Linux (empfohlen) / FreeBSD / MacOS / Windows (eingeschränkt).
Unterstützte Player
Hinweis
-
Der Flash Player wird nach dem 31. Dezember 2020 von Adobe nicht mehr offiziell unterstützt. Weitere Informationen finden Sie auf der Adobe Flash Player EOL Allgemeine Informationsseite. Plugins, die den Flash Player verwenden, funktionieren nicht mehr, nachdem die gängigen Browser den Flash Player entfernt haben.
-
flv.js kann nur mit Browsern ausgeführt werden, die Media Source Extensions unterstützen.
Voraussetzungen
-
GNU make zur Aktivierung des Compilers auf Unix-ähnlichen Systemen zur Kompilierung von Software.
-
GCC für die Kompilierung auf Unix-ähnlichen Systemen oder MSVC für die Kompilierung unter Windows.
-
GDB für Debugging auf Unix-ähnlichen Systemen.
-
VLC (empfohlen) oder flv.js (empfohlen) zum Abspielen von Medienstreams.
-
PCRE für NGINX, wenn reguläre Ausdrücke benötigt werden.
-
OpenSSL für NGINX, wenn verschlüsselter Zugriff benötigt wird.
-
zlib für NGINX, wenn Kompression benötigt wird.
Verwendung
Für Details zur Verwendung des nginx-rtmp-module siehe README.md.
Veröffentlichen
Zur Vereinfachung wird kein Transcoding verwendet (daher wird -c copy verwendet):
ffmpeg -re -i MEDIA_FILE_NAME -c copy -f flv rtmp://example.com[:port]/appname/streamname
Hinweis
Einige ältere Versionen von FFmpeg unterstützen die Option -c copy nicht, die Optionen -vcodec copy -acodec copy können stattdessen verwendet werden.
Der appname wird verwendet, um einen Anwendungsblock im RTMP-Block abzugleichen (siehe unten für Details).
Der streamname kann nach Belieben angegeben werden, darf jedoch NICHT weggelassen werden.
Der Standardport für RTMP ist 1935. Wenn andere Ports verwendet werden, muss :port angegeben werden.
Abspielen
über HTTP-FLV
http://example.com[:port]/dir?[port=xxx&]app=appname&stream=streamname
Hinweis
-
Wenn ffplay in der Befehlszeile verwendet wird, um den Stream abzuspielen, muss die obige URL in Anführungszeichen gesetzt werden, da sonst die Argumente in der URL verworfen werden (einige Shells sind nicht so intelligent und interpretieren "&" als "im Hintergrund ausführen").
-
Wenn flv.js verwendet wird, um den Stream abzuspielen, stellen Sie sicher, dass der veröffentlichte Stream ordnungsgemäß kodiert ist, da flv.js NUR H.264-kodiertes Video und AAC/MP3-kodierten Audio unterstützt.
Der dir wird verwendet, um Standortblöcke im HTTP-Block abzugleichen (siehe unten für Details).
Der Standardport für HTTP ist 80. Wenn andere Ports verwendet werden, muss :port angegeben werden.
Der Standardport für RTMP ist 1935. Wenn andere Ports verwendet werden, muss port=xxx angegeben werden.
Der Wert von app (appname) wird verwendet, um einen Anwendungsblock abzugleichen. Wenn die angeforderte app jedoch in mehreren Serverblöcken erscheint und diese Blöcke die gleiche Adress- und Portkonfiguration haben, wird der Hostname, der mit der server_name-Direktive übereinstimmt, zusätzlich verwendet, um den angeforderten Anwendungsblock zu identifizieren. Andernfalls wird der erste abgeglichen.
Der Wert von stream (streamname) wird verwendet, um den Namen des veröffentlichten Streams abzugleichen.
Beispiel
Angenommen, die listen-Direktive, die im http-Block angegeben ist, lautet:
http {
...
server {
listen 8080; #nicht Standardport 80
...
location /live {
flv_live on;
}
}
}
Und die listen-Direktive, die im rtmp-Block angegeben ist, lautet:
rtmp {
...
server {
listen 1985; #nicht Standardport 1935
...
application myapp {
live on;
}
}
}
Und der Name des veröffentlichten Streams ist mystream, dann lautet die URL für die Wiedergabe basierend auf HTTP:
http://example.com:8080/live?port=1985&app=myapp&stream=mystream
Hinweis
Da einige Player die HTTP-chunked Übertragung nicht unterstützen, ist es besser, chunked_transfer_encoding off; an dem Ort anzugeben, an dem flv_live on; angegeben ist, da es sonst zu einem Abspielfehler kommt.
über RTMP
rtmp://example.com[:port]/appname/streamname
über HLS
http://example.com[:port]/dir/streamname.m3u8
über DASH
http://example.com[:port]/dir/streamname.mpd
Beispielbilder
RTMP (JW Player) & HTTP-FLV (VLC)

HTTP-FLV (flv.js)

Beispiel nginx.conf
Hinweis
Die Direktiven rtmp_auto_push, rtmp_auto_push_reconnect und rtmp_socket_dir funktionieren unter Windows nicht, außer unter Windows 10 17063 und neueren Versionen, da relay im Mehrprozessmodus die Hilfe von Unix-Domain-Sockets benötigt. Weitere Informationen finden Sie unter Unix-Domain-Socket unter Windows 10.
Es ist besser, die Direktive worker_processes auf 1 zu setzen, da ngx_rtmp_stat_module möglicherweise keine Statistiken von einem bestimmten Arbeitsprozess im Mehrprozessmodus erhält, da HTTP-Anfragen zufällig auf die Arbeitsprozesse verteilt werden. ngx_rtmp_control_module hat dasselbe Problem. Das Problem kann durch diesen Patch per-worker-listener optimiert werden.
Darüber hinaus ist die vhost-Funktion im Einzelprozessmodus in Ordnung, aber im Mehrprozessmodus noch nicht perfekt und wartet auf eine Behebung. Zum Beispiel ist die folgende Konfiguration im Mehrprozessmodus in Ordnung:
rtmp {
...
server {
listen 1935;
server_name domain_name;
application myapp {
...
}
}
}
Während die folgende Konfiguration nicht ordnungsgemäß für Abspielanfragen funktioniert, die an den zweiten server (unabhängig davon, ob der Port 1935 ist oder nicht) von Nicht-Veröffentlichungs-Arbeitsprozessen gerichtet sind:
rtmp {
...
server {
listen 1935;
server_name 1st_domain_name;
application myapp {
...
}
}
server {
listen 1945;
server_name 2nd_domain_name;
application myapp {
...
}
}
}
Wenn NGINX im Mehrprozessmodus ausgeführt wird und die Socket-Option SO_REUSEPORT von der Plattform unterstützt wird, wird das Hinzufügen der Option reuseport zur Direktive listen das Thundering Herd-Problem lösen.
rtmp {
...
server {
listen 1935 reuseport;
...
}
}
Beispielkonfiguration
worker_processes 1; #sollte 1 für Windows sein, da es Unix-Domain-Sockets nicht unterstützt
#worker_processes auto; #ab Version 1.3.8 und 1.2.5
#worker_cpu_affinity 0001 0010 0100 1000; #nur verfügbar auf FreeBSD und Linux
#worker_cpu_affinity auto; #ab Version 1.9.10
error_log logs/error.log error;
#wenn das Modul als dynamisches Modul kompiliert ist und Funktionen relevant
#für RTMP benötigt werden, muss der folgende Befehl angegeben werden und
#muss vor der Ereignis-Direktive stehen, andernfalls wird das Modul nicht geladen
#oder wird beim Start von NGINX nicht erfolgreich geladen
#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; #flv Live-Streaming aktivieren (abonnieren)
chunked_transfer_encoding on; # 'Transfer-Encoding: chunked' Antwort aktivieren
add_header 'Access-Control-Allow-Origin' '*'; #zusätzlichen HTTP-Header hinzufügen
add_header 'Access-Control-Allow-Credentials' 'true'; #zusätzlichen HTTP-Header hinzufügen
}
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 {
#Konfiguration von Streaming- & Aufnahme-Statistiken
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /var/www/rtmp; #angeben, wo stat.xsl sich befindet
}
#wenn JSON-Style-Stat benötigt wird, muss stat.xsl nicht angegeben werden,
#sondern eine neue Direktive rtmp_stat_format
#location /stat {
# rtmp_stat all;
# rtmp_stat_format json;
#}
location /control {
rtmp_control all; #Konfiguration des Steuerungsmoduls von 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; #Intervall, das vom Protokollmodul verwendet wird, um in access.log zu protokollieren, sehr nützlich für Debugging
log_size 1m; #Pufferspeichergröße, die vom Protokollmodul verwendet wird, um in access.log zu protokollieren
server {
listen 1935;
server_name www.test.*; #für Suffix-Wildcard-Abgleich des virtuellen Hostnamens
application myapp {
live on;
gop_cache on; #GOP-Cache aktivieren, um die Wartezeit für das erste Bild des Videos zu reduzieren
}
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; #für Prefix-Wildcard-Abgleich des virtuellen Hostnamens
application myapp {
live on;
gop_cache on; #GOP-Cache aktivieren, um die Wartezeit für das erste Bild des Videos zu reduzieren
}
}
server {
listen 1935;
server_name www.test.com; #für vollständigen Abgleich des virtuellen Hostnamens
application myapp {
live on;
gop_cache on; #GOP-Cache aktivieren, um die Wartezeit für das erste Bild des Videos zu reduzieren
}
}
}
GitHub
Sie finden zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-flv.
