Versions Compared

Key

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

...

Code Block
languagejs
themeRDark
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"
}

Формат файла описания картинок

...

Применение варианта размещения картинок к активному микшеру

Начиная со сборки 5.2.1480, вариант размещения картинок можно применить к активному микшеру

Code Block
languagexmljs
themeRDark
titleMixer layout XSD
collapsetrue
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="body" type="bodyType"/>
  <xs:complexType name="videoType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute type="xs:int" name="x" default="0"/>
        <xs:attribute type="xs:int" name="y" default="0"/>
        <xs:attribute type="xs:string" name="width" default="0"/>
        <xs:attribute type="xs:string" name="height" default="0POST /rest-api/mixer/set_parameter HTTP/1.1
HOST: 192.168.1.101:8081
Content-type: application/json
 
{
    "uri": "mixer://mixer1",
    "mixerLayoutDir": "/opt/mixer1-layout"
}

Вернуться к размещению картинок по умолчанию можно, указав пустое значение параметра mixerLayoutDir 

Code Block
languagejs
themeRDark
POST /rest-api/mixer/set_parameter HTTP/1.1
HOST: 192.168.1.101:8081
Content-type: application/json
 
{
    "uri": "mixer://mixer1",
    "mixerLayoutDir": ""
}

При этом будет применен класс размещения картинок, указанный в параметре микшера mixerLayoutClass.

Формат файла описания картинок

XML-файл описания картинок должен соответствовать следующей схеме

Code Block
languagexml
themeRDark
titleMixer layout XSD
collapsetrue
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="body" type="bodyType"/>
  <xs:complexType name="videoType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute type="xs:stringint" name="alignx" default="LEFT0"/>
        <xs:attribute type="xs:stringint" name="watermark"y" default="0"/>
        <xs:attribute type="xs:intstring" name="padding-leftwidth" default="0"/>
        <xs:attribute type="xs:intstring" name="padding-rightheight" default="0"/>
        <xs:attribute type="xs:intstring" name="padding-topalign" default="0LEFT"/>
        <xs:attribute type="xs:string" name="watermark"/>
        <xs:attribute type="xs:int" name="padding-bottomleft" default="0"/>
        <xs:attribute type="xs:booleanint" name="croppadding-right" default="false0"/>
      </xs:extension>
    </<xs:attribute type="xs:simpleContent>
  </xs:complexType>
  <xs:complexType int" name="divTypepadding-top">
    <xs:sequence minOccurs default="0" maxOccurs="unbounded"/>
        <xs:choice>
        <xs:elementattribute type="xs:int" name="videopadding-bottom" typedefault="videoType0"/>
        <xs:element:attribute type="xs:boolean" name="divcrop" typedefault="divTypefalse"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:elementcomplexType name="rowdivType">
    <xs:sequence minOccurs="0" typemaxOccurs="rowTypeunbounded"/>
      </xs<xs:choice>
    </xs:sequence>
    <xs:attribute type="xs:int" element name="xvideo" defaulttype="0videoType"/>
        <xs:attributeelement typename="xs:int"div" type="divType"/>
        <xs:element name="yrow" defaulttype="0rowType"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute type="xs:stringint" name="widthx" default="0"/>
    <xs:attribute type="xs:stringint" name="heighty" default="0"/>
    <xs:attribute type="xs:string" name="alignwidth" default="LEFT0"/>
    <xs:attribute type="xs:intstring" name="padding-leftheight" default="0"/>
    <xs:attribute type="xs:intstring" name="padding-rightalign" default="0LEFT"/>
    <xs:attribute type="xs:int" name="padding-topleft" default="0"/>
    <xs:attribute type="xs:int" name="padding-bottomright" default="0"/>
  </xs:  <xs:attribute type="xs:int" name="padding-top" default="0"/>
    <xs:attribute type="xs:int" name="padding-bottom" default="0"/>
  </xs:complexType>
  <xs:complexType name="rowType">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:choice>
        <xs:element name="video" type="videoType"/>
        <xs:element name="div" type="divType"/>
        <xs:element name="row" type="rowType"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute type="xs:int" name="x" default="0"/>
    <xs:attribute type="xs:int" name="y" default="0"/>
    <xs:attribute type="xs:string" name="width" default="0"/>
    <xs:attribute type="xs:string" name="height" default="0"/>
    <xs:attribute type="xs:string" name="align" default="LEFT"/>
    <xs:attribute type="xs:int" name="padding-left" default="0"/>
    <xs:attribute type="xs:int" name="padding-right" default="0"/>
    <xs:attribute type="xs:int" name="padding-top" default="0"/>
    <xs:attribute type="xs:int" name="padding-bottom" default="0"/>
  </xs:complexType>
  <xs:complexType name="bodyType">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:choice>
        <xs:element name="video" type="videoType"/>
        <xs:element name="div" type="divType"/>
        <xs:element name="row" type="rowType"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute type="xs:string" name="watermark"/>
  </xs:complexType>
