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="0"/>
        <xs:attribute type="xs:string" name="align" default="LEFT"/>
  POST /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:attributeextension typebase="xs:string">
        <xs:attribute name="value" type="watermarkxs:string"/>
        <xs:attribute type="xs:int" name="padding-leftx" default="0"/>
        <xs:attribute type="xs:int" name="padding-righty" default="0"/>
        <xs:attribute type="xs:intstring" name="padding-topwidth" default="0"/>
        <xs:attribute type="xs:intstring" name="padding-bottomheight" default="0"/>
        <xs:attribute type="xs:booleanstring" name="cropalign" default="falseLEFT"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType <xs:attribute type="xs:string" name="divTypewatermark"/>
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
:attribute type="xs:int" name="padding-left" default="0"/>
        <xs:choice>
        <xs:elementattribute type="xs:int" name="videopadding-right" typedefault="videoType0"/>
        <xs:element name="div"attribute type="divType"/>
        <xs:elementxs:int" name="rowpadding-top" typedefault="rowType0"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute type="xs:int" name="xpadding-bottom" default="0"/>
        <xs:attribute type="xs:intboolean" name="ycrop" default="0false"/>
    <xs:attribute type="xs:string"  </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="width" default="0"/divType">
    <xs:attributesequence typeminOccurs="xs:string0" namemaxOccurs="height" default="0"/unbounded">
      <xs:attribute type="xs:string"choice>
        <xs:element name="alignvideo" defaulttype="LEFTvideoType"/>
    <xs:attribute    <xs:element name="div" type="xs:int""divType"/>
        <xs:element name="padding-leftrow" defaulttype="0rowType"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute type="xs:int" name="padding-rightx" default="0"/>
    <xs:attribute type="xs:int" name="padding-topy" default="0"/>
    <xs:attribute type="xs:intstring" name="padding-bottomwidth" default="0"/>
  </xs:complexType>
  <xs:complexTypeattribute nametype="rowTypexs:string">
    <xs:sequence minOccurs name="0height" maxOccursdefault="unbounded0"/>
      <xs:choice>
        <xs:elementattribute type="xs:string" name="videoalign" typedefault="videoTypeLEFT"/>
        <xs:element<xs:attribute type="xs:int" name="divpadding-left" typedefault="divType0"/>
        <xs:element<xs:attribute type="xs:int" name="rowpadding-right" typedefault="rowType0"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute type="xs:int" name="xpadding-top" default="0"/>
    <xs:attribute type="xs:int" name="ypadding-bottom" default="0"/>
  </xs:complexType>
  <xs:attributecomplexType typename="xs:string" name="width" default="0"/rowType">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:attribute type="xs:string"choice>
        <xs:element name="heightvideo" defaulttype="0videoType"/>
        <xs:attributeelement name="div" type="xs:string""divType"/>
        <xs:element name="alignrow" defaulttype="LEFTrowType"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute type="xs:int" name="padding-leftx" default="0"/>
    <xs:attribute type="xs:int" name="padding-righty" default="0"/>
    <xs:attribute type="xs:intstring" name="padding-topwidth" default="0"/>
    <xs:attribute type="xs:intstring" name="padding-bottomheight" default="0"/>
  </xs:complexType>
  <xs:complexTypeattribute nametype="bodyTypexs:string">
    <xs:sequence minOccurs name="0align" maxOccursdefault="unboundedLEFT"/>
      <xs:choice>
        <xs:elementattribute type="xs:int" name="videopadding-left" typedefault="videoType0"/>
        <xs:element<xs:attribute type="xs:int" name="divpadding-right" typedefault="divType0"/>
        <xs:elementattribute nametype="rowxs:int" typename="rowType"padding-top" default="0"/>
      </xs:choice>
  <xs:attribute type="xs:int" name="padding-bottom" default="0"/>
  </xs:sequence>complexType>
  <xs:complexType name="bodyType">
    <xs:attributesequence typeminOccurs="xs:string0" namemaxOccurs="watermarkunbounded"/>
     </xs:complexType>
</xs:schema>

