Настройка сервера видео-стриминга на Nginx-RTMP

Существует множество вариантов использования потокового видео. К примеру, популярные провайдеры сервисов типа Twitch часто применяются для обработки потоковой передачи и управления сообществом, а свободное программное обеспечение, такое как OBS Studio, широко используется для объединения наложений видео из нескольких источников потоков в режиме реального времени. Конечно, эти платформы очень мощные, однако в некоторых случаях у вас может возникнуть необходимость стримить независимо от других провайдеров.

В этом туториале вы узнаете, как настроить веб-сервер Nginx для размещения независимого видеопотока RTMP, который можно привязать к разным приложениям и просматривать его в них. RTMP (Real-Time Messaging Protocol) определяет основы большинства потоковых видео в сети. Также мы разберем, как размещать протоколы HLS и DASH, которые работают по той же технологии, но поддерживают более современные платформы.

Требования

Для выполнения этого мануала потребуется:

  • Сервер (у нас Ubuntu) и пользователь sudo. Как настроить пользователя с этими привилегиями, можете узнать в этом мануале.
  • Установленый Nginx (мы настроили свой согласно этому мануалу по установке Nginx в Ubuntu).

Мы будем использовать условный домен your_domain в URL-адресах и хостах. Замените его своим доменом или IP-адресом.

1: Установка и настройка Nginx-RTMP

Большинство современных потоковых инструментов поддерживают протокол RTMP, который определяет основные параметры сетевого видеопотока. Веб-сервер Nginx включает в себя модуль, который позволяет обеспечить поток RTMP с минимальной конфигурацией с выделенного URL-адреса (аналогично он по умолчанию предоставляет HTTP-доступ к веб-страницам). Модуля Nginx RTMP нет в Nginx, но в Ubuntu и большинстве других дистрибутивов Linux его можно установить как дополнительный пакет.

Чтобы обновить списки пакетов и установить модуль Nginx, выполните следующие команды как не-root пользователь:

sudo apt update
sudo apt install libnginx-mod-rtmp

Установка модуля не запустит стриминг автоматически. Чтобы запустить его, нам нужно будет добавить в файл Nginx блок конфигурации, который определяет, где и как будет доступен наш стрим.

С помощью nano или любого другого текстового редактора откройте конфигурационный файл Nginx /etc/nginx/nginx.conf: 

sudo nano /etc/nginx/nginx.conf

и добавьте следующий блок в конец файла:

. . .
rtmp {
        server {
                listen 1935;
                chunk_size 4096;
                allow publish 127.0.0.1;
                deny publish all;

                application live {
                        live on;
                        record off;
                }
        }
}
  • listen 1935 значит, что RTMP будет прослушивать соединения на порту 1935 (это стандарт).
  • chunk_size 4096 означает, что RTMP будет отправлять данные блоками по 4 КБ (также стандарт).
  • Благодаря строкам allow publish 127.0.0.1 и deny publish all сервер разрешает публиковать видео только на том же сервере, чтобы другие пользователи не запускали тут свои стримы.
  • application live определяет application block, который будет доступен по URL-адресу /live.
  • live on включает режим live, чтобы несколько пользователей могли одновременно подключаться к потоку (базовое условие для видеопотока).
  • Record off отключает функцию записи Nginx-RTMP, поэтому по умолчанию все потоки не сохраняются отдельно на диск.

Сохраните и закройте файл. В nano для этого нажмите CTRL+X, затем Y и ENTER.

Это начало конфигурации RTMP. По умолчанию он прослушивает порт 1935, значит, теперь нам нужно открыть этот порт в брандмауэре. Если на сервере настроен ufw, выполните следующую команду:

sudo ufw allow 1935/tcp

Затем можно перезагрузить Nginx:

sudo systemctl reload nginx.service

Теперь RTMP-сервер работает. В следующем разделе мы рассмотрим потоковую передачу видео из локальных и удаленных источников на RTMP-сервер.

2: Отправка видео на сервер RTMP

