В сборке 5.2.1056 добавлена поддержка WebRTC Selective Forwarding Unit (SFU) с возможностью публикации и проигрывания любого количества потоков в одном WebRTC соединении (Simulcast). Основные области применения:
Chrome | Firefox | Safari 11 | Chromium Edge | |
---|---|---|---|---|
Windows | + | - | + | |
Mac OS | + | - | + | |
Android | + | - | + | |
iOS | + (iOS 14.4) | - | + |
WebRTC video:
WebRTC audio:
Поскольку одним из случаев применения SFU являются видео и аудио конференции, на стороне сервера введена новая сущность - комната. Установив соединение с сервером, пользователь подключается к комнате и может публиковать свои потоки, а также проигрывать все потоки в данной комнате. За пределами комнаты потоки, опубликованные в ней, недоступны.
Пример объекта, задающего конфигурацию комнаты:
"room": { "url": "wss://wcs:8443", "name": "ROOM1", "pin": "1234", "nickName": "User1" } |
Здесь
Пользователь может добавлять и удалять видео и аудио потоки. При добавлении может быть указан набор качеств, и поток будет опубликован в этих качествах. Каждое качество имеет следующие характеристики:
При проигрывании потока пользователю доступны все качества, либо те из них, которые умещаются в канал подписчика. Например, при публикации потока 720p с качествами 720p 900 kbps, 360p 500 kbps и 180p 200 kbps, подписчик может получать только 360p и 180p, если его канала до сервера недостаточно для получения 720p.
Пример настройки публикации медиапотоков в комнате
"media": { "audio": { "tracks": [{ "source": "mic", "channels": 1 }] }, "video": { "tracks": [{ "source": "camera", "width": 1280, "height": 720, "codec": "H264", "encodings": [ { "rid": "h", "active": true, "maxBitrate": 900000 }, { "rid": "m", "active": true, "maxBitrate": 300000, "scaleResolutionDownBy": 2 } ] }] } } |
Здесь
Параметры качества указываются в соответствии с описанием RTCRtpEncodingParameters.
По умолчанию, даже если в параметрах публикации задан кодек H264, в комнате будут публиковаться потоки VP8. Чтобы публиковать H264, необходимо:
codecs_exclude_sfu=alaw,ulaw,g729,speex16,g722,mpeg4-generic,telephone-event,flv,mpv webrtc_cc_min_bitrate=1000000 profiles=42e01f,640028 |
Отметим, что публикация и проигрывание большого числа VP8 потоков в нескольких качествах потребляет ресурсы клиентского ПК. Если ресурсов не хватает, следует предпочесть H264, поскольку большинство браузеров поддерживают аппаратное ускорение для данного кодека.
1. Откройте пример SFU client в браузере, например https://test1.flashphoner.com:8444/client2/sfu/examples/client/main.html, введите URL сервера, имя комнаты, пин-код и имя пользователя, нажмите Enter
2. Поток пользователя User1 публикуется в комнате ROOM1
Статистика отправки качества 720p
Статистика отправки качества 360p
3. Откройте страницу примера в другом браузере или в другом окне браузера, введите URL сервера и параметры комнаты такие же, как на шаге 3, имя пользователя User2
4. Поток пользователя User2 проигрывается у окне User1
Для мониторинга потоков в комнате используется REST API
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
Здесь:
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 | Список дорожек в композитном потоке | {} |
В сборке 5.2.1068 добавлена возможность отображения SFU потоков как обычных WebRTC потоков на сервере. Эта возможность включается настройкой
sfu_bridge_enabled=true |
При этом для каждого участника будет создан поток с именем {room}-{participant}-VIDEO
для видео потока и {room}-{participant}-AUDIO
для аудио. Эти потоки видны в статистике
-----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
, например
-----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 будет доступен только один поток.