Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
themeRDark
test1#m1?label=John+Doe

...

Присвоение или изменение метки потока по REST API

В сборке сборке 5.2.844 добавлено управление расположением надписей видео потоков. По умолчанию надпись располагается в левом нижнем углу видео.

Добавлена возможность отображения надписи над видео при помощи настройки

Code Block
themeRDark
mixer_text_outside_frame=TOP

Image Removed

или под видео

Code Block
themeRDark
mixer_text_outside_frame=BOTTOM

Image Removed

Расстояние между видео и соответствующей ему надписью можно изменить с помощью настройки

Code Block
themeRDark
mixer_text_outside_frame_padding=70

Размещение надписей над или под картинкой влияет на расположение картинок и в том случае. если отображение надписей отключено.

Управление индикатором речи

Толщина и расположение

Для рамки индикатора речи можно задавать толщину (по умолчанию 6 пикселей)

Code Block
themeRDark
mixer_voice_activity_frame_thickness=6

По умолчанию, рамка выводится снаружи картинки потока. Однако, если картинки потоков расположены близко друг к другу, например, при использовании CenterNoPaddingGridLayout, рамка может затрагивать соседние картинки

Image Removed

В этом случае необходимо включить отображение рамки внутри картинки потока

Code Block
themeRDark
mixer_voice_activity_frame_position_inner=true

Image Removed

Отображение потоков только с аудио

По умолчанию, если в микшер добавить только аудио из потока, этот поток показывается в отдельной рамке с индикатором речи (см выше). Если необходимо добавить к микшеру звук из потока без отображения отдельного участника (например, для комментирования или озвучки), это можно сделать при помощи настройки1635 добавлена возможность присвоить метку потока при добавлении в микшер REST API запросом /mixer/add 

Code Block
languagejs
themeRDark
{
 "uri": "mixer://mixer1",
 "remoteStreamName": "stream1",
 "streamLabel": "John Doe"
}

У потока, который уже добавлен в микшер, метку можно изменить запросом /mixer/set_stream_label 

Code Block
languagejs
themeRDark
{
 "uri":"mixer://m1",
 "remoteStreamName":"stream1",
 "streamLabel": "Mr. John Doe"
}

или

Code Block
languagejs
themeRDark
{
 "uri":"mixer://m1",
 "remoteMediaSessionId":"95bf2be8-f459-4f62-9a7f-c588f33e0ad3",
 "streamLabel": "Mr. John Doe"
}

Метку также можно очистить, если передать пустую строку в качестве streamLabel 

