Перейти к содержанию

Микшер реального времени с функцией MCU

В сборке 5.2.607 добавлена функция микшера реального времени. Эта функция, в сочетании с MCU, предназначена для организации видеоконференций в реальном времени. В отличие от предшествующей реализации, микшер реального времени не приостанавливает выходной поток, если какой-либо из входящих потоков начинает запаздывать (как правило, в результате помех на канале публикации), и не ждет восстановления потока, качество которого ухудшилось.

Настройка

Микшер реального времени включен по умолчанию

mixer_realtime=true

Также по умолчанию включено автоматическое создание микшера при публикации потока с именем вида user1#room1

mixer_auto_start=true

Для организации конференций, необходимо также включить поддержку MCU

mixer_mcu_audio=true
mixer_mcu_video=true

Рекомендуется уменьшить длительность работы микшера без входящих потоков

mixer_idle_timeout=10000

При необходимости, также может быть включено отображение имени потока

mixer_display_stream_name=true

при этом для потоков с видео надпись выводится в левом нижнем углу, для аудио потоков надпись выводится по центру.

Отображение индикатора речи в виде зеленой рамки включено по умолчанию

mixer_voice_activity=true

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

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

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

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

  • для видео потоков размер шрифта по умолчанию составляет 20 пунктов
mixer_font_size=20
  • для аудио потоков размер шрифта по умолчанию составляет 40 пунктов
mixer_font_size_audio_only=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 добавлена возможность управления цветом текста и фона при помощи настроек

mixer_text_colour=0xFFFF00
mixer_text_background_colour=0x006666

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

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

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

mixer_text_background_opacity=100

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

Шрифт

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

mixer_text_font=Serif

По умолчанию установлено значение 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

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

mixer_text_font=Courier 10 Pitch

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

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

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

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

mixer_text_autoscale=true

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

mixer_autoscale_desktop=true

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

mixer_minimal_font_size=1

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

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

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

mixer_text_display_room=false

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

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

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

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

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

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

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

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

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

test1#m1?label=John+Doe
Присвоение или изменение метки потока по REST API

В сборке 5.2.1635 добавлена возможность присвоить метку потока при добавлении в микшер REST API запросом /mixer/add

{
 "uri": "mixer://mixer1",
 "remoteStreamName": "stream1",
 "streamLabel": "John Doe"
}

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

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

или

{
 "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 добавлено управление расположением надписей видео потоков. По умолчанию надпись располагается в левом нижнем углу видео.

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

mixer_text_outside_frame=TOP

или под видео

mixer_text_outside_frame=BOTTOM

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

mixer_text_outside_frame_padding=70

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

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

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

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. Например, значение

mixer_text_align=EXTERNAL_BOTTOM_CENTER

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

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

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

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

mixer_voice_activity_frame_thickness=6

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

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

mixer_voice_activity_frame_position_inner=true

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

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

mixer_show_separate_audio_frame=false

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

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

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

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

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. Картинку можно установить при добавлении потока в микшер 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:

{
    "uri": "mixer://mixer1",
    "remoteStreamName": "user2"
}

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

avatar_dir=/usr/local/FlashphonerWebCallServer/avatar

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

Attention

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

Цвет рамки

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

mixer_voice_activity_colour=#FF0000

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

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

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

mixer_voice_activity_switch_delay=500

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

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

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

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

mixer_video_background_filename=blue.png

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

mixer_video_background_filename=/opt/media/blue.png

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

Управление соотношением сторон 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 была добавлена возможность многопоточного микширования для оптимизации работы микшера в условиях большого количества участников. Эта возможность включается настройками

mixer_type=MULTI_THREADED_NATIVE
mixer_mcu_multithreaded_mix=true

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

mixer_audio_threads=10
mixer_video_threads=4

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

mixer_realtime=true

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

mixer_lossless_video_processor_enabled=false

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

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

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

Симптомы

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

Решение

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

mixer_lossless_video_processor_enabled=false

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

Решение

Установить библиотеку fontconfig

sudo yum install -y fontconfig

3. При маленькой картинке участника, имя участника может заползать на рамку индикатора речи

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

Симптомы

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

Решение

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

mixer_voice_activity_frame_position_inner=true
mixer_voice_activity_frame_thickness=2

4. Выходной поток микшера может играть неплавно, если в потоке участника есть B-фреймы

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

Симптомы

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

Решение

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

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

mixer_in_buffering_ms=600

5. Входящий поток с высоким FPS дает дополнительную нагрузку на CPU сервера

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

Симптомы

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

Решение

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

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

Симптомы

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

Решение

Применить следующие настройки

mixer_text_bulk_write=false
mixer_text_bulk_write_with_buffer=false

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

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

Симптомы

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

Решение

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

constraints: {
  audio: {
    bitrate: 128000
  }
}

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

opus.encoder.bitrate=128000

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

Симптомы

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

Решение

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

mixer_video_stable_fps_threshold=0

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

Симптомы

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

Решение

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

h264_encoder_filler_data_padding=true

10. Щелчки в микшере для потока с потерями

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

Симптомы

Щелчки и микрофризы потока в микшере

Решение

Увеличить глубину буфера для входящих потоков микшера

mixer_in_buffering_ms=1000