Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
themeRDark
codecs_exclude_sfu=alaw,ulaw,g729,speex16,g722,mpeg4-generic,telephone-event,flv,mpv,vp8,h265
webrtc_cc_min_bitrate=5000001000000
profiles=42e01f,640028

Отметим, что публикация и проигрывание большого числа VP8 потоков в нескольких качествах потребляет ресурсы клиентского ПК. Если ресурсов не хватает, следует предпочесть H264, поскольку большинство браузеров поддерживают аппаратное ускорение для данного кодека.

Краткое руководство по тестированию

1. Скачайте последнюю сборку SFU SDK, например 1.0.1.25

...

languagebash
themeRDark

...

Откройте пример SFU client в браузере, например https://demo.flashphoner.com:8888/

...

client2/

...

sfu/

...

2. Распакуйте архив сборки в каталог на Вашем сервере

Code Block
languagebash
themeRDark
cd /usr/local/FlashphonerWebCallServer/client2
mkdir sfu
cd sfu
tar -xzf ~/flashphoner-sfu-sdk-1.0.1.25-f8ea43bab4924798db5fa63b7b609995360e135b.tar.gz

3. Откройте пример SFU client в браузере, например https://test1.flashphoner.com:8444/client2/sfu/examples/client/main.html, введите URL сервера, имя комнаты, пин-код и имя пользователя, нажмите Enter

Image Removed

4. Поток пользователя User1 публикуется в комнате ROOM1

Image Removed

Статистика отправки качества 720p

Image Removed

Статистика отправки качества 360p

Image Removed

5. Откройте страницу примера в другом браузере или в другом окне браузера, введите URL сервера и параметры комнаты такие же, как на шаге 3, имя пользователя User2

Image Removed

6. Поток пользователя User2 проигрывается у окне User1

Image Removed

Мониторинг потоков в комнате

Для мониторинга потоков в комнате используется REST API

REST вызовы

REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:

  • HTTP: http://wcs:8081/rest-api/sfu/stats
  • HTTPS: https://wcs:8444/rest-api/sfu/stats

Здесь:

  • wcs - адрес WCS-сервера
  • 8081 - стандартный REST / HTTP порт WCS-сервера
  • 8444 - стандартный HTTPS порт
  • rest-api - обязательная часть URL
  • /sfu/stats - используемый REST-метод

REST-методы и статусы ответа

...

REST-метод

...

Пример тела REST-запроса

...

Пример тела REST-ответа

...

Статусы ответа

...

Описание

...

/sfu/stats

...

Code Block
languagejs
themeRDark
{
 "roomName":"ROOM1"
}

...

languagejs
themeRDark

...

client/main.html, введите URL сервера, имя комнаты, пин-код и имя пользователя, нажмите Enter

Image Added

2. Поток пользователя User1 публикуется в комнате ROOM1

Image Added

Статистика отправки качества 720p

Image Added

Статистика отправки качества 360p

Image Added

3. Откройте страницу примера в другом браузере или в другом окне браузера, введите URL сервера и параметры комнаты такие же, как на шаге 3, имя пользователя User2

Image Added

4. Поток пользователя User2 проигрывается у окне User1

Image Added

Мониторинг потоков в комнате

Для мониторинга потоков в комнате используется REST API

REST вызовы

REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:

  • HTTP: http://wcs:8081/rest-api/sfu/stats
  • HTTPS: https://wcs:8444/rest-api/sfu/stats

Здесь:

  • wcs - адрес WCS-сервера
  • 8081 - стандартный REST / HTTP порт WCS-сервера
  • 8444 - стандартный HTTPS порт
  • rest-api - обязательная часть URL
  • /sfu/stats - используемый REST-метод

REST-методы и статусы ответа

REST-метод

Пример тела REST-запроса

Пример тела REST-ответа

Статусы ответа

Описание

/sfu/stats

Code Block
languagejs
themeRDark
{
 "roomName":"ROOM1"
}
Code Block
languagejs
themeRDark
{
  "participants": [
    {
      "nickName": "User1",
      "outgoingTracks": [
        {
          "id": "9de9107c-ce5f-4d6b-b7d6-ea233d691d09",
          "codec": "opus",
          "bitrate": 0,
          "sampleRate": 48000,
          "channels": 2,
          "alive": true,
          "type": "AUDIO"
        },
        {
          "id": "237dcef9-c66d-4c72-bd43-0c91aaea3b7e",
          "composite": true,
          "tracks": {
            "h send": {
              "id": "237dcef9-c66d-4c72-bd43-0c91aaea3b7e",
              "codec": "H264",
              "width": 1280,
              "height": 720,
              "fps": 30,
              "bitrate": 157976,
              "alive": true,
              "type": "VIDEO"
            },
            "m send": {
              "id": "237dcef9-c66d-4c72-bd43-0c91aaea3b7e",
              "codec": "H264",
              "width": 640,
              "height": 360,
              "fps": 30,
              "bitrate": 263952,
              "alive": true,
              "type": "VIDEO"
            }
          }
        }
      ],
      "incomingTracks": {
        "3c2dcd1c-7acd-4b90-8871-331be80cade0": "h send"
      }
    },
    {
      "nickName": "User2",
      "outgoingTracks": [
        {
          "id": "3c2dcd1c-7acd-4b90-8871-331be80cade0",
          "composite": true,
          "tracks": {
            "h send": {
              "id": "3c2dcd1c-7acd-4b90-8871-331be80cade0",
              "codec": "H264",
              "width": 1280,
              "height": 720,
              "fps": 30,
              "bitrate": 238688,
              "alive": true,
              "type": "VIDEO"
            },
            "m send": {
              "id": "3c2dcd1c-7acd-4b90-8871-331be80cade0",
              "codec": "H264",
              "width": 640,
              "height": 360,
              "fps": 30,
              "bitrate": 265368,
              "alive": true,
              "type": "VIDEO"
            }
          }
        }
      ],
      "incomingTracks": {
        "9de9107c-ce5f-4d6b-b7d6-ea233d691d09": null,
        "237dcef9-c66d-4c72-bd43-0c91aaea3b7e": "h send"
      }
    }
  ]
}