</xs:schema>

Начиная со сборки 5.2.1052, файл схемы располагается по следующему пути /usr/localk/FlashphonerWebCallServer/conf/mixer.xsd. Описания картинок проверяются по данной схеме, если Описания картинок проверяются по данной схеме, если валидация для какого-то количества участников не проходит, то будет использовано стандартное размещение картинок.

...

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

  • crop - увеличивает картинку и обрезает вокруг центра
  • id - идентификатор позиции для размещения картинки потока (добавлен в сборке 5.2.1950)

Атрибут crop может принимать значения true или false.

Атрибут id может принимать любые значения, но должен быть уникальным в пределах XML файла описания размещения картинок

Ширина картинки потока

Начиная со сборки 5.2.1052, ширина картинки может задаваться как в пикселях или процентах от ширины родительского элемента, так и в колонках. Для этого родительским элементов элементом должен быть элемент row, например

Code Block
languagexml
themeRDark
  <row height<?xml version="80%1.0" align="CENTERencoding="utf-8"?>
<body>
  <row height="80%" align="CENTER">
    <video width="1col" align="INLINE_HORIZONTAL_CENTER"/>
    <video width="1col" align="INLINE_HORIZONTAL_CENTER"/>
  </row>
</body>

В этом случае, при разборе файла описания размер одной колонки вычисляется, как ширина строки, деленная на количество картинок одного уровня, затем для всех картинок в строке устанавливается размер в соответствии с указанным в атрибуте width количеством колонок.

Пример картинки микшера для вышеприведенного описания

Шаблон имени потока

...

Warning

Не допускается смешивать в элементах одного уровня ширину в колонках и в процентах!

Начиная со сборки 5.2.1094, ширина в колонках может быть указана также и для дочерних элементов div

Code Block
languagexml
themeRDark
<video>test</video>

отобразит только поток с именем test, к другим потока этот элемент применяться не будет.

Шаблон может быть задан регулярным выражением, например

Code Block
languagexml
themeRDark
<video>test1.*</video>

В этом случае данный элемент отобразит поток с именем test1, test1#room1, test11 и т.д.

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

Code Block
languagexml
themeRDark
<?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>
<?xml version="1.0" encoding="utf-8"?>
<body>
  <div height="80%" align="CENTER">
    <video width="1col" align="INLINE_HORIZONTAL_CENTER"/>
    <video width="1col" align="INLINE_HORIZONTAL_CENTER"/>
  </row>
</body>

Высота картинки потока

Начиная со сборки 5.2.1094, высота картинки может задаваться как в пикселях или процентах от высоты родительского элемента, так и в строках

