В браузере по WebRTC ABR¶
Описание¶
В сборке WCS 5.2.1504 добавлена возможность проигрывания потока с сервера по WebRTC в браузере в нескольких качествах видео, наподобие HLS ABR. При этом браузер автоматически начинает проигрывать первое доступное качество, а клиент может переключаться между ними, при необходимости.
Начиная со сборки WCS 5.2.1663 и SFU SDK 2.0.231 поддерживается автоматическое переключение между доступными качествами ABR при изменении состояния канала. Выбор качества основывается на WebRTC статистике.
Поддерживаемые платформы и браузеры¶
Chrome | Firefox | Safari | Edge | |
---|---|---|---|---|
Windows | ✅ | ✅ | ❌ | ✅ |
Mac OS | ✅ | ✅ | ✅ | ✅ |
Android | ✅ | ✅ | ❌ | ✅ |
iOS | ✅ (iOS 14.4) | ✅ (iOS 14.4) | ✅ | ❌ |
Поддерживаемые способы публикации¶
По WebRTC ABR могут проигрываться потоки, опубликованные на WCS всеми доступными способами:
- WebRTC
- RTMP
- RTSP
- MPEG-TS по UDP или SRT
- Stream mixer
Поддерживаемые кодеки¶
Для проигрывания WebRTC ABR любой поток на сервере будет транскодирован в H264+Opus.
Принципы реализации¶
Для того, чтобы реализовать WebRTC ABR, используются функции SFU с поддержкой Simulcast. При этом видео дорожка потока, опубликованного на сервере, транскодируется в несколько H264 дорожек с различными параметрами, и эти дорожки отправляются клиенту как отдельные качества. Аудио дорожка транскодируется в Opus и также отправляется клиенту. Поскольку основная сущность SFU - комната, на сервере создается комната с именем, соответствующим имени потока.
Настройка¶
Настройка подсистемы SFU¶
Для проигрывания потока, опубликованного на WCS, при помощи SFU Simulcast, необходимо:
- ограничить кодеки, используемые на стороне SFU, до H264 + Opus
- задать возможные профили кодирования H264
- включить мост между ядром WCS и подсистемой SFU
codecs_exclude_sfu=alaw,ulaw,g729,speex16,g722,mpeg4-generic,telephone-event,flv,mpv,vp8,h265
profiles=42e01f,640028
wcs_sfu_bridge_enabled=true
После этого WCS необходимо перезапустить.
Настройка профилей качества¶
Профили качества настраиваются в файле /usr/local/FlashphonerWebCallServer/conf/wcs_sfu_bridge_profiles.yml
. По умолчанию, указаны следующие профили:
profiles:
s :
width : 320
height : 240
bitrate : 500
gop : 60
fps : 30
m :
width : 640
height : 480
bitrate : 800
gop : 60
fps : 30
h :
width : 960
height : 720
bitrate : 1300
gop : 60
fps : 30
Поддерживаются следующие параметры профилей:
height
- высота картинки (обязательный параметр)width
- ширина картинкиbitrate
- битрейт кодирования, в кбит/сgop
- размер группы кадровfps
- количество кадров в секунду
Параметр gop
фактически задает периодичность кодирования ключевых кадров. В примере выше, при 30 кадрах в секунду, ключевой кадр будет формироваться каждые две секунды.
Имена профилей могут быть произвольными и используются для выбора качества на стороне клиента. В примере выше профили можно назвать 240p
, 480p
и 720p
соответственно.
Настройки профилей качества применяются после перезапуска WCS.
Использование одинаковых профилей качества видео для HLS ABR и WebRTC ABR¶
Начиная со сборки 5.2.1665, если описания профилей видео совпадают для HLS ABR и WebRTC ABR, используются одинаковые кодировщики. Например, для WebRTC ABR
profiles:
240p:
height: 240
bitrate: 500
codec: h264
gop: 60
fps: 30
480p:
height: 480
bitrate: 1000
codec: h264
gop: 60
fps: 30
720p:
height: 720
bitrate: 1500
codec: h264
gop: 60
fps: 30
и HLS ABR
profiles:
-240p:
audio:
codec: mpeg4-generic
rate: 48000
channels: 2
groupId: audio
video:
height: 240
bitrate: 500
codec: h264
gop: 60
fps: 30
audioGroupId: audio
-480p:
audio:
codec: mpeg4-generic
rate: 48000
channels: 2
groupId: audio
video:
width: 0
height: 480
bitrate: 1000
codec: h264
gop: 60
fps: 30
audioGroupId: audio
-720p:
audio:
codec: mpeg4-generic
rate: 48000
channels: 2
groupId: audio
video:
width: 0
height: 720
bitrate: 1500
codec: h264
gop: 60
fps: 30
audioGroupId: audio
будет создано 3 кодировщика видео
Должны совпадать следующие параметры профиля видео, если они указаны:
- height
- width (если указана и не равна 0)
- codec
- bitrate
- fps
- gop
- profile
- level
- codecImpl
Сортировка профилей качества видео¶
Начиная со сборки 5.2.1663, профили качества видео сортируются в том порядке, в каком они указаны в файле /usr/local/FlashphonerWebCallServer/conf/wcs_sfu_bridge_profiles.yml
. Например, при настройке
profiles:
240:
height: 240
bitrate: 500
codec: h264
gop: 60
fps: 30
480:
height: 480
bitrate: 1000
codec: h264
gop: 60
fps: 30
720:
height: 720
bitrate: 1500
codec: h264
gop: 60
fps: 30
1080:
height: 1080
bitrate: 3000
codec: h264
gop: 60
fps: 30
клиент получит список профилей в порядке
Если в настройке встречаются два профиля с одинаковыми названиями, возникает неопределенное поведение. В этом случае сервер будет использовать только последний из профилей с одинаковыми именами.
Транскодирование максимального качества только при наличии B-фреймов в исходном потоке¶
Для того, чтобы снизить нагрузку на сервер при кодировании видео, в сборке 5.2.1840 добавлена возможность транскодировать максимальное ABR качество (которое обычно соответствует оригинальному разрешению потока) только при наличии B-фреймов в потоке. Эта возможность включается настройкой
При этом сервер проверяет наличие B-фреймов в исходном потоке, анализируя заданное количество фреймов (по умолчанию 10)
Если в потоке есть B-фреймы, максимальное ABR качество будет транскодироваться, и будет доступно плееру.
Если в потоке нет B-фреймов, максимальное ABR качество не будет транскодироваться. В этом случае оригинальное качество необходимо запросить отдельно с клиента.
Краткое руководство по тестированию¶
-
Для теста используем:
- WCS сервер с настройками WebRTC ABR
- OBS для публикации потока на сервере
- пример WebRTC ABR Player
https://test1.flashphoner.com:8444/client2/sfu/webrtc-abr-player/player.html
для проигрывания потока
-
Опубликуем RTMP поток
test
720p 30 fps c битрейтом 2000 кбит/с
-
Откроем пример WebRTC ABR Player, указав в поле
Stream name
имя потокаtest
, и нажмемPlay
. Начнется проигрывание потока
Известные проблемы¶
-
Не все качества могут быть доступны зрителю, в зависимости от пропускной способности канала. При этом в примере WebRTC ABR Player кнопки тех качеств, которые недоступны, отображаются красным.
-
WebRTC ABR дает повышенную нагрузку на CPU сервера, т.к. на каждый опубликованный на сервере поток создается несколько кодировщиков, в завиcимости от количества профилей.
-
В iOS Safari звук в примере WebRTC ABR Player по умолчанию выключен, на аудио элементе отображается перечеркнутый динамик, т.к. для включения звука iOS Safari требует действия пользователя.