Настройка сервера видео-стриминга на Nginx-RTMP
Development | Комментировать запись
Существует множество вариантов использования потокового видео. К примеру, популярные провайдеры сервисов типа 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