Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 25 Next »

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

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

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

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

mixer_voice_activity_frame_thickness=6

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

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

mixer_voice_activity_frame_position_inner=true

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

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

mixer_show_separate_audio_frame=false

Цвет рамки

В сборке 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_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

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

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

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

mixer_realtime=true

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

mixer_lossless_video_processor_enabled=false

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

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

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

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

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

mixer_voice_activity_frame_position_inner=true
mixer_voice_activity_frame_thickness=2

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

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

Решение:

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

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

mixer_in_buffering_ms=600

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

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

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

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

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

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

mixer_text_bulk_write=false
mixer_text_bulk_write_with_buffer=false
  • No labels