flv: Медиа-сервер для потоковой передачи на основе nginx-module-rtmp
Установка
Вы можете установить этот модуль в любом дистрибутиве на базе RHEL, включая, но не ограничиваясь:
- RedHat Enterprise Linux 7, 8, 9 и 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 и 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
Включите модуль, добавив следующее в верхнюю часть /etc/nginx/nginx.conf:
load_module modules/ngx_http_flv_live_module.so;
Этот документ описывает nginx-module-flv v1.2.13, выпущенный 23 февраля 2026 года.
Медиа-сервер для потоковой передачи на основе nginx-rtmp-module.
中文说明.
Пожертвуйте, если вам нравится этот модуль. Большое спасибо вам!
Особенности
-
Все функции, предоставляемые nginx-rtmp-module.
-
Другие функции, предоставляемые nginx-http-flv-module по сравнению с nginx-rtmp-module:
| Особенности | nginx-http-flv-module | nginx-rtmp-module | Примечания |
|---|---|---|---|
| HTTP-FLV (для воспроизведения) | √ | x | Поддерживаются HTTPS-FLV и ответ с чанками |
| Кэш GOP | √ | x | |
| Виртуальный хост | √ | x | |
Пропустить директиву listen |
√ | См. примечания | Должна быть хотя бы одна директива listen |
| Поддержка только аудио для RTMP/HTTP-FLV | √ | См. примечания | Не будет работать, если включены wait_video или wait_key |
| Поддержка однотрекового HLS | √ | x | |
Поддержка reuseport |
√ | x | |
| Таймер для журнала доступа | √ | x | |
| Статистика в формате JSON | √ | x | |
| Статистика для записей | √ | x | |
| Независимость от порядка байтов | √ | См. примечания | Частично поддерживается в ветке big-endian |
Поддерживаемые системы
- Linux (рекомендуется) / FreeBSD / MacOS / Windows (ограниченно).
Поддерживаемые плееры
Примечание
-
Flash player больше не будет официально поддерживаться Adobe после 31 декабря 2020 года, смотрите Общую информацию о завершении поддержки Adobe Flash Player для получения подробной информации. Плагины, использующие Flash player, не будут работать после того, как основные браузеры удалят Flash player.
-
flv.js может работать только с браузерами, поддерживающими Media Source Extensions.
Предварительные требования
-
GNU make для активации компилятора в системах, подобных Unix, для компиляции программного обеспечения.
-
GCC для компиляции в системах, подобных Unix, или MSVC для компиляции в Windows.
-
GDB для отладки в системах, подобных Unix.
-
VLC (рекомендуется) или flv.js (рекомендуется) для воспроизведения медиа-потоков.
-
PCRE для NGINX, если нужны регулярные выражения.
-
OpenSSL для NGINX, если нужен защищенный доступ.
-
zlib для NGINX, если требуется сжатие.
Использование
Для получения подробной информации о использовании nginx-rtmp-module смотрите README.md.
Публикация
Для простоты не используется транскодирование (поэтому используется -c copy):
ffmpeg -re -i MEDIA_FILE_NAME -c copy -f flv rtmp://example.com[:port]/appname/streamname
Примечание
Некоторые устаревшие версии FFmpeg не поддерживают опцию -c copy, вместо этого можно использовать опции -vcodec copy -acodec copy.
appname используется для соответствия блоку приложения в блоке rtmp (подробности см. ниже).
streamname можно указывать по желанию, но его НЕЛЬЗЯ опускать.
Порт по умолчанию для RTMP — 1935, если используются другие порты, необходимо указать :port.
Воспроизведение
через HTTP-FLV
http://example.com[:port]/dir?[port=xxx&]app=appname&stream=streamname
Примечание
-
Если ffplay используется в командной строке для воспроизведения потока, URL выше ДОЛЖЕН быть заключен в кавычки, иначе аргументы в URL будут отброшены (некоторые оболочки не так умны и интерпретируют "&" как "выполнить в фоновом режиме").
-
Если flv.js используется для воспроизведения потока, убедитесь, что опубликованный поток закодирован правильно, так как flv.js поддерживает ТОЛЬКО видео, закодированное в H.264, и аудио, закодированное в AAC/MP3.
dir используется для соответствия блокам местоположения в http блоке (подробности см. ниже).
Порт по умолчанию для HTTP — 80, если используются другие порты, необходимо указать :port.
Порт по умолчанию для RTMP — 1935, если используются другие порты, необходимо указать port=xxx.
Значение app (appname) используется для соответствия блоку приложения, но если запрашиваемый app появляется в нескольких блоках сервера и эти блоки имеют одинаковую конфигурацию адреса и порта, будет дополнительно использоваться имя хоста, соответствующее директиве server_name, для идентификации запрашиваемого блока приложения, в противном случае будет соответствовать первому.
Значение stream (streamname) используется для соответствия имени опубликованного потока.
Пример
Предположим, что директива listen, указанная в блоке http, выглядит следующим образом:
http {
...
server {
listen 8080; #не порт по умолчанию 80
...
location /live {
flv_live on;
}
}
}
А директива listen, указанная в блоке rtmp, выглядит следующим образом:
rtmp {
...
server {
listen 1985; #не порт по умолчанию 1935
...
application myapp {
live on;
}
}
}
И имя опубликованного потока — mystream, тогда URL для воспроизведения на основе HTTP будет:
http://example.com:8080/live?port=1985&app=myapp&stream=mystream
Примечание
Поскольку некоторые плееры не поддерживают HTTP-чанковую передачу, лучше указать chunked_transfer_encoding off; в местоположении, где указано flv_live on;, в противном случае воспроизведение не удастся.
через RTMP
rtmp://example.com[:port]/appname/streamname
через HLS
http://example.com[:port]/dir/streamname.m3u8
через DASH
http://example.com[:port]/dir/streamname.mpd
Примеры изображений
RTMP (JW Player) & HTTP-FLV (VLC)

