...
Code Block | ||||
---|---|---|---|---|
| ||||
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 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
<?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 | ||||
---|---|---|---|---|
| ||||
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 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
<?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, например
...
language | xml |
---|---|
theme | RDark |
...
от ширины родительского элемента, так и в колонках. Для этого родительским элементом должен быть элемент row, например
Code Block | ||||
---|---|---|---|---|
| ||||
<?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 количеством колонок.
Пример картинки микшера для вышеприведенного описания
Warning |
---|
Не допускается смешивать в элементах одного уровня ширину в колонках и в процентах! |
Начиная со сборки 5.2.1094, ширина в колонках может быть указана также и для дочерних элементов div
Code Block | ||||
---|---|---|---|---|
| ||||
<?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 | ||||
---|---|---|---|---|
| ||||
<?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 количеством колонокстрок.
Пример картинки микшера для вышеприведенного описания
Warning |
---|
Не допускается смешивать в элементах одного уровня ширину высоту в колонках строках и в процентах! |
...
Шаблон имени потока
Элемент video может задавать шаблон имени потока. Например
Code Block | ||||
---|---|---|---|---|
| ||||
<?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> |
Высота картинки потока
...
| |||
<video>test</video> |
отобразит только поток с именем test, к другим потока этот элемент применяться не будет.
Шаблон может быть задан регулярным выражением, например
Code Block | ||||
---|---|---|---|---|
| ||||
<video>test1.*</video> |
В этом случае данный элемент отобразит поток с именем test1, test1#room1, test11 и т.д.
Если имя потока не соответствует ни одному шаблону, и в файле есть элемент video без шаблона, то для этого потока будет использован этот элемент. Например, рассмотрим описание картинки для одного участника
Code Block | ||||
---|---|---|---|---|
| ||||
<?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 количеством строк.
Пример картинки микшера для вышеприведенного описания
Warning |
---|
Не допускается смешивать в элементах одного уровня высоту в строках и в процентах! |
Шаблон имени потока
Элемент video может задавать шаблон имени потока. Например
Code Block | ||||
---|---|---|---|---|
| ||||
<video>test</video> |
отобразит только поток с именем test, к другим потока этот элемент применяться не будет.
...
</div>
</body> |
В этом случае поток test3 будет отображен в последнем video элементе.
Размещение потока в определенной позиции
В сборке 5.2.1950 добавлена возможность поместить картинку потока в заданную позицию по ее идентификатору. Это удобно в том случае, если невозможно воспользоваться шаблоном имени потока. Например, есть описание размещения картинок на три участника
Code Block | ||||
---|---|---|---|---|
| ||||
<video>test1.*</video> |
В этом случае данный элемент отобразит поток с именем test1, test1#room1, test11 и т.д.
Если имя потока не соответствует ни одному шаблону, и в файле есть элемент video без шаблона, то для этого потока будет использован этот элемент. Например, рассмотрим описание картинки для одного участника
Code Block | ||||
---|---|---|---|---|
| ||||
<?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 | ||||
---|---|---|---|---|
| ||||
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 | ||||
---|---|---|---|---|
| ||||
POST /rest-api/mixer/add HTTP/1.1
Host: localhost:8081
Content-Type: application/json
{
"uri": "mixer://mixer1",
"remoteStreamName": "stream1",
"videoPositionId": "speaker"
} |
Добавление водяного знака в поток микшера или в поток участника
...