Документация на Flussonic Media Server

  1. Быстрый старт
  2. How To
  3. Потоковое вещание
    1. Публикация
    2. Прием мультикаста
    3. Варианты источников
    4. Переключение источников
    5. Плейлисты
    6. Наложение логотипа
    7. Миксер
    8. WebRTC публикация
    9. SDI
    10. Отправка на другие сервера
    11. Распознавание DVB субтитров
  4. Транскодер
    1. Логотип
    2. Hardware
    3. Скриншоты
    4. Мозаика
  5. DRM
    1. Simple CAS
    2. Conax DRM
    3. BuyDRM (KeyOS)
  6. Авторизация
    1. Конструктор бэкендов
    2. Сервис сбора статистики
    3. Domain lock
    4. Middleware
    5. Secure links
    6. Ограничение сессий
    7. Мультиавторизация
    8. Бан IP адресов
    9. DVR
    10. Aliaser
  7. API
    1. HTTP API
    2. Events API
    3. MySQL API
    4. SQL API для кластеров
    5. SNMP
  8. Кластер
    1. Ретрансляция
    2. Кластерный захват
    3. Балансировщик нагрузки
    4. Пиринг
    5. Организация CDN
  9. VOD
    1. Кэш
    2. Облако
    3. Транскодирование файлов
  10. DVR
    1. Настройка
    2. Timeshift
    3. Catchup
    4. Проигрывание
    5. Экспорт в MP4
    6. Доступ по протоколам
    7. Timelapse
    8. API
    9. Кластеризация DVR
    10. Репликация
    11. Облако
  11. Воспроизведение
    1. HLS
    2. embed.html
    3. HTML5 с низкой задержкой
    4. Плеер HTML5 с низкой задержкой
    5. MPEG-TS
    6. RTMP
    7. DASH
    8. HDS
    9. RTSP
    10. multicast, CBR UDP
    11. WebRTC проигрывание
    12. H.265
  12. Администрирование
    1. Установка
    2. Обновление

    3. Конфигурация
    4. Мониторинг
    5. Производительность
    6. Лицензия
    7. LUA скрипты
    8. Безопасность
    9. Let's Encrypt
    10. Миграция
  13. IPTV
    1. Захват спутникового видео
    2. Транскодирование
    3. Middleware в IPTV OTT
    4. Экспорт EPG со спутника
    5. Группы каналов

WebRTC Публикация

WebRTC — это P2P протокол общения между двумя клиентами, регламентирующий передачу данных по заранее установленному соединению.

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

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

Стандартная схема P2P коммуникации через WebRTC подразумевает организацию двух сессий: аудио-видео от клиента А к Б и наоборот: от Б к А.

Flussonic Media Server может выступать в роли одновременно сигнального сервера и клиента: как принимающего видеопоток, так и отдающего.

Таким образом можно говорить о публикации видео на Flussonic Media Server по WebRTC и о проигрывании видео по WebRTC.

Публикация видео и аудио потоков по WebRTC Anchor Anchor x2

Процесс установления соединения для публикации видео и аудио потока во Flussonic Media Server по WebRTC похож на аналогичный для получения видео. Принцип остается неизменным — стороны должны обменяться SDP через посредника (сигнальный сервер), после чего начать передачу данных напрямую. Однако в случае публикации видео обмен информацией с сигнальным сервером происходит немного в другом порядке. Инициировать процесс и отправлять приглашение (SDP offer) нужно со стороны клиента. В этом ключевое отличие.

Важно! Обратите внимание, что в некоторых браузерах публикация WebRTC видео и аудио потоков возможна только по защищенному соединению. То есть браузер может запретить доступ к камере и микрофону со страницы, которая располагается не по HTTPS, а по HTTP адресу. На локальных адресах (localhost, 127.0.0.1) это допускается.

Так же, как и в случае отправки видео результатом обмена SDP с помощью сигнального сервера должен стать локальный объект PeerConnection с заданными свойствами LocalDescription и RemoteDescription, содержащий локальное и удаленное SDP описание соответственно.

Для того, чтобы запустить процесс установления WebRTC соединения с Flussonic Media Server нужно открыть WebSocket соединение по адресу:

ws://flussonic-ip/STREAMNAME/webrtc/publish

где flussonic-ip — адрес и порт Flussonic Media Server.

Поддерживаются протоколы ws и wss.

Для дальнейшего установления прямого P2P соединения нужно создать PeerConnection и задать обработчик onicecandidate. После установления WebSocket соединения клиент должен отправить в веб сокет приглашение (SDP offer), его же нужно задать в качестве LocalDescription. Когда сервер получит приглашение, он отправит в ответ свой идентификатор (SDP Answer).

webrtc

На клиенте его нужно обработать (задать в качестве RemoteDescription для созданного ранее PeerConnection).

function openWebSocketConnection(options) {
  var url =
    options.protocol + "://" +
    options.server + ":" +
    options.port + "/" +
    options.stream + "/webrtc/publish";

  websocket = new WebSocket(url);
  websocket.onopen = initPeerConnection;
  websocket.onmessage = onWebSocketMessage;
}

function initPeerConnection() {
  peerConnection = new window.RTCPeerConnection(null);
  peerConnection.stream_id = "local1";
  peerConnection.onicecandidate = gotIceCandidate;

  getMedia().then(gotMedia);
}

function sendWebSocketMessage(data) {
  websocket.send(JSON.stringify(data));
}

function onWebSocketMessage(event) {
  var message = JSON.parse(event.data);

  switch (message.type) {
    case "answer":
      var description = new window.RTCSessionDescription(message);
      peerConnection.setRemoteDescription(description);
    break;
    case "candidate":
      var candidate = new window.RTCIceCandidate(message.candidate);
      peerConnection.addIceCandidate(candidate);
    break;
  }
}

В обработчике onicecandidate объекта PeerConnection нужно реализовать отправку сообщения IceCandidate в открытый веб сокет. После этого Flussonic Media Server через веб сокет вернет сообщение, содержащее IceCandidate SDP. На этом этапе мы можем быть уверены, что обе стороны знают SDP друг друга и можно приступать к общению напрямую.

function gotIceCandidate(event){
  var candidate = event.candidate;
  if (candidate) {
    sendWebSocketMessage({
      type: 'candidate',
      stream_id : "local1",
      label: candidate.sdpMLineIndex,
      id: candidate.sdpMid,
      candidate: candidate
    });
  }
}

Заметно, что код практически полностью повторяет аналогичный из примера о получении WebRTC видео. Однако есть некоторые отличия. При публикации видео мы отправляем SDP offer со стороны клиента, и, соответственно, должны обработать SDP answer, который приходит с сервера.

Кроме того нужно получить доступ к веб камере и микрофону устройства для того, чтобы отправлять видео и аудио потоки на сервер. Это можно сделать используя navigator.mediaDevices API. Также мы можем задать свойство srcObject в локальном HTML5 Video теге. Это никак не влияет на отправку медиапотока на сервер, но так можно будет увидеть контент, который отправляется.

function getMedia() {
  return navigator.mediaDevices.getUserMedia({
    audio: true,
    video: true
  });
}

function gotMedia(stream) {
  video.srcObject = stream;
  peerConnection.addStream(stream);

  peerConnection.createOffer({
    "offerToReceiveAudio": true,
    "offerToReceiveVideo":true
  }).then(function(description) {
    return peerConnection.setLocalDescription(description);
  }).then(function() {
    sendWebSocketMessage(peerConnection.localDescription)
  })
}

Полный код примера доступен здесь.