Перейти к содержанию

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.