flv: Медиа-сервер для потокового вещания на основе nginx-module-rtmp
Установка Debian/Ubuntu
Эти документы применимы к пакету APT nginx-module-flv, предоставляемому репозиторием GetPageSpeed Extras.
- Настройте репозиторий APT, как описано в настроить репозиторий APT.
- Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-flv
Показать дистрибутивы и архитектуры
| Дистрибутив | Версия | Компонент | Архитектуры |
|-------------|-------------------|-------------|-----------------|
| debian | bookworm | main | amd64, arm64 |
| debian | bookworm-mainline | main | amd64, arm64 |
| debian | trixie | main | amd64, arm64 |
| debian | trixie-mainline | main | amd64, arm64 |
| ubuntu | focal | main | amd64, arm64 |
| ubuntu | focal-mainline | main | amd64, arm64 |
| ubuntu | jammy | main | amd64, arm64 |
| ubuntu | jammy-mainline | main | amd64, arm64 |
| ubuntu | noble | main | amd64, arm64 |
| ubuntu | noble-mainline | main | amd64, arm64 |
Медиа-сервер для потокового вещания на основе 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 и ответ chunks |
| Кэш 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,
#нижеуказанная команда ДОЛЖНА быть указана и ДОЛЖНА быть
#расположена перед директивой 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 для сокращения времени ожидания первого кадра видео
}
}
}
