Skip to end of metadata
Go to start of metadata

В сборке 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_top3Обрезка текста сверху
mixer_text_padding_bottom5Дополнение фона снизу
mixer_text_padding_left5Дополнение фона слева
mixer_text_padding_right4Дополнение фона справа
mixer_text_padding_top5Дополнение фона сверху

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

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

mixer_text_autoscale=true

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

mixer_autoscale_desktop=true

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

mixer_minimal_font_size=1

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

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

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

mixer_voice_activity_frame_thickness=6

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

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

mixer_voice_activity_frame_position_inner=true

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

mixer_show_separate_audio_frame=false

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

По умолчанию, используется черный фон микшера. В сборке 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 потока меняется только при перезапуске сервера.

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

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

Параметр

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

Описание

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 буферизация видео составляющей не будет запускаться

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

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 кбит/с

webrtc_cc_min_bitrate=30000

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

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

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

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

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

mixer_lossless_video_processor_enabled=false

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