Code Block
languagexml
themeRDark
<?xml version="1.0" encoding="utf-8"?>
<body>
  <row height="1row" align="INLINE_VERTICAL_CENTER">
    <div width="1601col" height="90100%" padding-leftalign="0INLINE_HORIZONTAL_CENTER"><video padding-rightwidth="0100%" padding-bottomheight="0100%" align="RIGHT">CENTER"/></div>
    <video>.*</video>
  </div>
</body>

В этом случае поток test3 будет отображен в последнем video элементе.

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

В сборке 5.2.1051 добавлена возможность указать в описании количества участников картинку в формате PNG, которая будет применена в качестве водяного знака ко всему потоку микшера или к потоку отдельного участника.

Для применения водяного знака ко всему потоку микшера необходимо добавить атрибут watermark с указанием имени PNG файла к элементу body:

Code Block
languagexml
themeRDark
<body watermark="image.png">
  <row height="80%" align="CENTER"<div width="1col" height="100%" align="INLINE_HORIZONTAL_CENTER"><video width="100%" height="100%" align="CENTER"/></div>
  </row>
  <row height="1row" align="INLINE_VERTICAL_CENTER">
    <div width="1col" height="100%" align="INLINE_HORIZONTAL_CENTER"/>
    <video<div width="1col" height="50%100%" align="INLINE_HORIZONTAL_CENTER"/>><video width="100%" height="100%" align="CENTER"/></div>
    <video<div width="50%1col" height="100%" align="INLINE_HORIZONTAL_CENTER"/>
  </row>
  <row height="1row" align="INLINE_VERTICAL_CENTER" />
</body>

При этом PNG файл должен располагаться в каталоге описания размещения картинок:

Code Block
languagebash
themeRDark
[root@demo ~]# ls -l /opt/GridLayout
total 20
-rw-r--r-- 1 root root  106 Sep 30 13:10 1_participants.mix
-rw-r--r-- 1 root root  204 Oct 11 12:11 2_participants.mix
-rw-r--r-- 1 root root  409 Oct  8 13:18 3_participants.mix
-rw-r--r-- 1 root root  591 Oct  8 13:00 4_participants.mix
-rw-r--r-- 1 root root 3434 Oct  7 08:57 image.png

Пример выходного потока микшера с наложенным водяным знаком

Image Removed

Водяной знак может быть наложен и на поток отдельного участника, для этого необходимо добавить атрибут watermark с указанием имени PNG файла к элементу video:

Code Block
languagexml
themeRDark
<body>
  <row height="80%" align="CENTER">
    <video watermark="image.png" width="50%" align="INLINE_HORIZONTAL_CENTER"/>
    <video width="50%" align="INLINE_HORIZONTAL_CENTER"/>
  </row>
</body>

Image Removed

Обработка ошибок

1. Если вариант размещения картинок не содержит описания для определенного количества участников, будет использован вариант, заданный в настройке

Code Block
themeRDark
mixer_layout_class=com.flashphoner.media.mixer.video.presentation.GridLayout

По умолчанию, используется GridLayout

2. Если имя потока не соответствует ни одному шаблону в описании текущего количества участников, аудио и видео из такого потока не будет добавлено в выходной поток микшера

Примеры

Распределение картинок согласно именам потоков

Рассмотрим вариант размещения в микшере с выходным потоком 640x360 до трех участников. Обратите внимание, что в данном случае размеры картинок для всех потоков заданы явным образом, и не должны превышать размеров холста микшера.В этом случае, при разборе файла описания размер одной строки вычисляется, как высота родительского элемента, деленная на количество элементов одного уровня, затем для всех элементов устанавливается размер в соответствии с указанным в атрибуте height количеством строк.

Пример картинки микшера для вышеприведенного описания

Image Added

Warning

Не допускается смешивать в элементах одного уровня высоту в строках и в процентах!

Шаблон имени потока

Элемент video может задавать шаблон имени потока. Например

Code Block
languagexml
themeRDark
<video>test</video>

отобразит только поток с именем test, к другим потока этот элемент применяться не будет.

