rtmp: Модуль RTMP для NGINX
Установка
Вы можете установить этот модуль в любой дистрибутив, основанный на 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-rtmp
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-rtmp
Включите модуль, добавив следующее в верхнюю часть файла /etc/nginx/nginx.conf:
load_module modules/ngx_rtmp_module.so;
Этот документ описывает nginx-module-rtmp v1.2.2, выпущенный 5 июля 2025 года.
nginx-rtmp-module
Блог проекта
http://nginx-rtmp.blogspot.com
Руководство вики
https://github.com/arut/nginx-rtmp-module/wiki/Directives
Группа Google
https://groups.google.com/group/nginx-rtmp
https://groups.google.com/group/nginx-rtmp-ru (Русский)
Возможности
-
RTMP/HLS/MPEG-DASH потоковое вещание
-
RTMP Видео по запросу FLV/MP4, воспроизведение из локальной файловой системы или HTTP
-
Поддержка реле потоков для распределенного вещания: модели push и pull
-
Запись потоков в несколько FLV
-
Поддержка H264/AAC
-
Онлайн транскодирование с помощью FFmpeg
-
HTTP обратные вызовы (публикация/воспроизведение/запись/обновление и т.д.)
-
Запуск внешних программ при определенных событиях (exec)
-
HTTP модуль управления для записи аудио/видео и отключения клиентов
-
Продвинутые техники буферизации для минимизации выделения памяти для более быстрого вещания и низкого потребления памяти
-
Доказано, что работает с Wirecast, FMS, Wowza, JWPlayer, FlowPlayer, StrobeMediaPlayback, ffmpeg, avconv, rtmpdump, flvstreamer и многими другими
-
Статистика в XML/XSL в машинно- и человеко- читаемом формате
-
Linux/FreeBSD/MacOS/Windows
Ограничения Windows
Поддержка Windows ограничена. Эти функции не поддерживаются:
- execs
- статические pulls
- auto_push
Формат RTMP URL
rtmp://rtmp.example.com/app[/name]
app - должен соответствовать одному из блоков application {} в конфигурации
name - интерпретируется каждой приложением может быть пустым
Многопоточное потоковое вещание
Модуль поддерживает многопоточное потоковое вещание через автоматическую передачу потоков на рабочие процессы nginx. Эта опция включается с помощью директивы rtmp_auto_push.
Пример nginx.conf
rtmp {
server {
listen 1935;
chunk_size 4000;
# Режим ТВ: один издатель, много подписчиков
application mytv {
# включить потоковое вещание
live on;
# записать первые 1K потока
record all;
record_path /tmp/av;
record_max_size 1K;
# добавить текущую метку времени к каждому flv
record_unique on;
# публиковать только с localhost
allow publish 127.0.0.1;
deny publish all;
#allow play all;
}
# Транскодирование (нужен ffmpeg)
application big {
live on;
# При каждом опубликованном потоке выполните эту команду (ffmpeg)
# с подстановками: $app/${app}, $name/${name} для имени приложения и потока.
#
# Этот вызов ffmpeg получает поток из этого приложения &
# уменьшает разрешение до 32x32. Поток публикуется в
# 'small' приложение (см. ниже) под тем же именем.
#
# ffmpeg может делать все что угодно с потоком, например, видео/аудио
# транскодирование, изменение размера, изменение параметров контейнера/кодека и т.д.
#
# Можно указать несколько строк exec.
exec ffmpeg -re -i rtmp://localhost:1935/$app/$name -vcodec flv -acodec copy -s 32x32
-f flv rtmp://localhost:1935/small/${name};
}
application small {
live on;
# Видео с уменьшенным разрешением приходит сюда от ffmpeg
}
application webcam {
live on;
# Поток с локальной веб-камеры
exec_static ffmpeg -f video4linux2 -i /dev/video0 -c:v libx264 -an
-f flv rtmp://localhost:1935/webcam/mystream;
}
application mypush {
live on;
# Каждый поток, опубликованный здесь
# автоматически передается на
# эти две машины
push rtmp1.example.com;
push rtmp2.example.com:1934;
}
application mypull {
live on;
# Получить все потоки с удаленной машины
# и воспроизвести локально
pull rtmp://rtmp3.example.com pageUrl=www.example.com/index.html;
}
application mystaticpull {
live on;
# Статический pull начинается при запуске nginx
pull rtmp://rtmp4.example.com pageUrl=www.example.com/index.html name=mystream static;
}
# видео по запросу
application vod {
play /var/flvs;
}
application vod2 {
play /var/mp4s;
}
# Много издателей, много подписчиков
# без проверок, без записи
application videochat {
live on;
# Следующие уведомления получают все
# переменные сессии, а также
# конкретные аргументы вызова в HTTP POST
# запросе
# Сделать HTTP запрос и использовать HTTP код ответа
# чтобы решить, разрешить ли публикацию
# с этого соединения или нет
on_publish http://localhost:8080/publish;
# То же самое с воспроизведением
on_play http://localhost:8080/play;
# Завершение публикации/воспроизведения (повторяется при отключении)
on_done http://localhost:8080/done;
# Все вышеупомянутые уведомления получают
# стандартные аргументы connect() и
# аргументы play/publish. Если какие-либо аргументы отправляются
# с синтаксисом GET для play & publish,
# они также включаются.
# Пример URL:
# rtmp://localhost/myapp/mystream?a=b&c=d
# записать 10 ключевых кадров видео (без звука) каждые 2 минуты
record keyframes;
record_path /tmp/vc;
record_max_frames 10;
record_interval 2m;
# Асинхронное уведомление о записи flv
on_record_done http://localhost:8080/record_done;
}
# HLS
# Для работы HLS, пожалуйста, создайте каталог в tmpfs (/tmp/hls здесь)
# для фрагментов. Содержимое каталога обслуживается через HTTP (см.
# раздел http{} в конфигурации)
#
# Входящий поток должен быть в H264/AAC. Для iPhone используйте базовый профиль H264
# (см. пример ffmpeg).
# Этот пример создает RTMP поток из фильма, готового к HLS:
#
# ffmpeg -loglevel verbose -re -i movie.avi -vcodec libx264
# -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1
# -f flv rtmp://localhost:1935/hls/movie
#
# Если вам нужно транскодировать живой поток, используйте функцию 'exec'.
#
application hls {
live on;
hls on;
hls_path /tmp/hls;
}
# MPEG-DASH аналогичен HLS
application dash {
live on;
dash on;
dash_path /tmp/dash;
}
}
}
# HTTP может использоваться для доступа к статистике RTMP
http {
server {
listen 8080;
# Этот URL предоставляет статистику RTMP в XML
location /stat {
rtmp_stat all;
# Используйте этот стиль для просмотра XML как веб-страницы
# в браузере
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
# XML стиль для просмотра статистики RTMP.
# Скопируйте stat.xsl куда угодно
# и укажите полный путь к каталогу здесь
root /path/to/stat.xsl/;
}
location /hls {
# Обслуживание фрагментов HLS
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header Cache-Control no-cache;
}
location /dash {
# Обслуживание фрагментов DASH
root /tmp;
add_header Cache-Control no-cache;
}
}
}
Пример многопоточного вещания
rtmp_auto_push on;
rtmp {
server {
listen 1935;
application mytv {
live on;
}
}
}
GitHub
Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-rtmp.