Сегодня мы рассмотрим RTMP-потоки, которые хоть и считаются уже ветеранами среди протоколов передачи данных, но до сих пор остаются частью инфраструктуры видеостриминга.

RTMP

RTMP был разработан компанией Macromedia, которую позже приобрела Adobe.

Этот протокол предназначен для передачи аудио, видео и других данных между Flash-плеером и сервером в режиме реального времени.

Основная фича RTMP заключается в его способности поддерживать низкую задержку передачи данных.

Основные компоненты RTMP

В основе процесса стриминга лежит энкодер — устройство или ПО, которое преобразует исходный видео и аудио контент в формат, пригодный для передачи по сети. Энкодеры бывают двух типов: аппаратные и программные. Аппаратные энкодеры, типо Teradek или Blackmagic Design, дают надежность и качество видео, в то время как программные энкодеры, например, всеми любимый OBS Studio и Wirecast, предлагают широкие возможности настройки для юзеров с ограниченным бюджетом.

RTMP сервер действует как промежуточный пункт, который принимает закодированный контент от энкодера и пересылает его зрителям. Серверы могут быть настроены как на аппаратном, так и на программном уровне, с популярными вариантами включая Wowza и Red5 Pro.

На стороне клиента плеер отвечает за декодирование и воспроизведение потоковых данных. Плееры могут быть встроенными в веб-страницы или представлять собой отдельные приложения. Современные плееры поддерживают различные форматы и адаптируются под нужды конечных юзеров.

Установка и конфигурация Nginx с RTMP

На сервере с Линукс, начнаеми с установки Nginx и модуля RTMP. Юзаем команды установки через менеджер пакетов дистрибутива. Например, для Ubuntu команды будут такими:

sudo apt update
sudo apt install nginx
sudo apt install libnginx-mod-rtmp

Отредактируйте конф. файл Nginx /etc/nginx/nginx.conf, добавив в него блок RTMP. Это настроит сервер на прослушивание стандартного порта RTMP (1935) и позволит транслировать видео в режиме реального времени. Пример простой конфигурации:

rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application live {
            live on;
            record off;
        }
    }
}

После внесения изменений в конфигурацию перезапускаем Nginx и проверяем, работает ли сервер, обратившись к его IP-адресу через браузер или попробовав начать трансляцию с помощью, к примеру OBS Studio.

Для видео часто используется кодек H.264, который является стандартом для RTMP. Он обеспечивает хорошее соотношение качества и размера файла. Для аудио подходят кодеки AAC или MP3.

Битрейт и разрешение должны быть выбраны с учетом качества видео и скорости интернет-соединения зрителей. Например, для HD-видео битрейт может быть около 4-5 Мбит/с, а разрешение — 1080p.

Можно использовать адаптивную передачи битрейта, сокращенно ее называют ABS. С ней сервер автоматом адаптирует битрейт потока к изменяющимся условиям сети у зрителя, чтобы сделать минимум задержок.

Настройка ABS потребует интеграции с внешними транскодерами, так как сам Nginx по умолчанию не поддерживает транскодирование потоков. Добавляем модуль RTMP с указанием различных приложений для каждого качества видео:

rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application live {
            live on;
            record off;
            exec ffmpeg -i rtmp://localhost/$app/$name -c:v libx264 -preset veryfast -maxrate 1000k -bufsize 2000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 128k -ac 2 -ar 44100 -f flv rtmp://localhost/hls/$name_low;
            exec ffmpeg -i rtmp://localhost/$app/$name -c:v libx264 -preset veryfast -maxrate 2000k -bufsize 3000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 128k -ac 2 -ar 44100 -f flv rtmp://localhost/hls/$name_high;
        }
    }
}

FFmpeg используют для принятия одного входящего потока и транскодирования его в несколько потоков с разными уровнями качества. Команды, указанные в конфигурации Nginx exec, запускают FFmpeg для транскодирования исходного потока в два потока с различным битрейтом.

Также можно подрубить SSL-сертификаты для безопасность RTMP:

rtmp {
    server {
        listen 1935;
        ssl on;
        ssl_certificate /path/to/your/certificate.crt;
        ssl_certificate_key /path/to/your/key.key;

        application live {
            live on;
            push rtmps://live-api-s.facebook.com:443/rtmp/;
        }
    }
}

Плюсом к этому можно использовать различные методы аутентификации, например, базовую HTTP аутентификацию или более сложные системы управления доступом, которые требуют ввода логина и пароля для доступа к потоку. Также можно использовать токены доступа, которые предоставляют временный доступ к стриму.

Современные альтернативы RTMP

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

В последние годы появилось много современных альтернатив RTMP, например:

  1. HLS: используется, особенно на мобилках и в браузерах. HLS поддерживает адаптивный битрейт. Это улучшает качество воспроизведения и устраняет потребность в спец. серверах стриминга, как это требуется для RTMP.

  2. MPEG-DASH: открытый стандарт и он не привязан к конкретному кодеку, что позволяет использовать современные кодеки, такие как H.265/HEVC. DASH поддерживает DRM и вставку рекламы.

  3. WebRTC: предоставляет сверхнизкую задержку, что супер подходит для видеоконференций и других приложений реального времени. WebRTC поддерживается нативно большинством современных браузеров.

  4. SRT: протокол разработан для передачи видео и аудио по нестабильным сетям с минимальной задержкой.

Каждый из этих протоколов имеет свои преимущества в зависимости от конкретных потребностей и условий использования.


Подробнее про инфраструктуру, в том числе протоколы передачи данных, вы можете узнать в рамках онлайн-курсов от практикующих экспертов отрасли. Подробности в каталоге.

Комментарии (1)


  1. itmind
    23.05.2024 05:39

    Если статья называется "RTMP-поток",то где описание самого протокола, из чего он состоит, какие данные передает. Каким способом закодировать и предать / раскодировать и показать в своей программе? Например в приложении Android?