Поиск по сайту:

Как настроить сервер потокового видео с помощью Nginx-RTMP в Ubuntu 22.04


Введение

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

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

Предпосылки

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

  • Сервер Ubuntu 22.04 и пользователь без полномочий root с привилегиями sudo. Вы можете узнать больше о том, как настроить пользователя с этими привилегиями, в нашем руководстве Initial Server Setup with Ubuntu 22.04.
  • Nginx установлен в соответствии с инструкциями по установке Nginx в Ubuntu 22.04.

В этом руководстве будет использоваться доменное имя-заполнитель your_domain для URL-адресов и имен хостов. Замените это своим собственным доменным именем или IP-адресом во время работы с учебным пособием.

Шаг 1 — Установка и настройка Nginx-RTMP

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

Начните с выполнения следующих команд от имени пользователя без полномочий root, чтобы обновить списки пакетов и установить модуль Nginx:

  1. sudo apt update
  2. sudo apt install libnginx-mod-rtmp

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

Используя nano или ваш любимый текстовый редактор, откройте основной файл конфигурации Nginx, /etc/nginx/nginx.conf, и добавьте этот блок конфигурации в конец файла:

  1. 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 КБ, что также является стандартным.
  • разрешить публикацию 127.0.0.1 и запретить публикацию всех означают, что сервер разрешает публиковать видео только с того же сервера, чтобы другие пользователи не проталкивали свои собственные потоки.
  • application live определяет блок приложения, который будет доступен по URL-пути /live.
  • прямая трансляция включает режим прямой трансляции, чтобы несколько пользователей могли одновременно подключаться к вашему потоку, что является базовым предположением потокового видео.
  • record off отключает функцию записи Nginx-RTMP, чтобы по умолчанию все потоки не сохранялись отдельно на диск.

Сохраните и закройте файл. Если вы используете nano, нажмите CTRL+X, затем, когда будет предложено, Y и ENTER.

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

  1. sudo ufw allow 1935/tcp

Теперь вы можете перезагрузить Nginx со своими изменениями:

  1. sudo systemctl reload nginx.service

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

Шаг 2 — Отправка видео на ваш RTMP-сервер

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

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

  1. sudo apt install python3-pip

Затем используйте pip для установки youtube-dl:

  1. sudo pip install youtube-dl

Теперь вы можете использовать youtube-dl для загрузки видео с YouTube. Если у вас его нет на примете, посмотрите это видео, знакомящее с платформой приложений DigitalOcean:

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

Примечание. Иногда вы сталкиваетесь с ошибкой, которая гласит: ОШИБКА: невозможно загрузить видеоданные: Ошибка HTTP 403: Запрещено. Если вы это сделаете, дважды проверьте правильность URL-адреса. Если ваш URL-адрес правильный, запуск команды во второй раз будет работать. Это особенность взаимодействия с YouTube через эту библиотеку.

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

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

Теперь у вас есть видеофайл в текущем каталоге с заголовком типа Представляем платформу приложений от DigitalOcean-iom_nhYQIYk.mp4. Для потоковой передачи установите ffmpeg:

  1. sudo apt install ffmpeg

И используйте ffmpeg, чтобы отправить его на ваш RTMP-сервер:

  1. 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 Представляем платформу приложений от DigitalOcean-iom_nhYQIYk.mp4 указывает путь к нашему входному файлу.
  • Для параметра
  • -c:v задано значение copy, что означает, что вы копируете формат видео, изначально полученный с YouTube.
  • -c:a имеет другие параметры, а именно aac -ar 44100 -ac 1, потому что вам нужно передискретизировать звук в RTMP-дружественный формат. aac — широко поддерживаемый аудиокодек, 44100 Гц — общепринятая частота, а -ac 1 указывает первую версию спецификации AAC для совместимости. цели.
  • -f flv помещает видео в контейнер формата flv для максимальной совместимости с RTMP.

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

Примечание. Вы можете узнать больше об опциях ffmpeg из официальной документации.

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

Output
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-потоку из видеоплеера. Если у вас локально установлен VLC, mpv или другой медиаплеер, вы сможете просмотреть свой поток, открыв URL-адрес rtmp://. your_domain/live/stream в медиаплеере. Ваш поток завершится после того, как 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://ваш_домен/live/obs_stream. Вам не нужно включать аутентификацию, но вам нужно добавить дополнительную запись в белый список IP-адресов, который вы настроили на шаге 1.

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

  1. sudo nano /etc/nginx/nginx.conf
. . .
                allow publish 127.0.0.1;
                allow publish your_local_ip_address;
                deny publish all;
. . .

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

  1. sudo systemctl reload nginx.service

Теперь вы сможете закрыть меню настроек OBS и нажать Начать трансляцию в главном интерфейсе! Попробуйте просмотреть свою трансляцию по адресу rtmp://ваш_домен/live/obs_stream в медиаплеере, как и раньше. Теперь, когда вы понимаете основы потокового видео в действии, вы можете добавить несколько других функций на свой сервер, чтобы сделать его более готовым к работе.

Шаг 4 — Добавление мониторинга в вашу конфигурацию (необязательно)

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

  1. 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 с помощью следующих команд:

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

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

  1. sudo ufw allow from your_ip_address to any port http-alt

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

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

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

  1. sudo systemctl reload nginx.service

Теперь вы сможете перейти по адресу http://your_domain:8080/stat в браузере, чтобы просмотреть страницу статистики RTMP. Заходите и обновляйте страницу во время потоковой передачи видео и смотрите, как меняется статистика трансляции.

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

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

В качестве последнего шага вы можете добавить поддержку новых протоколов потоковой передачи, чтобы пользователи могли передавать потоковое видео с вашего сервера напрямую с помощью веб-браузера. Существует два протокола, которые можно использовать для создания видеопотоков на основе HTTP: DASH от Apple. У них обоих есть преимущества и недостатки, поэтому вы, вероятно, захотите поддержать оба.

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

  1. 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:

  1. 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 или HLS и DASH, а также общий переключатель конфигурации во многих других веб-развертываниях.

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

  1. sudo ufw allow 8088/tcp

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

  1. sudo mkdir /var/www/html/stream

Перезагрузите Nginx снова:

  1. sudo systemctl reload nginx

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

Заключение

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

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