Микшер реального времени с функцией MCU¶
В сборке 5.2.607 добавлена функция микшера реального времени. Эта функция, в сочетании с MCU, предназначена для организации видеоконференций в реальном времени. В отличие от предшествующей реализации, микшер реального времени не приостанавливает выходной поток, если какой-либо из входящих потоков начинает запаздывать (как правило, в результате помех на канале публикации), и не ждет восстановления потока, качество которого ухудшилось.
Настройка¶
Микшер реального времени включен по умолчанию
Также по умолчанию включено автоматическое создание микшера при публикации потока с именем вида user1#room1
Для организации конференций, необходимо также включить поддержку MCU
Рекомендуется уменьшить длительность работы микшера без входящих потоков
При необходимости, также может быть включено отображение имени потока
при этом для потоков с видео надпись выводится в левом нижнем углу, для аудио потоков надпись выводится по центру.
Отображение индикатора речи в виде зеленой рамки включено по умолчанию
Поддерживаются и остальные настройки микшера. Отметим, что не рекомендуется включать собственный losless видеопроцессор, поскольку функция реального времени в этом случае не будет работать.
Управление надписями¶
Основные параметры и размер шрифта¶
В зависимости от разрешения выходного потока микшера, может быть изменен размер шрифта надписей:
- для видео потоков размер шрифта по умолчанию составляет 20 пунктов
- для аудио потоков размер шрифта по умолчанию составляет 40 пунктов
Текст всегда выводится на фоне прямоугольника. Можно управлять следующими параметрами фона:
Параметр | Значение по умолчанию в пикселях |
Описание |
---|---|---|
mixer_text_cut_top |
3 | Обрезка текста сверху |
mixer_text_padding_bottom |
5 | Дополнение фона снизу |
mixer_text_padding_left |
5 | Дополнение фона слева |
mixer_text_padding_right |
4 | Дополнение фона справа |
mixer_text_padding_top |
5 | Дополнение фона сверху |
Цвет текста, фон и прозрачность¶
В сборке 5.2.741 добавлена возможность управления цветом текста и фона при помощи настроек
Цвет может задаваться в виде шестнадцатеричного значения c префиксом #
или 0x
, в формате #RRGGBB
. При настройках, указанных выше, будет выведен желтый текст на циановом фоне:
Для участников без видео, указанным фоном заливается весь прямоугольник.
В сборке 5.2.770 добавлено управление прозрачностью фона при помощи настройки
Прозрачность задается в процентах: 0 соответствует полной прозрачности, 100 процентов соответствуют полной непрозрачности (фон будет окрашен заданным цветом). По умолчанию, значение установлено в 100 (фон непрозрачный).
Шрифт¶
В сборке 5.2.770 добавлена возможность выбрать шрифт надписей при помощи настройки
По умолчанию установлено значение Serif
. Шрифты могут быть выбраны только из списка X11 шрифтов, например:
[root@centos76 ~]# fc-list | grep X11
/usr/share/X11/fonts/Type1/c0611bt_.pfb: Courier 10 Pitch:style=Bold Italic
/usr/share/X11/fonts/Type1/UTBI____.pfa: Utopia:style=Bold Italic
/usr/share/X11/fonts/Type1/c0419bt_.pfb: Courier 10 Pitch:style=Regular
/usr/share/X11/fonts/Type1/c0648bt_.pfb: Bitstream Charter:style=Regular
/usr/share/X11/fonts/Type1/cursor.pfa: Cursor:style=Regular
/usr/share/X11/fonts/Type1/UTB_____.pfa: Utopia:style=Bold
/usr/share/X11/fonts/Type1/c0583bt_.pfb: Courier 10 Pitch:style=Bold
/usr/share/X11/fonts/Type1/UTI_____.pfa: Utopia:style=Italic
/usr/share/X11/fonts/Type1/c0582bt_.pfb: Courier 10 Pitch:style=Italic
/usr/share/X11/fonts/Type1/c0633bt_.pfb: Bitstream Charter:style=Bold Italic
/usr/share/X11/fonts/Type1/c0649bt_.pfb: Bitstream Charter:style=Italic
/usr/share/X11/fonts/Type1/c0632bt_.pfb: Bitstream Charter:style=Bold
/usr/share/X11/fonts/Type1/UTRG____.pfa: Utopia:style=Regular
Имя шрифта необходимо указывать полностью, например
Если указанного шрифта нет в системе, будет использован шрифт, установленный в системе по умолчанию.
Если выбранный шрифт не содержит символов, которые есть в тексте надписи, эти символы выведены не будут.
Автоматическое масштабирование текста под размер картинки¶
В сборке 5.2.709 добавлено автоматическое масштабирование надписей под размер картинки. Эта возможность включена по умолчанию настройкой
Если один или более из потоков публикуют экран, включается специальный вариант размещения картинок, при этом по умолчанию текст для изображения экрана масштабируется независимо от остальных картинок
Минимальный размер шрифта при масштабировании задается настройкой
и по умолчанию составляет 1 пункт.
Отображение имени комнаты (микшера)¶
В сборке 5.2.770 добавлена возможность отключить отображение имени комнаты, указанного в имени потока при автоматическом добавлении в микшер. Это может быть сделано при помощи настройки
При этом для потока user1#room1
будет отображаться надпись user1
(без имени комнаты и спецсимвола).
Отображение заданной метки потока¶
В сборке 5.2.816 добавлена возможность отображения заданной метки потока. Фактически, для отображения может быть задано произвольное имя, в том числе и с использованием национальных алфавитов.
Метка должна быть указана в имени потока как параметр при публикации, например
session.createStream({
streamName: "test1#m1?label=John Doe",
display: localDisplay,
...
}).publish();
В этом случае в микшере отобразится значение метки, в том числе и для потоков только с аудио
В метках поддерживаются национальные символы, а также
Символ +
при отображении будет заменен на пробел, т.е. в примере выше можно публиковать поток и с меткой
Присвоение или изменение метки потока по REST API¶
В сборке 5.2.1635 добавлена возможность присвоить метку потока при добавлении в микшер REST API запросом /mixer/add
У потока, который уже добавлен в микшер, метку можно изменить запросом /mixer/set_stream_label
или
{
"uri":"mixer://m1",
"remoteMediaSessionId":"95bf2be8-f459-4f62-9a7f-c588f33e0ad3",
"streamLabel": "Mr. John Doe"
}
Метку также можно очистить, если передать пустую строку в качестве streamLabel
{
"uri":"mixer://m1",
"remoteMediaSessionId":"95bf2be8-f459-4f62-9a7f-c588f33e0ad3",
"streamLabel": ""
}
В этом случае будет отображаться имя потока, под которым он опубликован.
Расположение надписи¶
Устаревшая настройка в сборках от 5.2.844 до 5.2.1077¶
Warning
Данная настройка не поддерживается в сборке 5.2.1079 и новее!
В сборке 5.2.844 добавлено управление расположением надписей видео потоков. По умолчанию надпись располагается в левом нижнем углу видео.
Добавлена возможность отображения надписи над видео при помощи настройки
или под видео
Расстояние между видео и соответствующей ему надписью можно изменить с помощью настройки
Размещение надписей над или под картинкой влияет на расположение картинок и в том случае. если отображение надписей отключено.
Актуальная настройка в сборках 5.2.1079 и новее¶
В сборке 5.2.1079 для управления расположение подписи кадра в микшере добавлена настройка
Возможные значения
Значение | Положение надписи |
---|---|
TOP_LEFT |
Слева вверху |
TOP_CENTER |
Вверху по центру |
TOP_RIGHT |
Справа вверху |
CENTER |
По центру кадра |
BOTTOM_LEFT |
Слева внизу (по умолчанию) |
BOTTOM_CENTER |
Внизу по центру |
BOTTOM_RIGHT |
Справа внизу |
EXTERNAL_TOP_CENTER |
Над картинкой по центру |
EXTERNAL_BOTTOM_CENTER |
Под картинкой по центру |
По умолчанию, подписи располагаются в левом нижнем углу картинки.
Значения EXTERNAL_TOP_CENTER
и EXTERNAL_BOTTOM_CENTER
заменяют настройку mixer_text_outside_frame
. Например, значение
действует так же, как mixer_text_outside_frame=BOTTOM
Управление индикатором речи и аудио потоками¶
Толщина и расположение¶
Для рамки индикатора речи можно задавать толщину (по умолчанию 6 пикселей)
По умолчанию, рамка выводится снаружи картинки потока. Однако, если картинки потоков расположены близко друг к другу, например, при использовании CenterNoPaddingGridLayout
, рамка может затрагивать соседние картинки
В этом случае необходимо включить отображение рамки внутри картинки потока
Отображение потоков только с аудио¶
По умолчанию, если в микшер добавить только аудио из потока, этот поток показывается в отдельной рамке с индикатором речи (см выше). Если необходимо добавить к микшеру звук из потока без отображения отдельного участника (например, для комментирования или озвучки), это можно сделать при помощи настройки
До сборки 5.2.965 такой поток должен содержать аудио и видео, и должен быть добавлен в микшер запросом /mixer/add
Начиная со сборки 5.2.965, поток, не содержащий видео, также не будет отображаться при использовании данной настройки
Начиная со сборки 5.2.1359, настройка mixer_show_separate_audio_frame
влияет на отображение потока, если аудио фреймы начинают поступать раньше, чем видео. При настройке по умолчанию в этом случае отобразится рамка с индикатором речи, затем, при получении видео фрейма, отобразится видео. При
рамка не будет отображаться до поступления видео фреймов.
Отображение аватаров на потоках только с аудио¶
Warning
В сборках 5.2.1710 - 5.2.1725 данная возможность поддерживается только на Ubuntu 20.04 и других системах с glibc 2.31 и новее
Начиная со сборки 5.2.1727, данная возможность поддерживается в Centos 7.6 (glibc 2.17) и более новых системах
В сборке 5.2.1710 добавлена возможность присвоить аудио потоку картинку аватара в формате PNG (с поддержкой прозрачности), JPG или BMP. Картинку можно установить при добавлении потока в микшер REST API запросом /mixer/add
:
{
"uri": "mixer://mixer1",
"remoteStreamName": "user2",
"hasVideo": false,
"hasAudio": true,
"avatar": "https://mystorage.com/storage/avatar.png"
}
или для потока, уже добавленного в микшер, REST API запросом /mixer/set_stream_avatar
:
{
"uri": "mixer://mixer1",
"remoteStreamName": "user2",
"avatar": "https://mystorage.com/storage/avatar.png"
}
Поддерживаются следующие способы указания картинки:
- HTTP URL:
https://mystorage.com/storage/avatar.png
- file URI:
file:///opt/avatar.png
- локальное расположение файла:
/opt/avatar.png
Аудио поток в микшере при этом выглядит так
Если в микшере включено отображение имен потоков, имя аудио потока в этом случае будет размещено там же, где и имя видео потока.
Убрать картинку аватара можно REST API запросом /mixer/remove_stream_avatar
:
В сборке 5.2.1858 добавлена возможность назначать картинки аватаров автоматически, не используя REST API, по имени потока. В этом случае файлы картинок должны быть помещены в каталог
Имя файла должно соответствовать имени потока. Например, к потоку stream1
применится аватар stream1.png
. Если поток был добавлен в микшер автоматически, например stream1#mixer1
, имя микшера не используется, только имя потока до символа #
.
Attention
Назначение картинки аватара при помощи REST API запроса /mixer/set_stream_avatar
имеет приоритет над автоматическим назначением картинки
Цвет рамки¶
В сборке 5.2.741 добавлена возможность управления цветом рамки индикатора речи при помощи настройки
Цвет может задаваться в виде шестнадцатеричного значения c префиксом #
или 0x
, в формате #RRGGBB
. При настройке, указанных выше, рамка индикатора речи будет красной.
Отображение рамки при тишине в аудио потоке¶
По умолчанию, при обычном темпе речи выступающего рамка индикатора может мигать, что может быть некомфортно для восприятия. В связи с этим, в сборке 5.2.775 добавлена возможность задать интервал времени, в течение которого рамка индикатора речи продолжит отображаться при тишине в потоке. Эта возможность включается настройкой
В данном случае, рамка будет показываться в течение 500 миллисекунд после наступления тишины.
По умолчанию, интервал установлен в 0, рамка индикатора гаснет без задержки.
Управление фоном микшера¶
По умолчанию, используется черный фон микшера. В сборке 5.2.645 добавлена возможность указать файл PNG, картинка из которого будет использована в качестве фона. Например. чтобы заменить фон на голубой, подготовьте картинку blue.png и укажите в настройке
Если путь к файлу не указан, картинка должна располагаться в каталоге /usr/local/FlashphonerWebCallServer/conf
. Файл может располагаться и в любом другом каталоге, в этом случае в настройке указывается полный путь к файлу
Картинка будет масштабирована к разрешению выходного потока микшера
Управление соотношением сторон audio only потоков¶
По умолчанию, соотношение сторон картинки audio only потока установлено в соответствии с соотношение сторон микшера (16:9)
mixer_audio_only_width=640
mixer_audio_only_height=360
mixer_video_width=1280
mixer_video_height=720
При необходимости, это можно изменить вместе с микшером, например к 4:3
mixer_audio_only_width=640
mixer_audio_only_height=480
mixer_video_width=1280
mixer_video_height=960
Отметим, что настройки соотношения сторон картинки audio only потока меняется только при перезапуске сервера.
Поддержка многопоточности и оптимизация для работы в условиях больших нагрузок¶
В сборке 5.2.793 была добавлена возможность многопоточного микширования для оптимизации работы микшера в условиях большого количества участников. Эта возможность включается настройками
Количество процессорных потоков для микширования аудио и видео задается следующими настройками
Как правило, при использовании MCU микшер кодирует один видео поток и множество аудио, по два потока на каждого участника плюс один общий аудио поток. Поэтому рекомендуется задавать число процессорных потоков для кодирования аудио больше, чем для кодирования видео. Кроме того, если в случае MCU микшера в выходном потоке видны фризы, рекомендуется включить многопоточную доставку результата микширования в основной движок сервера, для дальнейшей раздачи подписчикам
Если количество участников меньше, чем заданное количество потоков микширования (например, 3 участника), для микширования будет использоваться один процессорный поток.
Тонкая настройка микшера реального времени¶
Тонкие настройки микшера реального времени регулируются следующими параметрами
Параметр | Значение по умолчанию | Описание |
---|---|---|
mixer_audio_silence_threshold |
-50.00 | Уровень тишины аудиосоставляющей входящего потока, в Дб |
mixer_debug_mode |
false | Добавление отладочной информации к подписи под картинкой потока |
mixer_in_buffering_ms |
200 | Размер буфера видеосоставляющей входящего потока, в миллисекундах |
mixer_incoming_time_rate_lower_threshold |
0.95 | Граница отставания времени входящего потока от времени микшера, в относительных единицах |
mixer_incoming_time_rate_upper_threshold |
1.05 | Граница опережения временем входящего потока времени микшера, в относительных единицах |
mixer_video_stable_fps_threshold |
15 | Граница FPS входящего потока, для потоков с низким FPS буферизация видео составляющей не будет запускаться |
audio_mixer_max_delay |
300 | Максимальное время, в течение которого могут отсутствовать аудио пакеты во входящем потоке, в миллисекундах, по истечении этого времени поток не микшируется до поступления новых медиаданных |
Тестирование¶
-
Для теста используем:
- демо-сервер demo.flashphoner.com;
- браузер Chrome;
- веб-приложение MCU Client для организации конференции.
-
Откройте страницу веб-приложения MCU Client. Введите имя пользователя
user1
и имя комнатыroom1
-
Нажмите кнопку
Join
. Будет опубликован поток с Вашей веб-камеры и добавлен в микшер, затем отобразится выходной поток микшера без аудио с Вашего микрофона
-
В другой вкладке браузера, в другом браузере или на другом ПК откройте страницу приложения MCU Client. Введите имя пользователя
user2
и имя комнатыroom1
-
Нажмите кнопку
Join
. Будет опубликован поток с Вашей веб-камеры и добавлен в микшер от имени пользователяuser2
, затем отобразится выходной поток микшера с потоками пользователей, но без аудио отuser2
-
У пользователя
user1
также играется два видеопотока в микшере и аудио отuser2
-
Нажмите
Leave
для выхода из комнаты в обоих вкладках/браузерах
Последовательность выполнения операций¶
Последовательность выполнения операций при создании конференции на базе микшера реального времени приведена в описании примера MCU Client.
Рекомендации для входящих потоков¶
При задержках во входящем потоке от одного из участников, в микшере реального времени этот поток будет останавливаться. Для минимизации задержек во входящих потоках, рекомендуется:
-
Для RTMP потоков подбирать параметры кодирования таким образом, чтобы:
- производительности клиентского кодировщика было достаточно для своевременной передачи кадров потока
- разрешение и битрейт потока помещались в канал публикации от клиента до сервера
-
Для WebRTC потоков не поднимать минимальный порог битрейта видео выше, чем задан в настройке сервера
Это даст возможность браузеру публикующего клиента адаптировать поток к ухудшениям качества канала. При снижении битрейта качество картинки также может снизиться, но фризов в потоке участника в этом случае не будет.webrtc_cc_min_bitrate
. По умолчанию, нижняя граница битрейта установлена в 30 кбит/с
Добавление одного потока в несколько микшеров¶
Начиная со сборки 5.2.732 один поток может быть добавлен в несколько микшеров реального времени одновременно. Отметим, что для этого должен быть включен микшер реального времени
и отключен собственный losless видеопроцессор
Известные проблемы¶
1. При включении собственного losless видеопроцессора функции реального времени отключаются¶
При включении собственного losless видеопроцессора функции реального времени отключаются, при этом входящие потоки перестают играть
Симптомы
Потоки, добавленные в микшер, перестают играть
Решение
Не используйте собственный losless видеопроцессор с микшером реального времени
2. Для отображения надписей в микшере необходима библиотека fontconfig
¶
Для отображения надписей в микшере может потребоваться установка библиотеки fontconfig
Симптомы
Потоки не добавляются в микшер, в серверный лог выводится исключение
09:17:11,756 ERROR MixerAgent - MIXER-AGENT-mixer://mixervmixdr52-9d46cd04-5867-4d74-a9d9-baf67f74e7d2 Mixer closed due to error
java.lang.InternalError: java.lang.reflect.InvocationTargetException
at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:86)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:310)
at java.desktop/sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
at java.desktop/sun.font.SunFontManager.getInstance(SunFontManager.java:247)
at java.desktop/sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:265)
at java.desktop/java.awt.Font.getStringBounds(Font.java:2606)
at java.desktop/java.awt.Font.getStringBounds(Font.java:2516)
at com.flashphoner.media.N.A.A.A(Unknown Source)
at com.flashphoner.media.mixer.video.presentation.Canvas.computeTextScales(Unknown Source)
at com.flashphoner.media.mixer.video.presentation.Canvas.writeNative(Unknown Source)
at com.flashphoner.media.N.A.A(Unknown Source)
at com.flashphoner.media.N.D.D(Unknown Source)
at com.flashphoner.media.N.D.A(Unknown Source)
at com.flashphoner.server.remote.B.B.Г™(Unknown Source)
at com.flashphoner.server.remote.B.B.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:84)
... 14 more
Caused by: java.lang.NullPointerException
at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1262)
at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:225)
at java.desktop/sun.awt.FontConfiguration.init(FontConfiguration.java:107)
at java.desktop/sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:719)
at java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:367)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:310)
at java.desktop/sun.font.SunFontManager.<init>(SunFontManager.java:312)
at java.desktop/sun.awt.FcFontManager.<init>(FcFontManager.java:35)
at java.desktop/sun.awt.X11FontManager.<init>(X11FontManager.java:56)
... 20 more
3. При маленькой картинке участника, имя участника может заползать на рамку индикатора речи¶
При большом количестве участников в микшере, если картинка отдельного участника достаточно маленькая, имя участника может отрисовываться поверх рамки индикатора речи
Симптомы
При небольшом размере картинки участника (например, в режиме публикации экрана в микшер) имя участника отображается поверх рамки индикатора речи
Решение
Включить отрисовку рамки индикатора речи внутри картинки участника и уменьшить толщину рамки
4. Выходной поток микшера может играть неплавно, если в потоке участника есть B-фреймы¶
При публикации в микшер потока, необходимо избегать B-фреймов в потоке, либо увеличивать буфер на входе микшера
Симптомы
При публикации в микшер потока, закодированного по профилю Main с B-фреймами, выходной поток микшера играет не плавно, есть короткие фризы с пропаданием звука
Решение
a) кодировать поток без B-фреймов (предпочтительно)
b) увеличить размер буфера на входе микшера (может дать дополнительную задержку)
5. Входящий поток с высоким FPS дает дополнительную нагрузку на CPU сервера¶
Публикация видео 60 FPS в микшер дает дополнительную нагрузку на CPU и системную память
Симптомы
Возрастание нагрузки на CPU, расход системной памяти (не Java heap) при публикации в микшер потока 60 FPS
Решение
Использовать более мощный сервер либо публиковать в микшер потоки 30 FPS
6. При большом количестве участников надписи могут подергиваться¶
Симптомы
При большом (более 10) количестве участников в микшере надписи на картинках участников подергиваются
Решение
Применить следующие настройки
7. При одновременном разговоре большого количества участников некоторых участников слышно хуже, чем других¶
При одновременном разговоре большого количества участников некоторых участников слышно хуже, чем других. Проблема характерна для микширования WebRTC потоков, и проявляется в любых решениях, использующих WebRTC и микширование звука, например, в Discord: чем больше данных приходится кодировать в один поток, тем больше семплов аудио может быть отброшено из-за фиксированной частоты дискретизации.
Симптомы
При одновременном разговоре трех и более участников одного из них слышно хуже, чем двух других
Решение
Увеличить битрейт публикации звука и таким образом отправить больше данных на одного участника
и увеличить битрейт кодирования в Opus на сервере
8. При остановке трафика во входящем потоке, этот поток больше не будет кодироваться в микшере¶
Симптомы
При остановке трафика, например, при сворачивании окна приложения, с которого захватывается поток скриншаринга, в микшере этот поток фризит без восстановления
Решение
Снизить минимальный порог FPS для потоков, входящих в микшер
9. При снижении битрейта или fps публикации битрейт потока микшера может быть нестабильным¶
Симптомы
При снижении битрейта и/или fps входящего потока битрейт выходного потока микшера становится нестабильным
Решение
Обновить WCS до сборки 5.2.1843 или новее и включить настройку
10. Щелчки в микшере для потока с потерями¶
Для потока, публикуемого в микшер с потерями на канале, в аудио в микшере могут быть слышны щелчки
Симптомы
Щелчки и микрофризы потока в микшере