Code Block
languagejs
themeRDark
{
 "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
themeRDark
mixer_text_outside_frame=TOP

Image Added

или под видео

Code Block
themeRDark
mixer_showtext_separate_audiooutside_frame=false

Такой поток должен содержать аудио и видео, и должен быть добавлен в микшер запросом /mixer/add

js
Code Block
language
BOTTOM

Image Added

Расстояние между видео и соответствующей ему надписью можно изменить с помощью настройки

Code Block
themeRDark
{
    "uri": "mixer://mixer1",
    "remoteStreamName": "stream_dub",
    "hasVideo":false,
    "hasAudio":true
}

...

mixer_text_outside_frame_padding=70

Размещение надписей над или под картинкой влияет на расположение картинок и в том случае. если отображение надписей отключено.

Актуальная настройка в сборках 5.2.1079 и новее

В сборке 5.2.741 добавлена возможность управления цветом рамки индикатора речи при помощи настройки1079 для управления расположение подписи кадра в микшере добавлена настройка

Code Block
themeRDark
mixer_voicetext_activity_colour=#FF0000

Цвет может задаваться в виде шестнадцатеричного значения c префиксом # или 0x, в формате #RRGGBB. При настройке, указанных выше, рамка индикатора речи будет красной.

Отображение рамки при тишине в аудио потоке

По умолчанию, при обычном темпе речи выступающего рамка индикатора может мигать, что может быть некомфортно для восприятия. В связи с этим, в сборке 5.2.775 добавлена возможность задать интервал времени, в течение которого рамка индикатора речи продолжит отображаться при тишине в потоке. Эта возможность включается настройкой

Code Block
themeRDark
mixer_voice_activity_switch_delay=500

В данном случае, рамка будет показываться в течение 500 миллисекунд после наступления тишины.

По умолчанию, интервал установлен в 0, рамка индикатора гаснет без задержки.

Управление фоном микшера

...

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
themeRDark
mixer_text_align=EXTERNAL_BOTTOM_CENTER

действует так же, как mixer_text_outside_frame=BOTTOM

Image Added

Управление индикатором речи

Толщина и расположение

Для рамки индикатора речи можно задавать толщину (по умолчанию 6 пикселей)

Code Block
themeRDark
mixer_videovoice_activity_backgroundframe_filenamethickness=blue.png

...

6

По умолчанию, рамка выводится снаружи картинки потока. Однако, если картинки потоков расположены близко друг к другу, например, при использовании CenterNoPaddingGridLayout, рамка может затрагивать соседние картинки

Image Added

В этом случае необходимо включить отображение рамки внутри картинки потока

Code Block
themeRDark
mixer_video_background_filename=/opt/media/blue.png

Картинка будет масштабирована к разрешению выходного потока микшера

Image Removed

Управление соотношением сторон audio only потоков

По умолчанию, соотношение сторон картинки audio only потока установлено в соответствии с соотношение сторон микшера (16:9)

code
voice_activity_frame_position_inner=true

Image Added

Отображение потоков только с аудио

По умолчанию, если в микшер добавить только аудио из потока, этот поток показывается в отдельной рамке с индикатором речи (см выше). Если необходимо добавить к микшеру звук из потока без отображения отдельного участника (например, для комментирования или озвучки), это можно сделать при помощи настройки

Code Block
themeRDark
mixer_audio_only_width=640
mixershow_separate_audio_only_height=360
mixer_video_width=1280
mixer_video_height=720

При необходимости, это можно изменить вместе с микшером, например к 4:3

Code Block
themeRDark
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
themeRDark
mixer_type=MULTI_THREADED_NATIVE
mixer_mcu_multithreaded_mix=true

...

frame=false

До сборки 5.2.965 такой поток должен содержать аудио и видео, и должен быть добавлен в микшер запросом /mixer/add

Code Block
languagejs
themeRDark
{
    "uri": "mixer://mixer1",
    "remoteStreamName": "stream_dub",
    "hasVideo":false,
    "hasAudio":true
}

Начиная со сборки 5.2.965, поток, не содержащий видео, также не будет отображаться при использовании данной настройки

Начиная со сборки 5.2.1359, настройка mixer_show_separate_audio_frame влияет на отображение потока, если аудио фреймы начинают поступать раньше, чем видео. При настройке по умолчанию в этом случае отобразится рамка с индикатором речи, затем, при получении видео фрейма, отобразится видео. При

Code Block
themeRDark
mixer_audio_threads=10
mixer_video_threads=4

Как правило, при использовании MCU микшер кодирует один видео поток и множество аудио, по два потока на каждого участника плюс один общий аудио поток. Поэтому рекомендуется задавать число процессорных потоков для кодирования аудио больше, чем для кодирования видео. Кроме того, если в случае MCU микшера в выходном потоке видны фризы, рекомендуется включить многопоточную доставку результата микширования в основной движок сервера, для дальнейшей раздачи подписчикам

Code Block
themeRDark
mixer_mcu_multithreaded_delivery=true

Если количество участников меньше, чем заданное количество потоков микширования (например, 3 участника), для микширования будет использоваться один процессорный поток.

Тонкая настройка микшера реального времени

Тонкие настройки микшера реального времени регулируются следующими параметрами

...

Параметр

...

Значение по умолчанию

...

Описание

...

mixer_in_buffering_ms

...

200

...

Размер буфера видеосоставляющей входящего потока, в миллисекундах

...

Тестирование

1. Для теста используем

  • демо-сервер demo.flashphoner.com;
  • браузер Chrome;
  • веб-приложение MCU Client для организации конференции.

2. Откройте страницу веб-приложения MCU Client. Введите имя пользователя user1 и имя комнаты room1

Image Removed

2. Нажмите кнопку Join. Будет опубликован поток с Вашей веб-камеры и добавлен в микшер, затем отобразится выходной поток микшера без аудио с Вашего микрофона

Image Removed

3. В другой вкладке браузера, в другом браузере или на другом ПК откройте страницу приложения MCU Client. Введите имя пользователя user2 и имя комнаты room1

Image Removed

4. Нажмите кнопку Join. Будет опубликован поток с Вашей веб-камеры и добавлен в микшер от имени пользователя user2, затем отобразится выходной поток микшера с потоками пользователей, но без аудио от user2

Image Removed

5. У пользователя user1 также играется два видеопотока в микшере и аудио от user2

Image Removed

6. Нажмите Leave для выхода из комнаты в обоих вкладках/браузерах

Последовательность выполнения операций

Последовательность выполнения операций при создании конференции на базе микшера реального времени приведена в описании примера MCU Client.

Рекомендации для входящих потоков

При задержках во входящем потоке от одного из участников, в микшере реального времени этот поток будет останавливаться. Для минимизации задержек во входящих потоках, рекомендуется:

1. Для RTMP потоков подбирать параметры кодирования таким образом, чтобы:

  • производительности клиентского кодировщика было достаточно для своевременной передачи кадров потока
  • разрешение и битрейт потока помещались в канал публикации от клиента до сервера

2. Для WebRTC потоков не поднимать минимальный порог битрейта видео выше, чем задан в настройке сервера webrtc_cc_min_bitrate. По умолчанию, нижняя граница битрейта установлена в 30 кбит/с

Code Block
themeRDark
webrtc_cc_min_bitrate=30000

Это даст возможность браузеру публикующего клиента адаптировать поток к ухудшениям качества канала. При снижении битрейта качество картинки также может снизиться, но фризов в потоке участника в этом случае не будет.

Добавление одного потока в несколько микшеров

...

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
languagejs
themeRDark
{
    "uri": "mixer://mixer1",
    "remoteStreamName": "user2",
    "hasVideo": false,
    "hasAudio": true,
    "avatar": "https://mystorage.com/storage/avatar.png"
}

или для потока, уже добавленного в микшер, запросом /mixer/set_stream_avatar :

Code Block
languagejs
themeRDark
{
    "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 

Аудио поток в микшере при этом выглядит так

Image Added

Если в микшере включено отображение имен потоков, имя аудио потока в этом случае будет размещено там же, где и имя видео потока

Убрать картинку аватара можно запросом /mixer/remove_stream_avatar :

Code Block
languagejs
themeRDark
{
    "uri": "mixer://mixer1",
    "remoteStreamName": "user2"
}

В сборке 5.2.1858 добавлена возможность назначать картинки аватаров автоматически, не используя REST API, по имени потока. В этом случае файлы картинок должны быть помещены в каталог

Code Block
themeRDark
avatar_dir=/usr/local/FlashphonerWebCallServer/avatar

Имя файла должно соответствовать имени потока. Например, к потоку stream1 применится аватар stream1.png. Если поток был добавлен в микшер автоматически, например stream1#mixer1, имя микшера не используется, только имя потока до символа #.

Warning

Назначение картинки аватара при помощи REST API запроса /mixer/set_stream_avatar имеет приоритет над автоматическим назначением картинки

Цвет рамки

В сборке 5.2.741 добавлена возможность управления цветом рамки индикатора речи при помощи настройки

Code Block
themeRDark
mixer_voice_activity_colour=#FF0000

Цвет может задаваться в виде шестнадцатеричного значения c префиксом # или 0x, в формате #RRGGBB. При настройке, указанных выше, рамка индикатора речи будет красной.

Отображение рамки при тишине в аудио потоке

По умолчанию, при обычном темпе речи выступающего рамка индикатора может мигать, что может быть некомфортно для восприятия. В связи с этим, в сборке 5.2.775 добавлена возможность задать интервал времени, в течение которого рамка индикатора речи продолжит отображаться при тишине в потоке. Эта возможность включается настройкой

Code Block
themeRDark
mixer_voice_activity_switch_delay=500

В данном случае, рамка будет показываться в течение 500 миллисекунд после наступления тишины.

По умолчанию, интервал установлен в 0, рамка индикатора гаснет без задержки.

Управление фоном микшера

По умолчанию, используется черный фон микшера. В сборке 5.2.645 добавлена возможность указать файл PNG, картинка из которого будет использована в качестве фона. Например. чтобы заменить фон на голубой, подготовьте картинку blue.png и укажите в настройке

Code Block
themeRDark
mixer_realtime=true

...

video_background_filename=blue.png

Если путь к файлу не указан, картинка должна располагаться в каталоге /usr/local/FlashphonerWebCallServer/conf. Файл может располагаться и в любом другом каталоге, в этом случае в настройке указывается полный путь к файлу

Code Block
themeRDark
mixer_lossless_video_processorbackground_enabled=false

Известные проблемы

1. При включении собственного losless видеопроцессора функции реального времени отключаются, при этом входящие потоки перестают играть

Симптомы: потоки, добавленные в микшер, перестают играть

...

filename=/opt/media/blue.png

Картинка будет масштабирована к разрешению выходного потока микшера

Image Added

Управление соотношением сторон audio only потоков

По умолчанию, соотношение сторон картинки audio only потока установлено в соответствии с соотношение сторон микшера (16:9)

Code Block
themeRDark
mixer_audio_only_width=640
mixer_lossless_audio_only_height=360
mixer_video_processor_enabled=false

2. Для отображения надписей в микшере может потребоваться установка библиотеки fontconfig

...

width=1280
mixer_video_height=720

При необходимости, это можно изменить вместе с микшером, например к 4:3

Code Block
themeRDark
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:2516mixer_audio_only_width=640
mixer_audio_only_height=480
mixer_video_width=1280
mixer_video_height=960

Отметим, что настройки соотношения сторон картинки audio only потока меняется только при перезапуске сервера.

Поддержка многопоточности и оптимизация для работы в условиях больших нагрузок

В сборке 5.2.793 была добавлена возможность многопоточного микширования для оптимизации работы микшера в условиях большого количества участников. Эта возможность включается настройками

Code Block
themeRDark
mixer_type=MULTI_THREADED_NATIVE
mixer_mcu_multithreaded_mix=true

Количество процессорных потоков для микширования аудио и видео задается следующими настройками

Code Block
themeRDark
mixer_audio_threads=10
mixer_video_threads=4

Как правило, при использовании MCU микшер кодирует один видео поток и множество аудио, по два потока на каждого участника плюс один общий аудио поток. Поэтому рекомендуется задавать число процессорных потоков для кодирования аудио больше, чем для кодирования видео. Кроме того, если в случае MCU микшера в выходном потоке видны фризы, рекомендуется включить многопоточную доставку результата микширования в основной движок сервера, для дальнейшей раздачи подписчикам

Code Block
themeRDark
mixer_mcu_multithreaded_delivery=true

Если количество участников меньше, чем заданное количество потоков микширования (например, 3 участника), для микширования будет использоваться один процессорный поток.

Тонкая настройка микшера реального времени

Тонкие настройки микшера реального времени регулируются следующими параметрами

Параметр

Значение по умолчанию

Описание

mixer_audio_silence_threshold-50.00Уровень тишины аудиосоставляющей входящего потока, в Дб
mixer_debug_modefalseДобавление отладочной информации к подписи под картинкой потока

mixer_in_buffering_ms

200

Размер буфера видеосоставляющей входящего потока, в миллисекундах

mixer_incoming_time_rate_lower_threshold0.95Граница отставания времени входящего потока от времени микшера, в относительных единицах
mixer_incoming_time_rate_upper_threshold1.05Граница опережения временем входящего потока времени микшера, в относительных единицах
mixer_video_stable_fps_threshold15Граница FPS входящего потока, для потоков с низким FPS буферизация видео составляющей не будет запускаться
audio_mixer_max_delay300Максимальное время, в течение которого могут отсутствовать аудио пакеты во входящем потоке, в миллисекундах, по истечении этого времени поток не микшируется до поступления новых медиаданных

Тестирование

1. Для теста используем

  • демо-сервер demo.flashphoner.com;
  • браузер Chrome;
  • веб-приложение MCU Client для организации конференции.

2. Откройте страницу веб-приложения MCU Client. Введите имя пользователя user1 и имя комнаты room1

Image Added

2. Нажмите кнопку Join. Будет опубликован поток с Вашей веб-камеры и добавлен в микшер, затем отобразится выходной поток микшера без аудио с Вашего микрофона

Image Added

3. В другой вкладке браузера, в другом браузере или на другом ПК откройте страницу приложения MCU Client. Введите имя пользователя user2 и имя комнаты room1

Image Added

4. Нажмите кнопку Join. Будет опубликован поток с Вашей веб-камеры и добавлен в микшер от имени пользователя user2, затем отобразится выходной поток микшера с потоками пользователей, но без аудио от user2

Image Added

5. У пользователя user1 также играется два видеопотока в микшере и аудио от user2

Image Added

6. Нажмите Leave для выхода из комнаты в обоих вкладках/браузерах

Последовательность выполнения операций

Последовательность выполнения операций при создании конференции на базе микшера реального времени приведена в описании примера MCU Client.

Рекомендации для входящих потоков

При задержках во входящем потоке от одного из участников, в микшере реального времени этот поток будет останавливаться. Для минимизации задержек во входящих потоках, рекомендуется:

1. Для RTMP потоков подбирать параметры кодирования таким образом, чтобы:

  • производительности клиентского кодировщика было достаточно для своевременной передачи кадров потока
  • разрешение и битрейт потока помещались в канал публикации от клиента до сервера

2. Для WebRTC потоков не поднимать минимальный порог битрейта видео выше, чем задан в настройке сервера webrtc_cc_min_bitrate. По умолчанию, нижняя граница битрейта установлена в 30 кбит/с

Code Block
themeRDark
webrtc_cc_min_bitrate=30000

Это даст возможность браузеру публикующего клиента адаптировать поток к ухудшениям качества канала. При снижении битрейта качество картинки также может снизиться, но фризов в потоке участника в этом случае не будет.

Добавление одного потока в несколько микшеров

Начиная со сборки 5.2.732 один поток может быть добавлен в несколько микшеров реального времени одновременно. Отметим, что для этого должен быть включен микшер реального времени

Code Block
themeRDark
mixer_realtime=true

и отключен собственный losless видеопроцессор

Code Block
themeRDark
mixer_lossless_video_processor_enabled=false

Известные проблемы

1. При включении собственного losless видеопроцессора функции реального времени отключаются, при этом входящие потоки перестают играть

Симптомы: потоки, добавленные в микшер, перестают играть

Решение: не использовать собственный losless видеопроцессор с микшером реального времени

Code Block
themeRDark
mixer_lossless_video_processor_enabled=false

2. Для отображения надписей в микшере может потребоваться установка библиотеки fontconfig

Симптомы: потоки не добавляются в микшер, в серверный лог выводится исключение

Code Block
themeRDark
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.mediaserver.Nremote.AB.AB.AГ™(Unknown Source)
	at com.flashphoner.media.mixer.video.presentation.Canvas.computeTextScales(Unknown Source.server.remote.B.B.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at comjava.flashphonerbase/jdk.mediainternal.mixerreflect.videoNativeConstructorAccessorImpl.presentation.Canvas.writeNative(Unknown SourcenewInstance(NativeConstructorAccessorImpl.java:62)
	at comjava.flashphonerbase/jdk.mediainternal.Nreflect.ADelegatingConstructorAccessorImpl.A(Unknown SourcenewInstance(DelegatingConstructorAccessorImpl.java:45)
	at comjava.flashphonerbase/java.medialang.Nreflect.DConstructor.D(Unknown SourcenewInstanceWithCaller(Constructor.java:500)
	at comjava.flashphonerbase/java.medialang.Nreflect.DConstructor.A(Unknown SourcenewInstance(Constructor.java:481)
	at comjava.flashphonerdesktop/sun.serverfont.remoteFontManagerFactory$1.B.B.Г™(Unknown Sourcerun(FontManagerFactory.java:84)
	at com.flashphoner.server.remote.B.B.run(Unknown Source). 14 more
Caused by: java.lang.reflect.InvocationTargetException.NullPointerException
	at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1262)
	at java.basedesktop/jdksun.internalawt.reflectFontConfiguration.NativeConstructorAccessorImpl.newInstance0(Native MethodreadFontConfigFile(FontConfiguration.java:225)
	at java.basedesktop/jdksun.internalawt.reflectFontConfiguration.NativeConstructorAccessorImpl.newInstanceinit(NativeConstructorAccessorImplFontConfiguration.java:62107)
	at java.basedesktop/jdksun.internal.reflectawt.DelegatingConstructorAccessorImplX11FontManager.newInstancecreateFontConfiguration(DelegatingConstructorAccessorImplX11FontManager.java:45719)
	at java.basedesktop/javasun.langfont.reflectSunFontManager$2.Constructor.newInstanceWithCallerrun(ConstructorSunFontManager.java:500367)
	at java.base/java.langsecurity.reflectAccessController.Constructor.newInstancedoPrivileged(ConstructorAccessController.java:481310)
	at java.desktop/sun.font.FontManagerFactory$1SunFontManager.run<init>(FontManagerFactorySunFontManager.java:84)
	... 14 more
Caused by: java.lang.NullPointerException312)
	at java.desktop/sun.awt.FontConfigurationFcFontManager.getVersion<init>(FontConfigurationFcFontManager.java:126235)
	at java.desktop/sun.awt.FontConfigurationX11FontManager.readFontConfigFile<init>(FontConfigurationX11FontManager.java:22556)
	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
languagebash
themeRDark
sudo yum install -y fontconfig

3. При большом количестве участников в микшере, имя участника может отрисовываться поверх рамки индикатора речи

Симптомы: при небольшом размере картинки участника (например, в режиме публикации экрана в микшер) имя участника отображается поверх рамки индикатора речи

...

. 20 more

Решение: установить библиотеку fontconfig

Code Block
languagebash
themeRDark
sudo yum install -y fontconfig

3. При большом количестве участников в микшере, имя участника может отрисовываться поверх рамки индикатора речи

Симптомы: при небольшом размере картинки участника (например, в режиме публикации экрана в микшер) имя участника отображается поверх рамки индикатора речи

Решение: включить отрисовку рамки индикатора речи внутри картинки участника и уменьшить толщину рамки

Code Block
themeRDark
mixer_voice_activity_frame_position_inner=true
mixer_voice_activity_frame_thickness=2

4. При публикации в микшер потока, необходимо избегать B-фреймов в потоке, либо увеличивать буфер на входе микшера

Симптомы: при публикации в микшер потока, закодированного по профилю Main с B-фреймами, выходной поток микшера играет не плавно, есть короткие фризы с пропаданием звука

Решение:

a) кодировать поток без B-фреймов (предпочтительно)

b) увеличить размер буфера на входе микшера (может дать дополнительную задержку)

Code Block
themeRDark
mixer_in_buffering_ms=600

5. Публикация видео 60 FPS в микшер дает дополнительную нагрузку на CPU и системную память

Симптомы: возрастание нагрузки на CPU, расход системной памяти (не Java heap) при публикации в микшер потока 60 FPS

Решение: публиковать в микшер потоки 30 FPS либо использовать более мощный сервер

6. При большом количестве участников надписи могут подергиваться

Симптомы: при большом (более 10) количестве участников в микшере надписи на картинках участников подергиваются

Решение: применить следующие настройки

Code Block
themeRDark
mixer_voicetext_activity_frame_position_inner=truebulk_write=false
mixer_voicetext_bulk_activitywrite_framewith_thicknessbuffer=2false

4. При публикации в микшер потока, необходимо избегать B-фреймов в потоке, либо увеличивать буфер на входе микшера

Симптомы: при публикации в микшер потока, закодированного по профилю Main с B-фреймами, выходной поток микшера играет не плавно, есть короткие фризы с пропаданием звука

Решение:

a) кодировать поток без B-фреймов (предпочтительно)

b) увеличить размер буфера на входе микшера (может дать дополнительную задержку)

Code Block
themeRDark
mixer_in_buffering_ms=600

5. Публикация видео 60 FPS в микшер дает дополнительную нагрузку на CPU и системную память

Симптомы: возрастание нагрузки на CPU, расход системной памяти (не Java heap) при публикации в микшер потока 60 FPS

Решение: публиковать в микшер потоки 30 FPS либо использовать более мощный сервер

6. При большом количестве участников надписи могут подергиваться

Симптомы: при большом (более 10) количестве участников в микшере надписи на картинках участников подергиваются

Решение: применить следующие настройки

Code Block
themeRDark
mixer_text_bulk_write=false
mixer_text_bulk_write_with_buffer=false

7. При одновременном разговоре большого количества участников некоторых участников слышно хуже, чем других. Проблема характерна для микширования WebRTC потоков, и проявляется в любых решениях, использующих WebRTC и микширование звука, например, в Discord: чем больше данных приходится кодировать в один поток, тем больше семплов аудио может быть отброшено из-за фиксированной частоты дискретизации.

Симптомы: при одновременном разговоре трех и более участников одного из них слышно хуже, чем двух других

Решение:  увеличить битрейт публикации звука и таким образом отправить больше данных на одного участника

Code Block
languagejs
themeRDark
constraints: {
  audio: {
     bitrate: 128000
  }
}

и увеличить битрейт кодирования в Opus на сервере

...

themeRDark

...

7. При одновременном разговоре большого количества участников некоторых участников слышно хуже, чем других. Проблема характерна для микширования WebRTC потоков, и проявляется в любых решениях, использующих WebRTC и микширование звука, например, в Discord: чем больше данных приходится кодировать в один поток, тем больше семплов аудио может быть отброшено из-за фиксированной частоты дискретизации.

Симптомы: при одновременном разговоре трех и более участников одного из них слышно хуже, чем двух других

Решение:  увеличить битрейт публикации звука и таким образом отправить больше данных на одного участника

Code Block
languagejs
themeRDark
constraints: {
  audio: {
     bitrate: 128000
  }
}

и увеличить битрейт кодирования в Opus на сервере

Code Block
themeRDark
opus.encoder.bitrate=128000

8. При остановке трафика во входящем потоке, этот поток больше не будет кодироваться в микшере

Симптомы: при остановке трафика, например, при сворачивании окна приложения, с которого захватывается поток скриншаринга, в микшере этот поток фризит без восстановления

Решение: снизить минимальный порог FPS для потоков, входящих в микшер

Code Block
themeRDark
mixer_video_stable_fps_threshold=0

9. При снижении битрейта или fps публикации битрейт потока микшера может быть нестабильным

Симптомы: при снижении битрейта и/или fps входящего потока битрейт выходного потока микшера становится нестабильным

Решение: обновить WCS до сборки 5.2.1843 или новее и включить настройку

Code Block
themeRDark
h264_encoder_filler_data_padding=true