HTTP-FLV (flv.js)

Пример nginx.conf
Примечание
Директивы rtmp_auto_push, rtmp_auto_push_reconnect и rtmp_socket_dir не будут работать в Windows, за исключением Windows 10 17063 и более поздних версий, потому что relay в режиме нескольких процессов требует помощи Unix-доменных сокетов, смотрите Unix-доменные сокеты в Windows 10 для получения подробной информации.
Лучше указать директиву worker_processes как 1, потому что ngx_rtmp_stat_module может не получать статистику от указанного рабочего процесса в режиме многопроцессорности, так как HTTP-запросы случайным образом распределяются между рабочими процессами. У ngx_rtmp_control_module та же проблема. Проблему можно оптимизировать с помощью этого патча per-worker-listener.
Кроме того, функция vhost работает нормально в режиме одного процесса, но еще не идеальна в режиме многопроцессорности, ожидая исправления. Например, следующая конфигурация работает нормально в режиме многопроцессорности:
rtmp {
...
server {
listen 1935;
server_name domain_name;
application myapp {
...
}
}
}
В то время как следующая конфигурация не работает должным образом для запросов воспроизведения, направленных на второй server (независимо от того, порт 1935 или нет) рабочих процессов, не являющихся издателями:
rtmp {
...
server {
listen 1935;
server_name 1st_domain_name;
application myapp {
...
}
}
server {
listen 1945;
server_name 2nd_domain_name;
application myapp {
...
}
}
}
Если NGINX работает в режиме многопроцессорности и опция сокета SO_REUSEPORT поддерживается платформой, добавление опции reuseport для директивы listen решит проблему громкого стада.
rtmp {
...
server {
listen 1935 reuseport;
...
}
}
Пример конфигурации
worker_processes 1; #должен быть 1 для Windows, так как он не поддерживает Unix-доменные сокеты
#worker_processes auto; #с версии 1.3.8 и 1.2.5
#worker_cpu_affinity 0001 0010 0100 1000; #доступно только на FreeBSD и Linux
#worker_cpu_affinity auto; #с версии 1.9.10
error_log logs/error.log error;
#если модуль скомпилирован как динамический модуль и нужны функции, относящиеся
#к RTMP, следующая команда ДОЛЖНА быть указана и ДОЛЖНА
#находиться перед директивой событий, иначе модуль не будет загружен
#или будет загружен неуспешно при запуске NGINX
#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 в прямом эфире (подписка)
chunked_transfer_encoding on; #включить ответ с 'Transfer-Encoding: chunked'
add_header 'Access-Control-Allow-Origin' '*'; #добавить дополнительный HTTP-заголовок
add_header 'Access-Control-Allow-Credentials' 'true'; #добавить дополнительный HTTP-заголовок
}
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 {
#конфигурация статистики потоковой передачи и записи
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /var/www/rtmp; #указать, где находится stat.xsl
}
#если нужна статистика в формате JSON, не нужно указывать
#stat.xsl, а только новую директиву rtmp_stat_format
#location /stat {
# rtmp_stat all;
# rtmp_stat_format json;
#}
location /control {
rtmp_control all; #конфигурация модуля управления 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; #интервал, используемый модулем журнала для записи в access.log, очень полезно для отладки
log_size 1m; #размер буфера, используемого модулем журнала для записи в access.log
server {
listen 1935;
server_name www.test.*; #для сопоставления суффикса с именем виртуального хоста
application myapp {
live on;
gop_cache on; #включить кэш GOP для уменьшения времени ожидания первого кадра видео
}
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; #для сопоставления префикса с именем виртуального хоста
application myapp {
live on;
gop_cache on; #включить кэш GOP для уменьшения времени ожидания первого кадра видео
}
}
server {
listen 1935;
server_name www.test.com; #для полного совпадения с именем виртуального хоста
application myapp {
live on;
gop_cache on; #включить кэш GOP для уменьшения времени ожидания первого кадра видео
}
}
}
GitHub
Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-flv.
