rtmp: Модуль RTMP для NGINX
Установка на Debian/Ubuntu
Эти документация относится к APT пакету nginx-module-rtmp, предоставляемому репозиторием GetPageSpeed Extras.
- Настройте APT репозиторий, как описано в настройке APT репозитория.
- Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-rtmp
Показать дистрибутивы и архитектуры
| Дистрибутив | Версия | Компонент | Архитектуры |
|-------------|-------------------|------------|-----------------|
| 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
Блог проекта
http://nginx-rtmp.blogspot.com
Wiki руководство
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
Формат URL для RTMP
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;
# записать первые 1К потока
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. Поток публикуется в
# 'малое' приложение (см. ниже) под тем же именем.
#
# 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;
# Статическая передача начинается при старте 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 для воспроизведения и публикации,
# они также включены.
# Пример 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 stylesheet для просмотра статистики 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;
}
}
}