Есть несколько способов отправить видео на RTMP-сервер. Один из вариантов — воспроизведение видеофайла непосредственно на сервере с помощью популярной аудио-видео утилиты командной строки ffmpeg. Если на сервере еще нет видеофайла, можно загрузить его с помощью инструмента для захвата видео с потоковых платформ (например YouTube) — youtube-dl. Для работы youtube-dl на сервере понадобится последняя версия Python.

Сначала установите Python и менеджер пакетов pip:

sudo apt install python3-pip

Затем с помощью pip установите youtube-dl:

sudo pip install youtube-dl

Теперь с помощью youtube-dl вы можете загружать видео с YouTube. 

youtube-dl https://www.youtube.com/watch?v=iom_nhYQIYk -f mp4

Примечание: Иногда в работе возникает ошибка: ERROR: unable to download video data: HTTP Error 403: Forbidden. Это такой баг взаимодействия с YouTube через эту библиотеку. В этом случае вам нужно проверить правильность URL-адреса.  Если URL правильный, снова запустите команду.

Вывод покажет, что youtube-dl объединяет видео- и аудиопотоки, которые он загружает в один файл:

[youtube] iom_nhYQIYk: Downloading webpage
[download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.mp4
[download] 100% of 7.90MiB in 01:39

Теперь в текущем каталоге есть необходимый файл. Установите ffmpeg для передачи стримов:

sudo apt install ffmpeg

Давайте с помощью ffmpeg отправим файл на RTMP-сервер:

ffmpeg -re -i "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mp4" -c:v copy -c:a aac -ar 44100 -ac 1 -f flv rtmp://localhost/live/stream

Команда ffmpeg выполнит действия для подготовки видео к потоковому формату. Это не мануал по ffmpeg, поэтому мы не будем уделять ему много времени и разберем только несколько базовых параметров:

  • -re значит, что ввод будет считываться с исходной частотой кадров.
  • -i “Introducing App Platform by DigitalOcean-iom_nhYQIYk.mp4” указывает путь к входному файлу.
  • -c:v имеет значение copy, а это значит, что при работе копируется нативный формат видео, полученного с YouTube.
  • -c:a содержит параметры aac -ar 44100 -ac 1, чтобы пересэмплировать аудио в поддерживаемый RTMP формат. aac — широко поддерживаемый аудиокодек, 44 100 Гц — распространенная частота, -ac 1 указывает первую для совместимости версию спецификации AAC.
  • -f flv упаковывает видео в контейнер формата flv для максимальной совместимости с RTMP.

Видео отправляется на rtmp://localhost/live/stream, потому что мы определили блок конфигурации live, а stream — это произвольно выбранный URL-адрес для этого видео.

Примечание: Ознакомьтесь с опциями ffmpeg в ffmprovisr, это поддерживаемый сообществом каталог примеров команд для ffmpeg. Также вы можете обратиться к официальным материалам.

ffmpeg выводит тайм-коды, пока транслируется видео:

frame=  127 fps= 25 q=-1.0 size=     405kB time=00:00:05.00 bitrate= 662.2kbits/s speed=frame=  140 fps= 25 q=-1.0 size=     628kB time=00:00:05.52 bitrate= 931.0kbits/s speed=frame=  153 fps= 25 q=-1.0 size=     866kB time=00:00:06.04 bitrate=1173.1kbits/s speed=

Это стандартный вывод ffmpeg. Эти данные были бы полезны при конвертировании видео в другой формат, потому что они позволяют понять, насколько эффективно ресемплируется видео. Но в данном случае можно просто убедиться, что видео воспроизводится стабильно. В данном случае получим точное значение fps=25.

Пока ffmpeg работает, можно подключиться к потоку RTMP с помощью видеоплеера. Посмотреть стрим можно по адресу rtmp://your_domain/live/stream в медиаплеере (если у вас есть локальная установка VLC, mpv или другой медиаплеер). Поток завершится, когда ffmpeg завершит воспроизведение видео. Если хотите зациклить видео, можно добавить опцию -stream_loop -1 в начало команды ffmpeg. 

Примечание. Стримить можно и напрямую, например в Facebook Live с помощью ffmpeg без Nginx-RTMP. Для этого нужно заменить rtmp://localhost/live/stream в команде ffmpeg на rtmps://live-api-s. .facebook.com:443/rtmp/your-facebook-stream-key. YouTube использует URL-адреса типа rtmp://a.rtmp.youtube.com/live2. Другие провайдеры потокового вещания, которые могут потреблять потоки RTMP, должны вести себя аналогично.

Теперь, когда вы научились запускать видеострим из командной строки, давайте разберем, как транслировать видео из динамических источников с помощью OBS на рабочем столе.

3: Стриминг видео на сервер через OBS (опционально)

Потоковая передача через ffmpeg хорошо работает, если у вас есть готовое к воспроизведению видео, но прямая трансляция может быть динамичнее. Самым популярным программным обеспечением для прямых трансляций является OBS (Open Broadcaster Software) — свободное, открытое и очень мощное.

OBS — это настольное приложение, которое будет подключаться к серверу с локального компьютера.

После установки OBS требует настройки: вам нужно выбрать окна рабочего стола и источники звука, которые будут добавлены в поток, а затем добавить учетные данные для службы потоковой передачи. В этом туториале мы не будем рассматривать конфигурацию потоковой передачи, поскольку она зависит от многих факторов, а получить рабочую демонстрацию можно и со стандартными настройками (можно просто стримить свой рабочий стол, например). Чтобы установить учетные данные, откройте меню настроек OBS, перейдите к параметру Stream и введите следующие параметры:

Streaming Service: Custom
Server: rtmp://your_domain/live
Play Path/Stream Key: obs_stream

obs_stream — произвольно выбранный путь, в этом случае видео будет доступно по адресу rtmp://your_domain/live/obs_stream. Включать аутентификацию не нужно, но нужно добавить дополнительную запись в белый список IP-адресов, который мы настраивали вначале.

На сервере откройте основной файл конфигурации Nginx (/etc/nginx/nginx.conf) и добавьте запись allow publish для локального IP-адреса. Если вы не знаете свой локальный IP-адрес, можете перейти на сайт What’s my IP, который подскажет, откуда вы зашли на сервер.

sudo nano /etc/nginx/nginx.conf

. . .
                allow publish 127.0.0.1;
                allow publish your_local_ip_address;
                deny publish all;
. . .

Сохраните и закройте файл, затем перезагрузите Nginx:

sudo systemctl reload nginx.service

Теперь можно закрыть меню настроек OBS и нажать Start Streaming в главном интерфейсе! Попробуйте посмотреть стрим в медиаплеере по адресу rtmp://your_domain/live/obs_stream. 

Итак, мы разобрали основы работы с потоковым видео в действии. Далее мы добавим другие функции на сервер, чтобы подготовить его к продакшену еще лучше.

4: Настройка мониторинга (опционально)

Давайте теперь включим страницу статистики RTMP. Nginx позволяет добавлять конфигурации для каждого сайта в отдельные файлы в подкаталоге sites-available/, потому нам не придется добавлять новые конфигурации в основной файл nginx.conf. Создадим файл под названием rtmp:

sudo nano /etc/nginx/sites-available/rtmp

Добавьте следующее содержимое:

server {
    listen 8080;
    server_name  localhost;

    # rtmp stat
    location /stat {
        rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl;
    }
    location /stat.xsl {
        root /var/www/html/rtmp;
    }

    # rtmp control
    location /control {
        rtmp_control all;
    }
}

Сохраните и закройте файл. Файл stat.xsl из этого блока конфигурации используется для вывода страницы статистики RTMP в браузере. Его предоставляет ранее установленная библиотека libnginx-mod-rtmp, но по умолчанию он заархивирован. Поэтому нужно его разархивировать и поместить в каталог /var/www/html/rtmp. Обратите внимание, найти дополнительную информацию о любом из этих параметров можно в материалах Nginx-RTMP.

Создайте каталог /var/www/html/rtmp, а затем распакуйте файл stat.xsl.gz с помощью следующих команд:

sudo mkdir /var/www/html/rtmp

sudo cp /usr/share/doc/libnginx-mod-rtmp/examples/stat.xsl /var/www/html/rtmp/stat.xsl

Чтобы получить доступ к странице статистики, нужно открыть другой порт в брандмауэре. Директива listen настроена на порт 8080, поэтому нам нужно добавить правило для доступа к Nginx через этот порт. Скорее всего, вы не захотите, чтобы кто-то другой мог получить доступ к странице статистики, поэтому лучше разрешить ее только для вашего IP. Выполните следующую команду:

sudo ufw allow from your_ip_address to any port http-alt

Далее нужно активировать эту конфигурацию. В Nginx для этого принято создавать симлинки (как ярлыки) из sites-available/ в sites-enabled/. Создадим такой симлинк:

sudo ln -s /etc/nginx/sites-available/rtmp /etc/nginx/sites-enabled/rtmp

Нужно перезагрузить Nginx, чтобы обработать изменения:

sudo systemctl reload nginx.service

Для просмотра страницы статистики RTMP в браузере перейдите по адресу http://your_domain:8080/stat. Посетите страницу статистики во время потоковой передачи видео и проследите за статистикой трансляции.

Итак, мы разобрали, как контролировать видеопоток и передавать его сторонним провайдерам. В последнем разделе вы узнаете, как запустить его непосредственно в браузере без сторонних платформ потокового вещания или отдельных приложений медиаплеера.

5: Создание современных потоков для браузера (опционально)

Мы также можем добавить поддержку новых потоковых протоколов. Есть два протокола для создания видеопотоков на основе HTTP: HLS от Apple и DASH от MPEG. У каждого есть свои преимущества и недостатки, потому рекомендуем включить поддержку обоих.

Модуль Nginx-RTMP поддерживает оба стандарта. Чтобы добавить поддержку HLS и DASH на сервер, необходимо изменить rtmp block в файле nginx.conf. Откройте файл /etc/nginx/nginx.conf и добавьте такие директивы:

sudo nano /etc/nginx/nginx.conf

. . .
rtmp {
        server {
. . .
                application live {
                        live on;
                        record off;
                        hls on;
                        hls_path /var/www/html/stream/hls;
                        hls_fragment 3;
                        hls_playlist_length 60;

                        dash on;
                        dash_path /var/www/html/stream/dash;
                }
        }
}
. . .

Сохраните и закройте файл. Затем добавьте в конец sites-available/rtmp следующее:

sudo nano /etc/nginx/sites-available/rtmp

. . .
server {
    listen 8088;

    location / {
        add_header Access-Control-Allow-Origin *;
        root /var/www/html/stream;
    }
}

types {
    application/dash+xml mpd;
}

Примечание. Заголовок Access-Control-Allow-Origin * включает CORS (Cross-Origin Resource Sharing), который по умолчанию отключен. Это сообщает браузерам, которые получают доступ к данным с сервера, что сервер может загружать ресурсы с других портов или доменов. CORS необходим для максимальной совместимости с клиентами HLS и DASH, а также для общего переключения конфигурации во многих других веб-развертываниях.

Сохраните и закройте файл. Обратите внимание, что в этом мануале мы используем порт 8088, чтобы избежать конфликтов с запущенными на порту 80 или 443 службами. Откроем этот порт в брандмауэре:

sudo ufw allow 8088/tcp

Чтобы Nginx мог генерировать необходимые файлы для HLS и DASH, создайте каталог stream в root, как указано в нашей конфигурации:

sudo mkdir /var/www/html/stream

Перезагрузите Nginx:

sudo systemctl reload nginx

Теперь поток HLS доступен по адресу http://your_domain:8088/hls/stream.m3u8, а поток DASH — по адресу http://your_domain:8088/dash/stream.mpd. Эти конечные точки будут генерировать все необходимые метаданные поверх видеопотока RTMP для поддержки современных API.

Подводим итоги

Все параметры конфигурации в этом туториале есть на странице Nginx RTMP Wiki. Модули Nginx обычно имеют общий синтаксис и предоставляют большой набор параметров конфигурации, чтобы изменить настройки. Рекомендуем ознакомиться с их материалами.

Почти все стриминговые видео в сети реализованы на основе RTMP, HLS и DASH и используют подход, который представлен в этом туториале. Вы можете настроить стриминг через другие сервисы или предоставлять его любым другим способом. 

Читайте также: Nginx как веб-сервер и прокси-сервер для Apache в Ubuntu

Добавить комментарий