Шаблон может быть задан регулярным выражением, например

Code Block
languagexml
themeRDark
<video>test1.*</video>

В этом случае данный элемент отобразит поток с именем test1, test1#room1, test11 и т.д.

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

Code Block
languagexml
themeRDark
<?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 элементе.

Размещение потока в определенной позиции

В сборке 5.2.1950 добавлена возможность поместить картинку потока в заданную позицию по ее идентификатору. Это удобно в том случае, если невозможно воспользоваться шаблоном имени потока. Например, есть описание размещения картинок на три участника

Code Block
languagexml
themeRDark
<?xml version="1.0" encoding="utf-8"?>
<body>
  <row height="100%" align="CENTER">
    <video width="100%" id="desktop" align="CENTER"></video>
    <row height="20%" align="BOTTOM">
      <div width="1col" height="100%" align="INLINE_HORIZONTAL"><video width="95%" height="95%" id="speaker" align="RIGHT"/></div>
      <div width="1col" height="100%" align="INLINE_HORIZONTAL"><video width="95%" height="95%" id="participant" align="LEFT"/></div>
    </row>
  </row>
</body>

В этом случае можно переместить поток в позицию с идентификатором desktop при помощи REST API запроса /mixer/set_position :

Code Block
languagejs
themeRDark
POST /rest-api/mixer/set_position HTTP/1.1
Host: localhost:8081
Content-Type: application/json

{
    "uri": "mixer://mixer1",
    "remoteStreamName": "stream3",
    "videoPositionId": "desktop"
}

Также поток можно поместить в заданную позицию при его добавлении в микшер:

Code Block
languagejs
themeRDark
POST /rest-api/mixer/add HTTP/1.1
Host: localhost:8081
Content-Type: application/json

{
    "uri": "mixer://mixer1",
    "remoteStreamName": "stream1",
    "videoPositionId": "speaker"
}

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

В сборке 5.2.1051 добавлена возможность указать в описании количества участников картинку в формате PNG, которая будет применена в качестве водяного знака ко всему потоку микшера или к потоку отдельного участника.

Для применения водяного знака ко всему потоку микшера необходимо добавить атрибут watermark с указанием имени PNG файла к элементу body:

Code Block
languagexml
themeRDark
<body watermark="image.png">
  <row height="80%" align="CENTER">
    <video width="50%" align="INLINE_HORIZONTAL_CENTER"/>
    <video width="50%" align="INLINE_HORIZONTAL_CENTER"/>
  </row>
</body>

При этом PNG файл должен располагаться в каталоге описания размещения картинок:

Code Block
languagebash
themeRDark
[root@demo ~]# ls -l /opt/GridLayout
total 20
-rw-r--r-- 1 root root  106 Sep 30 13:10 1_participants.mix
-rw-r--r-- 1 root root  204 Oct 11 12:11 2_participants.mix
-rw-r--r-- 1 root root  409 Oct  8 13:18 3_participants.mix
-rw-r--r-- 1 root root  591 Oct  8 13:00 4_participants.mix
-rw-r--r-- 1 root root 3434 Oct  7 08:57 image.png

Пример выходного потока микшера с наложенным водяным знаком

Image Added

Водяной знак может быть наложен и на поток отдельного участника, для этого необходимо добавить атрибут watermark с указанием имени PNG файла к элементу video:

Code Block
languagexml
themeRDark
<body>
  <row height="80%" align="CENTER">
    <video watermark="image.png" width="50%" align="INLINE_HORIZONTAL_CENTER"/>
    <video width="50%" align="INLINE_HORIZONTAL_CENTER"/>
  </row>
</body>

Image Added

Описание демонстрации экрана для определенного количества участников

В сборке 5.2.1091 добавлена возможность описать вариант размещения картинок с демонстрацией экрана для определенного количества участников. Файлы описаний для демонстрации экрана должны иметь расширение .desktopmix и располагаться в том же каталоге варианта размещения картинок, что и файлы описаний без экрана:

