Использование WebRTC для публикации видео на Flussonic Media Server
Содержание:
- О протоколе WebRTC и его применении для публикации на Flussonic
- Как организовать публикацию по WebRTC
- Опции публикации по WebRTC (аудио подкасты по WebRTC)
- Пример приложения
- Настройки адаптивного битрейта (ABR) публикаций по WebRTC
О протоколе WebRTC
WebRTC — это P2P протокол общения между двумя клиентами, регламентирующий передачу данных по заранее установленному соединению. Например, для связи двух браузеров по протоколу WebRTC необходимо зайти на один и тот же сайт в интернете. Также можно использовать посредника — сигнальный сервер.
Прежде чем начать передачу видео-данных, клиенты должны установить соединение. Процесс установления соединения между двумя клиентами заключается в обмене данными о соединении двух видов:
- текстовыми описаниями медиапотоков в формате SDP
- ICE Candidates как часть SDP
Сигнальный сервер — посредник, позволяет передать данные о соединении от одного клиента к другому.
О публикации по WebRTC на Flussonic
Flussonic Media Server использует WebRTC для публикации видео с клиентского устройства или программы (источника) на Flussonic (приемник). Затем Flussonic выступает в роли источника, чтобы проиграть видео на другом клиенте (приемнике). При этом в обоих случаях Flussonic также играет роль сигнального сервера, помогающего установить соединение.
Почему мы используем именно WebRTC для обмена медиа-данными между двумя клиентами? Данный механизм позволяет нам достигнуть сверхнизкой задержки.
Таким образом, обмен видео по WebRTC через Flussonic Media Server нельзя считать peer-to-peer, правильнее будет называть это публикацией видео на Flussonic Media Server по WebRTC и проигрыванием видео с Flussonic сервера по WebRTC.
На схеме ниже показан процесс обмена данными для установления соединения между Flussonic и клиентским приложением, для публикации видео:
Процесс установления соединения для публикации видео и аудио потока во Flussonic Media Server по WebRTC похож на аналогичный для проигрывания видео.
Принцип остается неизменным — стороны должны обменяться SDP через посредника (а это сигнальный сервер - Flussonic), после чего начать передачу данных напрямую. В случае публикации видео инициировать процесс и отправлять приглашение (SDP offer) нужно со стороны клиента (источника).
Cоединение устанавливается по WebSocket, а видео передается по RTP.
Как организовать публикацию по WebRTC
На сервере Flussonic добавьте в конфигурацию публикуемый поток, т.е. поток с источником publish://
.
stream published {
url publish://;
}
Можно добавить поток через UI, в разделе Input указав publish:// в поле URL, и убедиться, что для Published input выбрано значение accept.
Теперь на клиенте нужно исполнить код для публикации видео в созданный поток. Для написания кода используйте библиотеку Flussonic WebRTC player.
Установка библиотеки с помощью NPM и webpack
Для варианта с импортом библиотеки в ваш проект через Webpack необходимо загрузить пакет:
npm install --save @flussonic/flussonic-webrtc-player
и импортировать его в ваше приложение:
import {
PUBLISHER_EVENTS,
PLAYER_EVENTS,
Player,
Publisher,
} from "@flussonic/flussonic-webrtc-player";
Описание классов библиотеки доступно на npm.
См. также демо-приложение по ссылке либо ниже на этой странице.
Установка без NPM и webpack
В секцию скриптов вашего HTML-файла добавьте:
<script src="https://cdn.jsdelivr.net/npm/@flussonic/flussonic-webrtc-player/dist/index.min.js"></script>
Полный пример кода страницы с плеером приведен ниже на этой странице.
Опции публикации по WebRTC (Flussonic 20.10)
Организация аудио-подкастов по WebRTC
Чтобы публиковать только звуковую дорожку, необходимо в опциях экземпляра publisher
указать следующую конфигурацию в constraints
:
import Publisher from '../publisher';
//...
publisher = new Publisher(
//...
constraints: {
video: false,
audio: true,
},
//...
);
Опцию video
можно совсем не указывать, результат будет такой же — публикация на Flussonic только аудиодорожки.
Чтобы проиграть такой поток, не нужно дополнительных настроек.
Отключение звука в публикации
Для отключения звука в публикации используется метод mute
:
import Publisher from '../publisher';
//...
publisher = new Publisher(*your options*);
//...
publisher.mute();
//...
Функцию mute
можно привязать к кнопке в клиентском приложении, чтобы пользователь мог сам отключать звук в исходящем потоке во время его публикации. В демо-приложении есть пример такой кнопки.