Описания картинок проверяются по данной схеме, если валидация для какого-то количества участников не проходит, то будет использовано стандартное размещение картинок.

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

  • body - контейнер верхнего уровня для описания размещения картинок, представляет холст микшера. Может использоваться только один раз в одном файле
  • div - контейнер для одной картинки, набора картинок или другого контейнера. Может использоваться в любом количестве, также может быть вложенным
  • video - описание картинки, представляет собой поток в микшере. Может использоваться в любом количестве.

Элемент body

Является контейнером верхнего уровня. Поддерживает следующие атрибуты:

  • watermark - имя файла картинки, которая будет применена как водяной знак ко всему микшеру (добавлен, начиная со сборки 5.2.1051)

Элемент div

Является контейнером для других div или video элементов. Поддерживает следующие атрибуты:

  • x, y - координаты левого верхнего угла на холсте микшера, в пикселях
  • width - ширина на холсте микшера в пикселях или процентах от ширины родительского элемента
  • height - высота на холсте микшера в пикселях или процентах от ширины родительского элемента
  • padding-left, padding-right, padding-top, padding-bottom - дополнение контейнера с каждой стороны, в пикселях
  • align - выравнивание на холсте микшера или в родительском контейнере

Атрибут align может принимать следующие значения

...

 <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>

Описания картинок проверяются по данной схеме, если валидация для какого-то количества участников не проходит, то будет использовано стандартное размещение картинок.

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

  • body - контейнер верхнего уровня для описания размещения картинок, представляет холст микшера. Может использоваться только один раз в одном файле
  • div - контейнер для одной картинки, набора картинок или другого контейнера. Может использоваться в любом количестве, также может быть вложенным
  • video - описание картинки, представляет собой поток в микшере. Может использоваться в любом количестве.

Элемент body

Является контейнером верхнего уровня. Поддерживает следующие атрибуты:

  • watermark - имя файла картинки, которая будет применена как водяной знак ко всему микшеру (добавлен, начиная со сборки 5.2.1051)

Элемент 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 - то же, что и в предыдущем случае, с центрированием по горизонтали

...

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

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

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

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

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

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

...

languagexml
themeRDark

...

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

Code Block
languagexml
themeRDark
<?xml version="1.0" encoding="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 количеством колонок.

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

Image Added

Warning

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

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

Code Block
languagexml
themeRDark
<?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="1col" height="100%" align="INLINE_HORIZONTAL_CENTER"><video width="100%" height="100%" align="CENTER"/></div>
    <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"/>
    <div width="1col" height="100%" align="INLINE_HORIZONTAL_CENTER"><video width="100%" height="100%" align="CENTER"/>></div>
    <video<div width="1col" height="100%" align="INLINE_HORIZONTAL_CENTER"/>
  </row>
  <row height="1row" align="INLINE_VERTICAL_CENTER" />
</body>

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

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

Image RemovedImage Added

Warning

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

...

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

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

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

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

...

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>
  <row height="1row" align="INLINE_VERTICAL_CENTER">
    <div width="1col" height="100%" align="INLINE_HORIZONTAL_CENTER"><video width="100%" height="100%" align="CENTER"/></div>
  <body xsi:noNamespaceSchemaLocation="schema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <div width="1col320" height="100%180" alignpadding-left="INLINE_HORIZONTAL_CENTER0"><video widthpadding-right="100%0" heightpadding-bottom="100%0" align="CENTER"/></div>
  </row>
  <row height="1row" align="INLINE_VERTICALTOP_CENTER">
    <div width="1col" height="100%" align="INLINE_HORIZONTAL_CENTER"/><video>test1.*</video>
  </div>
  <div width="1col320" height="100%180" alignpadding-left="INLINE_HORIZONTAL_CENTER0"><video widthpadding-right="100%0" heightpadding-bottom="100%0" align="BOTTOM_CENTER"/><>
    <video>test2.*</video>
  </div>
    <div width="1col160" height="90" padding-left="0" padding-right="100%"0" padding-bottom="0" align="INLINE_HORIZONTAL_CENTERRIGHT"/>
    <video>.*</row>video>
  <row height="1row" align="INLINE_VERTICAL_CENTER" />
</body>

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

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

Image Removed

Warning

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

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

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

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

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

...

</div>
</body>

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

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

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

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>

...

<?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"
}

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

...