Описание
В сборке 5.2.1009 добавлена возможность описания собственных вариантов размещения картинок в микшере при помощи языка разметки на основе XML. Разработка собственного Java класса при этом не требуется.
Вариант размещения картинок представляет собой набор XML-файлов с расширением mix, расположенных в одном каталоге. Каждый файл должен описывать размещение картинок для определенного количества участников: 1, 2, 3, 4 и т.д. Имя файла должно начинаться с количества участников и следующего за ним символа подчеркивания, остальная часть имени файла должна содержать произвольный набор алфавитно-цифровых символов, например
1_test-mixer-layout-1-participant.mix 2_test-mixer-layout-2-participants.mix 3_test-mixer-layout-3-participants.mix 4_test-mixer-layout-4-participants.mix ...
Файлы, описывающие один вариант размещения картинок, должны располагаться в одном каталоге. Одному количеству участников должен соответствовать один и только один файл. Таким образом, смешивать в одном и том же каталоге два различных варианта не допускается.
Путь к этому каталогу может быть указан в настройке в файле flashphoner.properties
mixer_layout_dir=/opt/test-mixer-layout
В этом случае данный вариант размещения картинок будет применяться по умолчанию ко всем микшерам на сервере
Также путь к каталогу можно указать в REST API запросе /mixer/startup:
POST /rest-api/mixer/startup HTTP/1.1 HOST: 192.168.1.101:8081 Content-type: application/json { "uri": "mixer://mixer1", "localStreamName": "mixer1_stream", "hasVideo": true, "hasAudio": false, "mixerLayoutDir": "/opt/mixer1-layout" }
Формат файла описания картинок
XML-файл описания картинок должен соответствовать следующей схеме
Поддерживаются следующие элементы:
- body - контейнер для описания размещения картинок. Может использоваться только один раз в одном файле
- div - контейнер для одной картинки или набора картинок. Может использоваться в любом количестве, также может быть вложенным
- video - описание картинки. Может использоваться в любом количестве.
Элемент div
Является контейнером для других div или video элементов. Поддерживает следующие атрибуты:
- x, y - координаты левого верхнего угла на холсте микшера, в пикселях
- width - ширина на холсте микшера
- height - высота на холсте микшера
- padding-left, padding-right, padding-top, padding-bottom - дополнение картинки с каждой стороны, в пикселях
- align - выравнивание на холсте микшера
Атрибут align может принимать следующие значения
- LEFT - картинка прижата влево
- RIGHT - картинка прижата вправо
- TOP - картинка прижата к верхней границе
- BOTTOM - картинка прижата к нижней границе
- CENTER - картинка выровнена по центру
- BOTTOM_CENTER - картинка выровнена по центру и прижата к нижней границе
- TOP_CENTER - картинка выровнена по центру и прижата к верхней границе
- INLINE_HORIZONTAL - картинка выровнена по правому верхнему углу ближайшей картинки слева
- INLINE_HORIZONTAL_CENTER - то же, что и в предыдущем случае, с центрированием по вертикали
- INLINE_VERTICAL - картинка выровнена по левому нижнему углу ближайшей картинки сверху
- INLINE_VERTICAL_CENTER - то же, что и в предыдущем случае, с центрированием по вертикали
Если координаты левого верхнего угла заданы явно, то параметр align не применяется
Элемент video
Представляет картинку потока в контейнере. Поддерживает те же атрибуты, что и div, с дополнительным атрибутом
- crop - увеличивает картинку и обрезает вокруг центра
Атрибут crop может принимать значения true или false.
Элемент video может задавать шаблон имени потока. Например
<video>test</video>
отобразит только поток с именем test, к другим потока этот элемент применяться не будет.
Шаблон может быть задан регулярным выражением, например
<video>test1.*</video>
В этом случае данный элемент отобразит поток с именем test1, test1#room1, test11 и т.д.
Если имя потока не соответствует ни одному шаблону, и в файле есть элемент video без шаблона, то для этого потока будет использован этот элемент. Например, рассмотрим описание картинки для одного участника
<?xml version="1.0" encoding="utf-8"?> <body xsi:noNamespaceSchemaLocation="schema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <div width="320" height="180" padding-left="0" padding-right="0" padding-bottom="0" align="TOP_CENTER"> <video>test1.*</video> </div> <div width="320" height="180" padding-left="0" padding-right="0" padding-bottom="0" align="BOTTOM_CENTER"> <video>test2.*</video> </div> <div width="160" height="90" padding-left="0" padding-right="0" padding-bottom="0" align="RIGHT"> <video></video> </div> </body>
В этом случае поток test3 будет отображен в последнем video элементе.
Обработка ошибок
1. Если вариант размещения картинок не содержит описания для определенного количества участников, будет использован вариант, заданный в настройке
mixer_layout_class=com.flashphoner.media.mixer.video.presentation.GridLayout
По умолчанию, используется GridLayout
2. Если имя потока не соответствует ни одному шаблону в описании текущего количества участников, аудио и видео из такого потока не будет добавлено в выходной поток микшера
Пример
Рассмотрим вариант размещения в микшере с выходным потоком 640x360 до трех участников.
Описание на одного участника:
<?xml version="1.0" encoding="utf-8"?> <body xsi:noNamespaceSchemaLocation="schema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <div width="320" height="180" padding-left="0" padding-right="0" padding-bottom="0" align="TOP_CENTER"> <video crop="false">test1.*</video> </div> <div width="320" height="180" padding-left="0" padding-right="0" padding-bottom="0" align="BOTTOM_CENTER"> <video crop="false">test2.*</video> </div> </body>
Описание на двух участников
<?xml version="1.0" encoding="utf-8"?> <body xsi:noNamespaceSchemaLocation="schema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <div width="320" height="180" padding-left="0" padding-right="0" padding-bottom="0" align="TOP_CENTER"> <video crop="false">test1.*</video> </div> <div width="320" height="180" padding-left="0" padding-right="0" padding-bottom="0" align="BOTTOM_CENTER"> <video crop="false">test2.*</video> </div> </body>
Описание на трех участников
<?xml version="1.0" encoding="utf-8"?> <body xsi:noNamespaceSchemaLocation="schema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <div width="320" height="180" padding-left="0" padding-right="0" padding-bottom="0" x="0" y="0"> <video crop="false">test1.*</video> </div> <div width="320" height="180" padding-left="0" padding-right="0" padding-bottom="0" x="320" y="0"> <video crop="false">test2.*</video> </div> <div width="320" height="180" padding-left="0" padding-right="0" padding-bottom="0" align="BOTTOM_CENTER"> <video crop="fasle">test3.*</video> </div> </body>
Пример отображения потока test1
Пример отображения двух потоков test1 и test2
Пример отображения потоков test1, test2 и test3