Code Block
languagebash
themeRDark
1_participants.desktopmix
2_participants.desktopmix
3_participants.desktopmix
1_participants.mix
2_participants.mix
3_participants.mix

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

Code Block
languagexml
themeRDark
title3_participants.desktopmix
<?xml version="1.0" encoding="utf-8"?>
<body>
  <row height="80%" align="TOP">
    <video width="100%" align="CENTER">.*_desktop.*</video>
  </row>
  <row height="20%" align="BOTTOM">
    <div width="1col" height="100%" align="INLINE_HORIZONTAL_CENTER"><video width="90%" align="CENTER"/></div>
    <div width="1col" height="100%" align="INLINE_HORIZONTAL_CENTER"><video width="90%" align="CENTER"/></div>
  </row>
</body>

Image Added

Обратите внимание, что с точки зрения микшера поток экрана - такой же участник, поэтому дескриптор на 3 потока в микшере в данном случае описывает два потока участников плюс экран одного из участников

Если файла *.desktopmix нет для заданного количества участников, и в микшер добавлен поток экрана, будет использовано стандартное размещение картинок для демонстрации экрана

Обработка ошибок

1. Если вариант размещения картинок не содержит описания для определенного количества участников, будет использован вариант, заданный в настройке

Code Block
themeRDark
mixer_layout_class=com.flashphoner.media.mixer.video.presentation.GridLayout

По умолчанию, используется GridLayout

2. Если имя потока не соответствует ни одному шаблону в описании текущего количества участников, аудио и видео из такого потока не будет добавлено в выходной поток микшера

Примеры

Распределение картинок согласно именам потоков

Рассмотрим вариант размещения в микшере с выходным потоком 640x360 до трех участников. Обратите внимание, что в данном случае размеры картинок для всех потоков заданы явным образом, и не должны превышать размеров холста микшера.

Описание на одного участника:

Code Block
languagexml
themeRDark
title1_test.mix
<?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>

Описание на двух участников

Code Block
languagexml
themeRDark
title2_test.mix
<?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>

Описание на трех участников

Code Block
languagexml
themeRDark
title3_test.mix
<?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="LEFT">
    <video crop="false">test1.*</video>
  </div>
  <div width="320" height="180" padding-left="0" padding-right="0" padding-bottom="0" align="RIGHT">
    <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="false">test3.*</video>
  </div>
</body>

Пример отображения потока test1

Image Added

Пример отображения двух потоков test1 и test2

Image Added

Пример отображения потоков test1, test2 и test3

Image Added

Распределение картинок случайным образом, без строгого указания размера

Описание на одного участника:

Code Block
languagexml
themeRDark
title1_testparticipants.mix
<?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>encoding="utf-8"?>
<body>
  <row height="80%" align="CENTER">
    <video width="100%" align="CENTER"/>
  </row>
</body>

Описание на двух участников

Code Block
languagexml
themeRDark
title2_participants.mix
<?xml version="1.0" encoding="utf-8"?>
<body>
  <row height="80%" align="CENTER">
    <video width="50%" align="INLINE_HORIZONTAL_CENTER"/>
    <video width="50%" align="INLINE_HORIZONTAL_CENTER"/>
  </row>
</body>

Описание на двух трех участников

Code Block
languagexml
themeRDark
title23_testparticipants.mix
<?xml version="1.0" encoding="utf-8"?>
<body>
<body xsi:noNamespaceSchemaLocation  <row height="schema.xsd50%" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instancealign="INLINE_VERTICAL_CENTER">
  <div width="320" height="180" padding-left="0" padding-right="0" padding-bottom="0 <div width="50%" height="100%" align="TOPINLINE_HORIZONTAL_CENTER">
    <video crop="false">test1.*</video>
  </div>
