...
Code Block | ||
---|---|---|
| ||
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
...
language | bash |
---|---|
theme | RDark |
...
Откройте пример SFU client в браузере, например https://demo.flashphoner.com:8888/
...
...
...
2. Распакуйте архив сборки в каталог на Вашем сервере
Code Block | ||||
---|---|---|---|---|
| ||||
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
4. Поток пользователя User1 публикуется в комнате ROOM1
Статистика отправки качества 720p
Статистика отправки качества 360p
5. Откройте страницу примера в другом браузере или в другом окне браузера, введите URL сервера и параметры комнаты такие же, как на шаге 3, имя пользователя User2
6. Поток пользователя User2 проигрывается у окне User1
Мониторинг потоков в комнате
Для мониторинга потоков в комнате используется 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 | ||||
---|---|---|---|---|
| ||||
{
"roomName":"ROOM1"
} |
...
language | js |
---|---|
theme | RDark |
...
client/main.html, введите URL сервера, имя комнаты, пин-код и имя пользователя, нажмите Enter
2. Поток пользователя User1 публикуется в комнате ROOM1
Статистика отправки качества 720p
Статистика отправки качества 360p
3. Откройте страницу примера в другом браузере или в другом окне браузера, введите URL сервера и параметры комнаты такие же, как на шаге 3, имя пользователя User2
4. Поток пользователя User2 проигрывается у окне User1
Мониторинг потоков в комнате
Для мониторинга потоков в комнате используется 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 |
|
| 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 |
fps | FPS видео | 30 |
bitrate | Битрейт видео или аудио, бит/с | 265368 |
sampleRate | Частота дискретизации аудио, Гц | 48000 |
channels | Количество каналов аудио | 2 |
alive | Поток активен | true |
type | Тип потока | VIDEO |
composite | Поток включает несколько дорожек | true |
tracks | Список дорожек в композитном потоке | {} |
Действия над SFU потоками на сервере
В сборке 5.2.1068 добавлена возможность отображения SFU потоков как обычных WebRTC потоков на сервере. Эта возможность включается настройкой
Code Block | ||
---|---|---|
| ||
sfu_bridge_enabled=true |
При этом для каждого участника будет создан поток с именем {room}-{participant}-VIDEO
для видео потока и {room}-{participant}-AUDIO
для аудио. Эти потоки видны в статистике
Code Block | ||
---|---|---|
| ||
-----Stream Stats-----
...
streams_viewers=ROOM1-User1-AUDIO/0;ROOM1-User1-VIDEO/0
streams_synchronization=ROOM1-User1-AUDIO/0;ROOM1-User1-VIDEO/0 |
могут быть проиграны с сервера
записаны по REST API или добавлены в микшер.
При публикации экрана создается поток с именем {room}-{participant}-VIDEO-screen
, например
Code Block | ||
---|---|---|
| ||
-----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 Block | ||||
---|---|---|---|---|
| ||||
pc = new RTCPeerConnection();
... |
Если необходимо использовать TURN сервер, например, встроенный TURN сервер WCS, код должен быть изменен следующим образом:
Code Block | ||||
---|---|---|---|---|
| ||||
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)