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.12, выпущенный 31 декабря 2024 года.
Медиа-сервер для потоковой передачи на основе 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 EOL General Information Page для получения подробной информации. Плагины, использующие 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 domain socket on 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, следующая команда ДОЛЖНА быть указана и ДОЛЖНА находиться
#перед директивой events, иначе модуль не будет загружен
#или будет загружен неуспешно при запуске 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.