><video width="100%" align="CENTER"/></div>
    <div width="32050%" height="180" padding-left="0" padding-right="0" padding-bottom="0"100%" align="INLINE_HORIZONTAL_CENTER"><video width="100%" align="CENTER"/></div>
  </row>
  <row height="50%" align="BOTTOMINLINE_VERTICAL_CENTER">
    <video crop width="100%" align="falseCENTER">test2.*</video>>
  </div>row>
</body>

...

Пример отображения одного потока

Image Added

Пример отображения двух потоков

Image Added

Пример отображения трех потоков

Image Added

Инструмент для отображения размещения картинок

В сборке 5.2.1035 добавлен инструмент для отображения вариантов размещения картинок, запускаемый из командной строки

Code Block
languagexmlbash
themeRDark
title3_test.mix
<?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="LEFT">
    <video crop="false">test1.*</video>
  </div>
  <div width="320" height="180" padding-left="0" padding-right="0" padding-bottom="0" align="RIGHT">
    <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="false">test3.*</video>
  </div>
</body>

Пример отображения потока test1

Image Removed

Пример отображения двух потоков test1 и test2

Image Removed

Пример отображения потоков test1, test2 и test3

Image Removed

Распределение картинок случайным образом, без строгого указания размера

Описание на одного участника:

Code Block
languagexml
themeRDark
title1_participants.mix
<?xml version="1.0" encoding="utf-8"?>
<body>
  <row height="80%" align="CENTER">
    <video width="100%" align="CENTER"/>
  </row>
</body>

Описание на двух участников

Code Block
languagexml
themeRDark
title2_participants.mix
<?xml version="1.0" encoding="utf-8"?>
<body>
  <row height="80%" align="CENTER">
    <video width="50%" align="INLINE_HORIZONTAL_CENTER"/>
    <video width="50%" align="INLINE_HORIZONTAL_CENTER"/>
  </row>
</body>

Описание на трех участников

Code Block
languagexml
themeRDark
title3_participants.mix
<?xml version="1.0" encoding="utf-8"?>
<body>
  <row height="50%" align="INLINE_VERTICAL_CENTER">
    <div width="50%" height="100%" align="INLINE_HORIZONTAL_CENTER"><video width="100%" align="CENTER"/></div>
    <div width="50%" height="100%" align="INLINE_HORIZONTAL_CENTER"><video width="100%" align="CENTER"/></div>
  </row>
  <row height="50%" align="INLINE_VERTICAL_CENTER">
    <video width="100%" align="CENTER"/>
  </row>
</body>

Пример отображения одного потока

Image Removed

Пример отображения двух потоков

Image Removed

Пример отображения трех потоков

Image Removed

Инструмент для отображения размещения картинок

В сборке 5.2.1035 добавлен инструмент для отображения вариантов размещения картинок, запускаемый из командной строки

Code Block
languagebash
themeRDark
cd /usr/local/FlashphonerWebCallServer/tools
bash ./mixer_layout_tool.sh /path/to/mixer_layout -o=/path/to/output

Инструмент выводит в указанный каталог одну картинку в формате PNG на один файл описания количества участников.

Поддерживаются следующие параметры:

  • /path/to/mixer_layout - путь к каталогу варианта размещения картинок, обязательный параметр
  • -o=/path/to/output - путь к каталогу для вывода картинок
  • -n=1 - количество участников в микшере, для которого должна быть выведена картинка; если не задано, будут выведены картинки для всех файлов описаний в данном варианте размещения
  • -N=test1,test2,test3 - список имен потоков, используемых при формировании картинок: если имен потоков в списке меньше, чем заданное количество участников, будут автоматически сгенерированы имена stream0, stream1 и т.д.
  • -p=test - префикс для генерации имен потоков, используемых при формировании картинок; имена генерируются последовательно, начиная с 0, например test0, test1, test2 и т.д.
  • -a - отрисовка рамок индикатора речи вокруг всех картинок
  • -s=640:360 - размер картинки, имитирующей поток участника, по умолчанию совпадает с размером микшера
  • -h - выводит список параметров инструмента

