...
При этом для потока "user1#room1" будет отображаться надпись "user1" (без имени комнаты и спецсимвола).
Управление индикатором речи
Для рамки индикатора речи можно задавать толщину (по умолчанию 6 пикселей)
Code Block | ||
---|---|---|
| ||
mixer_voice_activity_frame_thickness=6 |
По умолчанию, рамка выводится снаружи картинки потока. Однако, если картинки потоков расположены близко друг к другу, например, при использовании CenterNoPaddingGridLayout
, рамка может затрагивать соседние картинки
...
Отображение заданной метки потока
В сборке 5.2.816 добавлена возможность отображения заданной метки потока. Фактически, для отображения может быть задано произвольное имя, в том числе и с использованием национальных алфавитов.
Метка должна быть указана в имени потока как параметр при публикации, например
Code Block | ||||
---|---|---|---|---|
| ||||
session.createStream({
streamName: "test1#m1?label=John Doe",
display: localDisplay,
...
}).publish(); |
В этом случае в микшере отобразится значение метки, в том числе и для потоков только с аудио
В метках поддерживаются национальные символы, а также
Code Block | ||
---|---|---|
| ||
mixer_voice_activity_frame_position_inner=true |
По умолчанию, если в микшер добавить только аудио из потока, этот поток показывается в отдельной рамке с индикатором речи (см выше). Если необходимо добавить к микшеру звук из потока без отображения отдельного участника (например, для комментирования или озвучки), это можно сделать при помощи настройки
Code Block | ||
---|---|---|
| ||
mixer_show_separate_audio_frame=false~!@#№$%^*()-_,.;:[]{}<>/|\ |
Символ '+' при отображении будет заменен на пробел, т.е. в примере выше можно публиковать поток и с меткой
Code Block | ||
---|---|---|
| ||
test1#m1?label=John+Doe |
Присвоение или изменение метки потока по REST API
В сборке 5.2.741 добавлена возможность управления цветом рамки индикатора речи при помощи настройки
...
1635 добавлена возможность присвоить метку потока при добавлении в микшер REST API запросом /mixer/add
Code Block | ||||
---|---|---|---|---|
| ||||
mixer_voice_activity_colour=#FF0000 |
Цвет может задаваться в виде шестнадцатеричного значения c префиксом # или 0x, в формате #RRGGBB. При настройке, указанных выше, рамка индикатора речи будет красной.
Управление фоном микшера
По умолчанию, используется черный фон микшера. В сборке 5.2.645 добавлена возможность указать файл PNG, картинка из которого будет использована в качестве фона. Например. чтобы заменить фон на голубой, подготовьте картинку blue.png и укажите в настройке
Code Block | ||
---|---|---|
| ||
mixer_video_background_filename=blue.png |
Если путь к файлу не указан, картинка должна располагаться в каталоге /usr/local/FlashphonerWebCallServer/conf. Файл может располагаться и в любом другом каталоге, в этом случае в настройке указывается полный путь к файлу
Code Block | ||
---|---|---|
| ||
mixer_video_background_filename=/opt/media/blue.png |
Картинка будет масштабирована к разрешению выходного потока микшера
Управление соотношением сторон audio only потоков
По умолчанию, соотношение сторон картинки audio only потока установлено в соответствии с соотношение сторон микшера (16:9)
Code Block | ||
---|---|---|
| ||
mixer_audio_only_width=640
mixer_audio_only_height=360
mixer_video_width=1280
mixer_video_height=720 |
При необходимости, это можно изменить вместе с микшером, например к 4:3
Code Block | ||
---|---|---|
| ||
mixer_audio_only_width=640
mixer_audio_only_height=480
mixer_video_width=1280
mixer_video_height=960 |
Отметим, что настройки соотношения сторон картинки audio only потока меняется только при перезапуске сервера.
Тонкая настройка микшера реального времени
Тонкие настройки микшера реального времени регулируются следующими параметрами
...
Параметр
...
Значение по умолчанию
...
Описание
...
mixer_in_buffering_ms
...
200
...
Размер буфера видеосоставляющей входящего потока, в миллисекундах
...
Тестирование
1. Для теста используем
- демо-сервер demo.flashphoner.com;
- браузер Chrome;
- веб-приложение MCU Client для организации конференции.
2. Откройте страницу веб-приложения MCU Client. Введите имя пользователя user1 и имя комнаты room1
2. Нажмите кнопку Join. Будет опубликован поток с Вашей веб-камеры и добавлен в микшер, затем отобразится выходной поток микшера без аудио с Вашего микрофона
3. В другой вкладке браузера, в другом браузере или на другом ПК откройте страницу приложения MCU Client. Введите имя пользователя user2 и имя комнаты room1
4. Нажмите кнопку Join. Будет опубликован поток с Вашей веб-камеры и добавлен в микшер от имени пользователя user2, затем отобразится выходной поток микшера с потоками пользователей, но без аудио от user2
5. У пользователя user1 также играется два видеопотока в микшере и аудио от user2
6. Нажмите Leave для выхода из комнаты в обоих вкладках/браузерах
Последовательность выполнения операций
Последовательность выполнения операций при создании конференции на базе микшера реального времени приведена в описании примера MCU Client.
Рекомендации для входящих потоков
При задержках во входящем потоке от одного из участников, в микшере реального времени этот поток будет останавливаться. Для минимизации задержек во входящих потоках, рекомендуется:
1. Для RTMP потоков подбирать параметры кодирования таким образом, чтобы:
- производительности клиентского кодировщика было достаточно для своевременной передачи кадров потока
- разрешение и битрейт потока помещались в канал публикации от клиента до сервера
2. Для WebRTC потоков не поднимать минимальный порог битрейта видео выше, чем задан в настройке сервера webrtc_cc_min_bitrate
. По умолчанию, нижняя граница битрейта установлена в 30 кбит/с
Code Block | ||
---|---|---|
| ||
webrtc_cc_min_bitrate=30000 |
Это даст возможность браузеру публикующего клиента адаптировать поток к ухудшениям качества канала. При снижении битрейта качество картинки также может снизиться, но фризов в потоке участника в этом случае не будет.
Добавление одного потока в несколько микшеров
Начиная со сборки 5.2.732 один поток может быть добавлен в несколько микшеров реального времени одновременно. Отметим, что для этого должен быть включен микшер реального времени
Code Block | ||
---|---|---|
| ||
mixer_realtime=true |
и отключен собственный losless видеопроцессор
Code Block | ||
---|---|---|
| ||
mixer_lossless_video_processor_enabled=false |
Известные проблемы
1. При включении собственного losless видеопроцессора функции реального времени отключаются, при этом входящие потоки перестают играть
Симптомы: потоки, добавленные в микшер, перестают играть
...
{
"uri": "mixer://mixer1",
"remoteStreamName": "stream1",
"streamLabel": "John Doe"
} |
У потока, который уже добавлен в микшер, метку можно изменить запросом /mixer/set_stream_label
Code Block | ||||
---|---|---|---|---|
| ||||
{
"uri":"mixer://m1",
"remoteStreamName":"stream1",
"streamLabel": "Mr. John Doe"
} |
или
Code Block | ||||
---|---|---|---|---|
| ||||
{
"uri":"mixer://m1",
"remoteMediaSessionId":"95bf2be8-f459-4f62-9a7f-c588f33e0ad3",
"streamLabel": "Mr. John Doe"
} |
Метку также можно очистить, если передать пустую строку в качестве streamLabel
Code Block | ||||
---|---|---|---|---|
| ||||
{
"uri":"mixer://m1",
"remoteMediaSessionId":"95bf2be8-f459-4f62-9a7f-c588f33e0ad3",
"streamLabel": ""
} |
В этом случае будет отображаться имя потока, под которым он опубликован
Расположение надписи
Устаревшая настройка в сборках от 5.2.844 до 5.2.1077
Warning |
---|
Данная настройка не поддерживается в сборке 5.2.1079 и новее! |
В сборке 5.2.844 добавлено управление расположением надписей видео потоков. По умолчанию надпись располагается в левом нижнем углу видео.
Добавлена возможность отображения надписи над видео при помощи настройки
Code Block | ||
---|---|---|
| ||
mixer_text_outside_frame=TOP |
или под видео
Code Block | ||
---|---|---|
| ||
mixer_text_outside_frame=BOTTOM |
Расстояние между видео и соответствующей ему надписью можно изменить с помощью настройки
Code Block | ||
---|---|---|
| ||
mixer_text_outside_frame_padding=70 |
Размещение надписей над или под картинкой влияет на расположение картинок и в том случае. если отображение надписей отключено.
Актуальная настройка в сборках 5.2.1079 и новее
В сборке 5.2.1079 для управления расположение подписи кадра в микшере добавлена настройка
Code Block | ||
---|---|---|
| ||
mixer_text_align=BOTTOM_LEFT |
Возможные значения
Значение | Положение надписи |
---|---|
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
. Например, значение
Code Block | ||
---|---|---|
| ||
mixer_text_align=EXTERNAL_BOTTOM_CENTER |
действует так же, как mixer_text_outside_frame=BOTTOM
Управление индикатором речи
Толщина и расположение
Для рамки индикатора речи можно задавать толщину (по умолчанию 6 пикселей)
Code Block | ||
---|---|---|
| ||
mixer_voice_activity_frame_thickness=6 |
По умолчанию, рамка выводится снаружи картинки потока. Однако, если картинки потоков расположены близко друг к другу, например, при использовании CenterNoPaddingGridLayout
, рамка может затрагивать соседние картинки
В этом случае необходимо включить отображение рамки внутри картинки потока
Code Block | ||
---|---|---|
| ||
mixer_voice_activity_frame_position_inner=true |
Отображение потоков только с аудио
По умолчанию, если в микшер добавить только аудио из потока, этот поток показывается в отдельной рамке с индикатором речи (см выше). Если необходимо добавить к микшеру звук из потока без отображения отдельного участника (например, для комментирования или озвучки), это можно сделать при помощи настройки
Code Block | ||
---|---|---|
| ||
mixer_losslessshow_videoseparate_processoraudio_enabledframe=false |
2. Для отображения надписей в микшере может потребоваться установка библиотеки fontconfig
Симптомы: потоки не добавляются в микшер, в серверный лог выводится исключение
...
До сборки 5.2.965 такой поток должен содержать аудио и видео, и должен быть добавлен в микшер запросом /mixer/add
Code Block | ||||
---|---|---|---|---|
| ||||
09:17:11,756 ERROR{ "uri": "mixer://mixer1", "remoteStreamName": "stream_dub", 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 |
Решение: установить библиотеку fontconfig
Code Block | ||||
---|---|---|---|---|
| ||||
sudo yum install -y fontconfig |
3. При большом количестве участников в микшере, имя участника может отрисовываться поверх рамки индикатора речи
Симптомы: при небольшом размере картинки участника (например, в режиме публикации экрана в микшер) имя участника отображается поверх рамки индикатора речи
Решение: включить отрисовку рамки индикатора речи внутри картинки участника и уменьшить толщину рамки
Code Block | ||
---|---|---|
| ||
mixer_voice_activity_frame_position_inner=true
mixer_voice_activity_frame_thickness=2 |
4. При публикации в микшер потока, необходимо избегать B-фреймов в потоке, либо увеличивать буфер на входе микшера
Симптомы: при публикации в микшер потока, закодированного по профилю Main с B-фреймами, выходной поток микшера играет не плавно, есть короткие фризы с пропаданием звука
Решение:
a) кодировать поток без B-фреймов
b) увеличить размер буфера на входе микшера
Code Block | ||
---|---|---|
| ||
mixer_in_buffering_ms=600 |
5. Публикация видео 60 FPS в микшер дает дополнительную нагрузку на CPU и память
Симптомы: возрастание нагрузки на CPU, расход RES памяти при публикации в микшер потока 60 FPS
...
"hasVideo":false,
"hasAudio":true
} |
Начиная со сборки 5.2.965, поток, не содержащий видео, также не будет отображаться при использовании данной настройки
Начиная со сборки 5.2.1359, настройка mixer_show_separate_audio_frame
влияет на отображение потока, если аудио фреймы начинают поступать раньше, чем видео. При настройке по умолчанию в этом случае отобразится рамка с индикатором речи, затем, при получении видео фрейма, отобразится видео. При
Code Block | ||
---|---|---|
| ||
mixer_show_separate_audio_frame=false |
рамка не будет отображаться до поступления видео фреймов.
Отображение аватаров на потоках только с аудио
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. Картинку можно установить при добавлении потока в микшер запросом /mixer/add
:
Code Block | ||||
---|---|---|---|---|
| ||||
{
"uri": "mixer://mixer1",
"remoteStreamName": "user2",
"hasVideo": false,
"hasAudio": true,
"avatar": "https://mystorage.com/storage/avatar.png"
} |
или для потока, уже добавленного в микшер, запросом /mixer/set_stream_avatar
:
Code Block | ||||
---|---|---|---|---|
| ||||
{
"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
Аудио поток в микшере при этом выглядит так
Если в микшере включено отображение имен потоков, имя аудио потока в этом случае будет размещено там же, где и имя видео потока
Убрать картинку аватара можно запросом /mixer/remove_stream_avatar
:
Code Block | ||||
---|---|---|---|---|
| ||||
{
"uri": "mixer://mixer1",
"remoteStreamName": "user2"
} |
В сборке 5.2.1858 добавлена возможность назначать картинки аватаров автоматически, не используя REST API, по имени потока. В этом случае файлы картинок должны быть помещены в каталог
Code Block | ||
---|---|---|
| ||
avatar_dir=/usr/local/FlashphonerWebCallServer/avatar |
Имя файла должно соответствовать имени потока. Например, к потоку stream1
применится аватар stream1.png
. Если поток был добавлен в микшер автоматически, например stream1#mixer1
, имя микшера не используется, только имя потока до символа #
.
Warning |
---|
Назначение картинки аватара при помощи REST API запроса |
Цвет рамки
В сборке 5.2.741 добавлена возможность управления цветом рамки индикатора речи при помощи настройки
Code Block | ||
---|---|---|
| ||
mixer_voice_activity_colour=#FF0000 |
Цвет может задаваться в виде шестнадцатеричного значения c префиксом # или 0x, в формате #RRGGBB. При настройке, указанных выше, рамка индикатора речи будет красной.
Отображение рамки при тишине в аудио потоке
По умолчанию, при обычном темпе речи выступающего рамка индикатора может мигать, что может быть некомфортно для восприятия. В связи с этим, в сборке 5.2.775 добавлена возможность задать интервал времени, в течение которого рамка индикатора речи продолжит отображаться при тишине в потоке. Эта возможность включается настройкой
Code Block | ||
---|---|---|
| ||
mixer_voice_activity_switch_delay=500 |
В данном случае, рамка будет показываться в течение 500 миллисекунд после наступления тишины.
По умолчанию, интервал установлен в 0, рамка индикатора гаснет без задержки.
Управление фоном микшера
По умолчанию, используется черный фон микшера. В сборке 5.2.645 добавлена возможность указать файл PNG, картинка из которого будет использована в качестве фона. Например. чтобы заменить фон на голубой, подготовьте картинку blue.png и укажите в настройке
Code Block | ||
---|---|---|
| ||
mixer_video_background_filename=blue.png |
Если путь к файлу не указан, картинка должна располагаться в каталоге /usr/local/FlashphonerWebCallServer/conf. Файл может располагаться и в любом другом каталоге, в этом случае в настройке указывается полный путь к файлу
Code Block | ||
---|---|---|
| ||
mixer_video_background_filename=/opt/media/blue.png |
Картинка будет масштабирована к разрешению выходного потока микшера
Управление соотношением сторон audio only потоков
По умолчанию, соотношение сторон картинки audio only потока установлено в соответствии с соотношение сторон микшера (16:9)
Code Block | ||
---|---|---|
| ||
mixer_audio_only_width=640
mixer_audio_only_height=360
mixer_video_width=1280
mixer_video_height=720 |
При необходимости, это можно изменить вместе с микшером, например к 4:3
Code Block | ||
---|---|---|
| ||
mixer_audio_only_width=640
mixer_audio_only_height=480
mixer_video_width=1280
mixer_video_height=960 |
Отметим, что настройки соотношения сторон картинки audio only потока меняется только при перезапуске сервера.
Поддержка многопоточности и оптимизация для работы в условиях больших нагрузок
В сборке 5.2.793 была добавлена возможность многопоточного микширования для оптимизации работы микшера в условиях большого количества участников. Эта возможность включается настройками
Code Block | ||
---|---|---|
| ||
mixer_type=MULTI_THREADED_NATIVE
mixer_mcu_multithreaded_mix=true |
Количество процессорных потоков для микширования аудио и видео задается следующими настройками
Code Block | ||
---|---|---|
| ||
mixer_audio_threads=10
mixer_video_threads=4 |
Как правило, при использовании MCU микшер кодирует один видео поток и множество аудио, по два потока на каждого участника плюс один общий аудио поток. Поэтому рекомендуется задавать число процессорных потоков для кодирования аудио больше, чем для кодирования видео. Кроме того, если в случае MCU микшера в выходном потоке видны фризы, рекомендуется включить многопоточную доставку результата микширования в основной движок сервера, для дальнейшей раздачи подписчикам
Code Block | ||
---|---|---|
| ||
mixer_mcu_multithreaded_delivery=true |
Если количество участников меньше, чем заданное количество потоков микширования (например, 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 | Максимальное время, в течение которого могут отсутствовать аудио пакеты во входящем потоке, в миллисекундах, по истечении этого времени поток не микшируется до поступления новых медиаданных |
Тестирование
1. Для теста используем
- демо-сервер demo.flashphoner.com;
- браузер Chrome;
- веб-приложение MCU Client для организации конференции.
2. Откройте страницу веб-приложения MCU Client. Введите имя пользователя user1 и имя комнаты room1
2. Нажмите кнопку Join. Будет опубликован поток с Вашей веб-камеры и добавлен в микшер, затем отобразится выходной поток микшера без аудио с Вашего микрофона
3. В другой вкладке браузера, в другом браузере или на другом ПК откройте страницу приложения MCU Client. Введите имя пользователя user2 и имя комнаты room1
4. Нажмите кнопку Join. Будет опубликован поток с Вашей веб-камеры и добавлен в микшер от имени пользователя user2, затем отобразится выходной поток микшера с потоками пользователей, но без аудио от user2
5. У пользователя user1 также играется два видеопотока в микшере и аудио от user2
6. Нажмите Leave для выхода из комнаты в обоих вкладках/браузерах
Последовательность выполнения операций
Последовательность выполнения операций при создании конференции на базе микшера реального времени приведена в описании примера MCU Client.
Рекомендации для входящих потоков
При задержках во входящем потоке от одного из участников, в микшере реального времени этот поток будет останавливаться. Для минимизации задержек во входящих потоках, рекомендуется:
1. Для RTMP потоков подбирать параметры кодирования таким образом, чтобы:
- производительности клиентского кодировщика было достаточно для своевременной передачи кадров потока
- разрешение и битрейт потока помещались в канал публикации от клиента до сервера
2. Для WebRTC потоков не поднимать минимальный порог битрейта видео выше, чем задан в настройке сервера webrtc_cc_min_bitrate
. По умолчанию, нижняя граница битрейта установлена в 30 кбит/с
Code Block | ||
---|---|---|
| ||
webrtc_cc_min_bitrate=30000 |
Это даст возможность браузеру публикующего клиента адаптировать поток к ухудшениям качества канала. При снижении битрейта качество картинки также может снизиться, но фризов в потоке участника в этом случае не будет.
Добавление одного потока в несколько микшеров
Начиная со сборки 5.2.732 один поток может быть добавлен в несколько микшеров реального времени одновременно. Отметим, что для этого должен быть включен микшер реального времени
Code Block | ||
---|---|---|
| ||
mixer_realtime=true |
и отключен собственный losless видеопроцессор
Code Block | ||
---|---|---|
| ||
mixer_lossless_video_processor_enabled=false |
Известные проблемы
1. При включении собственного losless видеопроцессора функции реального времени отключаются, при этом входящие потоки перестают играть
Симптомы: потоки, добавленные в микшер, перестают играть
Решение: не использовать собственный losless видеопроцессор с микшером реального времени
Code Block | ||
---|---|---|
| ||
mixer_lossless_video_processor_enabled=false |
2. Для отображения надписей в микшере может потребоваться установка библиотеки fontconfig
Симптомы: потоки не добавляются в микшер, в серверный лог выводится исключение
Code Block | ||
---|---|---|
| ||
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 |
Решение: установить библиотеку fontconfig
Code Block | ||||
---|---|---|---|---|
| ||||
sudo yum install -y fontconfig |
3. При большом количестве участников в микшере, имя участника может отрисовываться поверх рамки индикатора речи
Симптомы: при небольшом размере картинки участника (например, в режиме публикации экрана в микшер) имя участника отображается поверх рамки индикатора речи
Решение: включить отрисовку рамки индикатора речи внутри картинки участника и уменьшить толщину рамки
Code Block | ||
---|---|---|
| ||
mixer_voice_activity_frame_position_inner=true
mixer_voice_activity_frame_thickness=2 |
4. При публикации в микшер потока, необходимо избегать B-фреймов в потоке, либо увеличивать буфер на входе микшера
Симптомы: при публикации в микшер потока, закодированного по профилю Main с B-фреймами, выходной поток микшера играет не плавно, есть короткие фризы с пропаданием звука
Решение:
a) кодировать поток без B-фреймов (предпочтительно)
b) увеличить размер буфера на входе микшера (может дать дополнительную задержку)
Code Block | ||
---|---|---|
| ||
mixer_in_buffering_ms=600 |
5. Публикация видео 60 FPS в микшер дает дополнительную нагрузку на CPU и системную память
Симптомы: возрастание нагрузки на CPU, расход системной памяти (не Java heap) при публикации в микшер потока 60 FPS
Решение: публиковать в микшер потоки 30 FPS либо использовать более мощный сервер
6. При большом количестве участников надписи могут подергиваться
Симптомы: при большом (более 10) количестве участников в микшере надписи на картинках участников подергиваются
Решение: применить следующие настройки
Code Block | ||
---|---|---|
| ||
mixer_text_bulk_write=false
mixer_text_bulk_write_with_buffer=false |
7. При одновременном разговоре большого количества участников некоторых участников слышно хуже, чем других. Проблема характерна для микширования WebRTC потоков, и проявляется в любых решениях, использующих WebRTC и микширование звука, например, в Discord: чем больше данных приходится кодировать в один поток, тем больше семплов аудио может быть отброшено из-за фиксированной частоты дискретизации.
Симптомы: при одновременном разговоре трех и более участников одного из них слышно хуже, чем двух других
Решение: увеличить битрейт публикации звука и таким образом отправить больше данных на одного участника
Code Block | ||||
---|---|---|---|---|
| ||||
constraints: {
audio: {
bitrate: 128000
}
} |
и увеличить битрейт кодирования в Opus на сервере
Code Block | ||
---|---|---|
| ||
opus.encoder.bitrate=128000 |
8. При остановке трафика во входящем потоке, этот поток больше не будет кодироваться в микшере
Симптомы: при остановке трафика, например, при сворачивании окна приложения, с которого захватывается поток скриншаринга, в микшере этот поток фризит без восстановления
Решение: снизить минимальный порог FPS для потоков, входящих в микшер
Code Block | ||
---|---|---|
| ||
mixer_video_stable_fps_threshold=0 |
9. При снижении битрейта или fps публикации битрейт потока микшера может быть нестабильным
Симптомы: при снижении битрейта и/или fps входящего потока битрейт выходного потока микшера становится нестабильным
Решение: обновить WCS до сборки 5.2.1843 или новее и включить настройку
Code Block | ||
---|---|---|
| ||
h264_encoder_filler_data_padding=true |