Versions Compared

Key

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

...

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

Управление надписями

Основные параметры и размер шрифта

В зависимости от разрешения выходного потока микшера, может быть изменен размер шрифта надписей:

...

Текст всегда выводится на фоне черного прямоугольника. Можно управлять следующими параметрами фона:

Параметр

Значение по умолчанию, в пикселях

Описание

mixer_text_cut_top3Обрезка текста сверху
mixer_text_padding_bottom5Дополнение фона снизу
mixer_text_padding_left5Дополнение фона слева
mixer_text_padding_right4Дополнение фона справа
mixer_text_padding_top5Дополнение фона сверху

Цвет текста, фон и прозрачность

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

Code Block
themeRDark
mixer_text_colour=0xFFFF00
mixer_text_background_colour=0x006666

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

Image Added

Для участников без видео, указанным фоном заливается весь прямоугольник.

В сборке 5.2.770 добавлено управление прозрачностью фона при помощи настройки

Code Block
themeRDark
mixer_text_background_opacity=100

Прозрачность задается в процентах: 0 соответствует полной прозрачности, 100 процентов соответствуют полной непрозрачности (фон будет окрашен заданным цветом). По умолчанию, значение установлено в 100 (фон непрозрачный).

Шрифт

В сборке 5.2.770 добавлена возможность выбрать шрифт надписей при помощи настройки

Code Block
themeRDark
mixer_text_font=Serif

По умолчанию установлено значение Serif. Шрифты могут быть выбраны только из списка X11 шрифтов, например:

Code Block
languagebash
themeRDark
[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

Имя шрифта необходимо указывать полностью, например

Code Block
themeRDark
mixer_text_font=Courier 10 Pitch

Если указанного шрифта нет в системе, будет использован шрифт, установленный в системе по умолчанию.

Если выбранный шрифт не содержит символов, которые есть в тексте надписи, эти символы выведены не будут.

Автоматическое масштабирование текста под размер картинки

В сборке 5.2.709 добавлено автоматическое масштабирование надписей под размер картинки. Эта возможность включена по умолчанию настройкой

Code Block
themeRDark
mixer_text_autoscale=true

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

Code Block
themeRDark
mixer_autoscale_desktop=true

Минимальный размер шрифта при  масштабировании задается настройкой

Code Block
themeRDark
mixer_minimal_font_size=1

и по умолчанию составляет 1 пункт.

Отображение имени комнаты (микшера)

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

Code Block
themeRDark
mixer_text_display_room=false

При этом для потока "user1#room1" будет отображаться надпись "user1" (без имени комнаты и спецсимвола).

Отображение заданной метки потока

В сборке 5.2.816 добавлена возможность отображения заданной метки потока. Фактически, для отображения может быть задано произвольное имя, в том числе и с использованием национальных алфавитов.

Метка должна быть указана в имени потока как параметр при публикации, например

Code Block
languagejs
themeRDark
session.createStream({
    streamName: "test1#m1?label=John Doe",
    display: localDisplay,
    ...
}).publish();

Image Added

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

Image Added

В метках поддерживаются национальные символы, а также

Code Block
themeRDark
~!@#№$%^*()-_,.;:[]{}<>/|\

Символ '+' при отображении будет заменен на пробел, т.е. в примере выше можно публиковать поток и с меткой

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

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

В сборке 5.2.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_text_outside_frame=BOTTOM

Image Added

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

Code Block
themeRDark
mixer_text_outside_frame_padding=70

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

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

В сборке 5.2.1079 для управления расположение подписи кадра в микшере добавлена настройка

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

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

Image Added

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

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

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

...

Code Block
themeRDark
mixer_voice_activity_frame_position_inner=true

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

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

Code Block
themeRDark
mixer_show_separate_audio_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_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 и укажите в настройке

...

Отметим, что настройки соотношения сторон картинки 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. Для теста используем

...

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

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

Начиная со сборки 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.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
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_text_bulk_write=false
mixer_text_bulk_write_with_buffer=false

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