Инструмент использует текущие настройки микшера из файла flashphoner.properties

Примеры отображения

Рассмотрим примеры отображения варианта расположения картинок, приведенного выше

1. Картинка для одного участника с отображением рамки индикатора речи, имена потоков задаются явно

Code Block
languagebash
themeRDark
bash ./mixer_layout_tool.sh /opt/mixer_layout -o=/tmp -N=test1,test2,test3 -n=1 -a

Файл /tmp/1_test.png

Image Removed

2. Картинка для трех участников с указанием префикса и автоматическим формированием имен потоков

Code Block
languagebash
themeRDark
bash ./mixer_layout_tool.sh /opt/mixer_layouts -o=/tmp -p=test -n=3

Файл /tmp/3_test.png

Image Removed

Шаблоны имен потоков в описаниях данного варианта заданы явным образом как test1.*, test2.*, test3.*. При автоматической генерации имен потоков отсчет начинается с 0, поэтому для данного количества участников были созданы имена test0, test1, test2. В этом случае для недостающего потока test3 имя отображается как No stream for: test3.*

Обработка ошибок

Если размер картинки в описании варианта размещения картинок превышает размеры холста микшера, инструмент выведет сообщение об ошибке, файл PNG не будет сгенерирован:

Code Block
themeRDark
13:54:49,232 INFO  toryLayoutController - Mixer got 2 frames. Using 2_test.mix descriptor
Computed layout would produce exception: java.lang.RuntimeException: Computed layout element: Layout{point=java.awt.Point[x=-106,y=0], dimension=java.awt.Dimension[width=852,height=478], frame:true} out of bounds
Please check configuration for this set of participants: [test1, test2]

...

cd /usr/local/FlashphonerWebCallServer/tools
bash ./mixer_layout_tool.sh /path/to/mixer_layout -o=/path/to/output

Инструмент выводит в указанный каталог одну картинку в формате PNG на один файл описания количества участников.

Поддерживаются следующие параметры:

  • /path/to/mixer_layout - путь к каталогу варианта размещения картинок, обязательный параметр
  • -o=/path/to/output - путь к каталогу для вывода картинок
  • -n=1 - количество участников в микшере, для которого должна быть выведена картинка; если не задано, будут выведены картинки для всех файлов описаний в данном варианте размещения
  • -N=test1,test2,test3 - список имен потоков, используемых при формировании картинок: если имен потоков в списке меньше, чем заданное количество участников, будут автоматически сгенерированы имена stream0, stream1 и т.д.
  • -p=test - префикс для генерации имен потоков, используемых при формировании картинок; имена генерируются последовательно, начиная с 0, например test0, test1, test2 и т.д.
  • -a - отрисовка рамок индикатора речи вокруг всех картинок
  • -s=640:360 - размер картинки, имитирующей поток участника, по умолчанию совпадает с размером микшера
  • -h - выводит список параметров инструмента

Инструмент использует текущие настройки микшера из файла flashphoner.properties

Примеры отображения

Рассмотрим примеры отображения варианта расположения картинок, приведенного выше

1. Картинка для одного участника с отображением рамки индикатора речи, имена потоков задаются явно

Code Block
languagebash
themeRDark
bash ./mixer_layout_tool.sh /opt/mixer_layout -o=/tmp -N=test1,test2,test3 -n=1 -a

Файл /tmp/1_test.png

Image Added

2. Картинка для трех участников с указанием префикса и автоматическим формированием имен потоков

Code Block
languagebash
themeRDark
bash ./mixer_layout_tool.sh /opt/mixer_layouts -o=/tmp -p=test -n=3

Файл /tmp/3_test.png

Image Added