200 - OK

404 - Not found

500 - Internal error


Показать текущую статистику комнаты


...

Имя параметра

Описание

Пример

romName

Имя комнаты

ROOM1

participantsСписок участников комнаты[]

nickName

Имя пользователя

User1

outgoingTracksСписок потоков, публикуемых пользователем[]
incomingTracksСписок потоков, проигрываемых пользователем{}
idИдентификатор медиасессии9de9107c-ce5f-4d6b-b7d6-ea233d691d09
codecВидео или аудио кодекH264
widthШирина картинки видео1280
heigthВысота картинки видео720
fpsFPS видео30
bitrateБитрейт видео или аудио, бит/с265368
sampleRateЧастота дискретизации аудио, Гц48000
channelsКоличество каналов аудио2
aliveПоток активенtrue
typeТип потокаVIDEO
compositeПоток включает несколько дорожекtrue
tracksСписок дорожек в композитном потоке{}

Действия над SFU потоками на сервере

В сборке 5.2.1068 добавлена возможность отображения SFU потоков как обычных WebRTC потоков на сервере. Эта возможность включается настройкой

Code Block
themeRDark
sfu_bridge_enabled=true

При этом для каждого участника будет создан поток с именем {room}-{participant}-VIDEO для видео потока и {room}-{participant}-AUDIO  для аудио. Эти потоки видны в статистике

Code Block
themeRDark
-----Stream Stats-----
...
streams_viewers=ROOM1-User1-AUDIO/0;ROOM1-User1-VIDEO/0
streams_synchronization=ROOM1-User1-AUDIO/0;ROOM1-User1-VIDEO/0

могут быть проиграны с сервера

Image Added

записаны по REST API или добавлены в микшер.

При публикации экрана создается поток с именем {room}-{participant}-VIDEO-screen, например

Code Block
themeRDark
-----Stream Stats-----
...
streams_viewers=ROOM1-User1-AUDIO/0;ROOM1-User1-VIDEO-screen/0;ROOM1-User1-VIDEO/0
streams_synchronization=ROOM1-User1-AUDIO/0;ROOM1-User1-VIDEO-screen/0;ROOM1-User1-VIDEO/0

Если поток опубликован в нескольких качествах, на WCS будет доступен поток в максимальном качестве, которое публикуется в настоящее время, например 720p. Если это качество перестает публиковаться (например, ухудшается канал участника), будет произведено автоматическое переключение на следующее доступное качество, например 360p.

Ограничения

Если участник публикует более одного потока с камеры, на WCS будет доступен только один поток.

Поддержка TURN

Поскольку для публикации и проигрывания аудио и видео дорожек в браузере используется стандартный объект RTCPeerConnection , работа через TURN сервер настраивается при создании этого объекта. Например, по умолчанию потоки в примере SFU Two Way Streaming публикуются напрямую:

code

Code Block
languagejs
themeRDark
pc = new RTCPeerConnection();
...

Если необходимо использовать TURN сервер, например, встроенный TURN сервер WCS, код должен быть изменен следующим образом:

Code Block
languagejs
themeRDark
let connectionConfig = {
    iceServers: [
        {
            urls: 'turn:wcs:3478?transport=tcp',
            credential: 'coM77EMrV7Cwhyan',
            username: 'flashphoner'
        }
    ],
    iceTransportPolicy: "relay"
};
pc = new RTCPeerConnection(connectionConfig);
...

Здесь:

  • wcs - адрес WCS  сервера;
  • flashphoner - имя пользователя встроенного TURN сервера по умолчанию;
  • coM77EMrV7Cwhyan - пароль встроенного TURN сервера по умолчанию

В этом случае медиа трафик пойдет через TURN сервер, встроенный в WCS. Эту возможность можно использовать также для обертывания WebRTC трафика в TCP при плохом качестве каналов у клиента, т.к. WCS не поддерживает TCP транспорт для SFU потоков.

Известные проблемы

1. Публикация потока, захваченного с какого-либо из окон на экране в нескольких качествах, и сворачивание этого окна приводит к крашу вкладки браузера Chrome

Симптомы: при сворачивании окна, которое захватывается в данный момент, вкладка Chrome,  с которой производится публикация, крашится

Решение: открыт баг в Chromium, до исправления этого бага (исправлен в версии Chrome 98.0.4736.0) публиковать поток, захваченный с какого-либо окна на экране, в одном качестве (без Simulcast)