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

rtmp: Модуль RTMP для NGINX

Установка на Debian/Ubuntu

Эти документация относится к APT пакету nginx-module-rtmp, предоставляемому репозиторием GetPageSpeed Extras.

  1. Настройте APT репозиторий, как описано в настройке APT репозитория.
  2. Установите модуль:
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;
        }
    }
}