Шаблоны имен потоков в описаниях данного варианта заданы явным образом как test1.*, test2.*, test3.*. При автоматической генерации имен потоков отсчет начинается с 0, поэтому для данного количества участников были созданы имена test0, test1, test2. В этом случае для недостающего потока test3 имя отображается как No stream for: test3.*

Обработка ошибок

1. Если размер картинки в описании варианта размещения картинок превышает размеры холста микшера, инструмент выведет сообщение об ошибке, файл PNG не будет сгенерирован:

Code Block
themeRDark
13:54:49,232 INFO  toryLayoutController - Mixer got 2 frames. Using 2_test.mix descriptor
Computed layout would produce exception: java.lang.RuntimeException: Computed layout element: Layout{point=java.awt.Point[x=-106,y=0], dimension=java.awt.Dimension[width=852,height=478], frame:true} out of bounds
Please check configuration for this set of participants: [test1, test2]

Если создать микшер с таким вариантом размещения картинок, микшер будет закрыт с таким же сообщением об ошибке.

2. Если для какого-то количества участников нет файлов описания *.mix и *.desktopmix , инструмент выведет для этого количества участников картинку с суффиксом _fallback , используя стандартное размещение из настроек WCS.

Реализация стандартных размещений картинок на языке разметки

В архиве Layouts.tar.gz приведены примеры реализации стандартных размещений картинок в микшере, совместимый со сборками WCS, начиная с 5.2.1094 и новее

View file
nameLayouts.tar.gz
height250

Архив содержит следующие каталоги:

  • GridLayout - реализация размещения картинок сеткой с промежутками между картинками

Image Added

  • CenterNoPaddingGridLayout - реализация размещения картинок сеткой без промежутков между картинками

Image Added

  • СropNoPaddingGridLayout - реализация размещения картинок сеткой без промежутков между картинками c увеличением и обрезкой вокруг центральной части кадра

Image Added

  • samples - каталог с примерами картинок выходного потока микшера

Использование

1. Распаковать архив в каталог /opt

Code Block
languagebash
themeRDark
cd /opt
tar -xzf ~/Layouts.tar.gz 

2. В файле настроек flashphoner.properties указать нужное размещение картинок в качестве используемого по умолчанию

Code Block
themeRDark
mixer_layout_dir=/opt/GridLayout

либо указывать нужное размещение при создании микшера по REST API

Code Block
languagejs
themeRDark
POST /rest-api/mixer/startup HTTP/1.1
Host: localhost:8081
Content-Type: application/json
 
{
    "uri": "mixer://mixer1",
    "localStreamName": "mixer1_stream",
    "hasVideo": true,
    "hasAudio": true,
    "mixerLayoutDir": "/opt/CenterNoPaddingGridLayout"
}

Реализация размещения "картинка-в-картинке"

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

Code Block
languagexml
themeRDark
<?xml version="1.0" encoding="utf-8"?>
<body>
  <row height="100%" align="CENTER">
    <video width="100%" align="CENTER">.*_desktop.*</video>
    <row height="20%" align="BOTTOM">
      <div width="1col" height="100%" align="INLINE_HORIZONTAL"/>
      <div width="1col" height="100%" align="INLINE_HORIZONTAL"><video width="95%" height="95%" align="CENTER"/></div>
      <div width="1col" height="100%" align="INLINE_HORIZONTAL"><video width="95%" height="95%" align="CENTER"/></div>
      <div width="1col" height="100%" align="INLINE_HORIZONTAL"><video width="95%" height="95%" align="CENTER"/></div>
      <div width="1col" height="100%" align="INLINE_HORIZONTAL"/>
    </row>
  </row>
</body>

Image Added

Пример описания размещения картинок до 10 участников + 1 поток рабочего стола приведен в архиве FullscreenDesktopLayout.tar.gz 

View file
nameFullscreenDesktopLayout.tar.gz
height250

Поток рабочего стола должен иметь имя с суффиксом _desktop , например user1_desktop-room123456