Оптимизация производства с помощью уровня автоматизации mimoLive
Слой автоматизации mimoLive был изначально разработан в качестве пробного варианта, но с тех пор оказался невероятно полезным инструментом для пользователей. Этот слой можно использовать для автоматизации включения и выключения слоев в определенной последовательности или в заранее определенное время, переноса информации с одного слоя на другой, запуска и остановки Направления выводаи многое другое!
Он может быть особенно полезен при создании сложных постановок с несколькими слоями и входами, так как устраняет необходимость в ручном переключении и синхронизации. С помощью этого уровня пользователи могут сосредоточиться на создании увлекательного контента, в то время как программное обеспечение будет управлять синхронизацией и последовательностью действий. Теперь, во второй версии этого слоя, мы расширили команды, чтобы поднять автоматизацию в mimoLive на совершенно новый уровень.
Пример: Уровень автоматизации
Сценарии автоматизации в mimoLive не выполняются в реальном времени
Обратите внимание, что время выполнения сценариев автоматизации в mimoLive может быть неточным из-за асинхронной природы HTTP-запросов, вызываемых движком рендеринга видео. Эти скрипты полагаются на HTTP-запросы к API, и длительность этих запросов не может быть точно определена, что приводит к потенциальным расхождениям во времени. Пожалуйста, имейте это в виду при использовании сценариев автоматизации в рабочем процессе.
Пререквизит
Для того чтобы этот слой работал, необходимо включить HTTP Сервер в mimoLive для включения удаленного управления API. Перейти к mimoLive -> Предпочтения -> Пульты дистанционного управления: Отметьте опцию "Разрешить доступ к удаленному управлению". (В настоящее время уровень автоматизации в mimoLive работает только без пароля)
Настройка слоя автоматизации
Есть два варианта того, как должен вести себя слой после включения:
Вариант | Поведение |
---|---|
Автоматическое отключение слоя | Для этой опции доступен только один сценарий. Как только этот сценарий будет обработан, слой выключится. Эту опцию можно использовать, если последовательность должна быть выполнена один раз. |
Выключение слоя вручную (например, оператором) | В этом случае доступны три сценария. Когда слой переключается в режим реального времени, обрабатывается сценарий "On Live". После этого в бесконечном цикле обрабатывается сценарий "While Live". Когда слой будет выключен, будет обработан сценарий "Turned Off". Если у вас нет необходимости в определенной фазе, вы можете оставить связанный с ней скрипт пустым. |
Комментарии к исходному коду
Чтобы помочь вам запомнить функции вашего скрипта, мы рекомендуем использовать комментарии в вашем скрипте:
// First sleep for 5 seconds...
sleep(5)
// ...then start the stopwatch layer:
layerOn("7C4665C4-0E17-4F63-BCFF-B59D68D75956")
Комментарии должны быть в отдельной строке.
Команды сценариев
Язык сценариев является собственным и включает в себя несколько команд. Эти команды перечислены в шпаргалке в предварительном просмотре слоев справа. Поскольку список может быть немного маловат для чтения, Вы можете развернуть предварительный просмотр с помощью кнопки, расположенной над и справа от области предварительного просмотра.
layerOn()
Эта команда позволяет Вам включить слой или его вариант.
// switching on a layer by its id
layerOn("4E38A868-DCB5-4E9C-AC75-231764229BFA")
// switching on a layer variant by its id
layerOn("4E38A868-DCB5-4E9C-AC75-231764229BFA/variants/5F18C566-F59F-45B4-8D40-27EF289D47B1")
// switching on a layer by its long API Endpoint URL
layerOn("/api/v1/documents/863743527/layers/4E38A868-DCB5-4E9C-AC75-231764229BFA")
// switching on a layer with a defined variable
setVariable($myLayerID, "4E38A868-DCB5-4E9C-AC75-231764229BFA")
layerOn($myLayerID)
layerOff(<API Layer ID as String Expression>)
Эта команда позволяет Вам отключить слой или его разновидность.
// switching off a layer by its id
layerOff("4E38A868-DCB5-4E9C-AC75-231764229BFA")
// switching off a layer variant by its id
layerOff("4E38A868-DCB5-4E9C-AC75-231764229BFA/variants/5F18C566-F59F-45B4-8D40-27EF289D47B1")
// switching off a layer by its long API Endpoint URL
layerOff("/api/v1/documents/863743527/layers/4E38A868-DCB5-4E9C-AC75-231764229BFA")
// switching off a layer with a defined variable
setVariable($myLayerID, "4E38A868-DCB5-4E9C-AC75-231764229BFA")
layerOff($myLayerID)
layerSetRecall(<API Layer Set ID as String Expression>)
Эта команда может использоваться для запуска отзыва для определенного Набор слоев.
// recall a Layer Set by its id
layerSetRecall("E6950B7A-7457-44C5-81F7-972D9B04DBC3")
// recall a Layer Set by its long API Endpoint URL
layerSetRecall("/api/v1/documents/863743527/layer-sets/E6950B7A-7457-44C5-81F7-972D9B04DBC3")
// recall a Layer Set with a defined variable
setVariable($myLayerSetID, "E6950B7A-7457-44C5-81F7-972D9B04DBC3")
layerSetRecall($myLayerSetID)
outputOn(<API Вывод идентификатора места назначения как строковое выражение>)
Используйте эту команду для включения пункта назначения вывода.
// запустите выходной пункт назначения по его идентификатору
outputOn("1953186E-4176-4849-A8ED-5B47EE1627BD")
// запустите пункт назначения вывода по его длинному URL конечной точки API
outputOn("/api/v1/documents/1677022440/output-destinations/1953186E-4176-4849-A8ED-5B47EE1627BD")
// запустите пункт назначения вывода с определенной переменной
setVariable($myOutputDestinationtID, "1953186E-4176-4849-A8ED-5B47EE1627BD")
outputOn($myOutputDestinationtID)
outputOff(<API Вывод идентификатора места назначения как строковое выражение>)
Используйте эту команду для отключения пункта назначения вывода.
// остановите выходной пункт назначения по его идентификатору
outputOff("1953186E-4176-4849-A8ED-5B47EE1627BD")
// остановите выходной пункт назначения по его длинному URL конечной точки API
outputOn("/api/v1/documents/1677022440/output-destinations/1953186E-4176-4849-A8ED-5B47EE1627BD")
// остановите выходной пункт назначения с определенной переменной
setVariable($myOutputDestinationtID, "1953186E-4176-4849-A8ED-5B47EE1627BD")
outputOff($myOutputDestinationtID)
getLayerData($resultVariableName, , )
Эта команда объединяет несколько команд в одном шаге сценария: Она считывает информацию об уровне с HTTP-сервера и сохраняет определенное поле данных из JSON-ответа в переменную. Вам нужен точный путь к значению, которое Вы хотите прочитать. Для входных параметров слоев этот путь обычно начинается с "data.attributes.input-values".
// set up useful variables
setVariable($myScoreboardLayerID, "36FA76B4-11FE-4879-8DE1-307222512712")
setVariable($pathToHomeScore, "data.attributes.input-values.tvGroup_Control__Score_Home")
// read the score for the home team from the Basketball layer
getLayerData($currentHomeScore, $myScoreboardLayerID, $pathToHomeScore)
// The variable $currentHomeScore now contains the Home Score input value of the Basketball Score layer
getObjectIDByName($resultVariableName, , )
Эта команда получает конечную точку API для определенного объекта mimoLive по его отображаемому имени. Пожалуйста, имейте в виду, что отображаемое имя может быть легко изменено оператором mimoLive в пользовательском интерфейсе mimoLive, что, в свою очередь, приведет к поломке сценария автоматизации, если он больше не сможет найти конкретный объект. С другой стороны, эту команду можно использовать для программного поиска конечных точек API без необходимости жесткого кодирования конечных точек API в сценарии.
Валидными опциями для являются: "source", "layer", "layer-set", "output-destination".
// Get the API Endpoint for the Basketball Score layer
getObjectIDByName($myBasketballScoreLayerID, "layer", "My Basketball Score Keeper")
// switch this layer on
layerOn($myBasketballScoreLayerID)
спать(<Секунды> как число)
Команда sleep() приостановит выполнение скрипта на заданный интервал времени, выраженный в секундах.
// pause the script execution for 12 seconds
sleep(12)
// pause the script execution for 35.6 seconds
sleep(35.6)
// pause the script execution for a time interval specified by a variable
setVariable($mySleepInterval, 17)
sleep($mySleepInterval)
sleepUntil(<Время как строковое выражение>)
Команда sleepUntil() позволяет скрипту сделать паузу, пока не будет достигнуто указанное время. Если время уже прошло, скрипт будет ждать до следующего дня. Формат времени - ЧЧ:ММ или ЧЧ:ММ:СС в 24-часовом периоде.
// sleep until 5:15pm
sleepUntil("17:15:00")
// sleep until 9:12am
sleepUntil("9:12")
// sleep until a time specified by a variable
setVariable($myWakeUpTime, "9:41")
sleepUntil($myWakeUpTime)
sleepOnTheMinute()
Эта команда сценария приостанавливает выполнение сценария до тех пор, пока не будет достигнута следующая доля часа "на минуту".
// go on every 20 minutes: on the hour, 20 and 40 minutes past the hour:
sleepOnTheMinute(20)
// go on "on the hour"
sleepOnTheMinute(60)
// go on every 10 minutes past the hour (specified by a variable)
setVariable($myWakeUpMinute, 10)
sleepOnTheMinute($myWakeUpMinute)
setVariable($variableName, <значение>)
Чтобы определить локальную переменную, используйте setVariable
команда. Вам необходимо указать имя переменной (начинающееся с $
) и значение, которое должна содержать эта переменная. Значение может быть числом, текстом (заключенным в кавычки) или булевым значением истинный
и ложный
.
setVariable($myText, "This is a text")
setVariable($myNumber, 15.73)
setVariable($myBoolValue, false)
setGlobal($variableName, <значение>)
Глобальная переменная может использоваться как в текущем слое, так и во всех слоях автоматизации над ним. Эта функция особенно полезна для обмена одной и той же информацией между несколькими слоями автоматизации, например, конечными точками API определенного слоя. Для значения переменной действуют те же правила, что и для переменной setVariable
Команда.
Обратите внимание, что глобальные переменные доступны для других слоев Automation до тех пор, пока работает исходный слой. Такая схема позволяет Вам переключать глобальные переменные, активируя другой слой с отдельными определениями глобальных переменных. Лучше всего в этом случае установить для параметра 'Switch Layer Off' слоя автоматизации значение 'Manually' и определить глобальные переменные в сценарии 'On Live'.
setGlobal($myGlobalText, "This is a text")
setGlobal($myGlobalNumber, 15.73)
setGlobal($myGlobalBoolValue, false)
concat($resultVariableName, )
Эта команда сценария объединяет строки вместе и сохраняет результат в виде строки.
// define some variables
setVariable($myVariableA, "This is")
setVariable($myVariableB, "text.")
// concatenate those variables and store the result into a new one
concat($myResultVariable, $myVariableA + " a " + $myVariableB)
// The variable $myResultVariable contains "This is a text.".
math($resultVariableName, )
Эта команда выполняет простые математические вычисления, включая сложение (+), вычитание (-), умножение (*) и деление (/). Обратите внимание, что вычисления выполняются в порядке их появления и НЕ следуют правилу PEMDAS/BODMAS.
// define some variables
setVariable($myVariableA, 3)
setVariable($myVariableB, 5)
// perform the calculation
math($myResult, $myVariableA + 2 * $myVariableB)
// The result in $myResult is 25 (!) and not 13
if(, , ) [else] endif
Это если
Оператор сравнивает два числовых выражения с помощью указанного компаратора. Если сравнение истинно, то выполняется следующая команда (команды). В противном случае последующие команды пропускаются до тех пор, пока не будет получена команда else
или endif
достигнута.
Допустимыми компараторами являются:
“==” | равно |
“!=” | не равно |
">" | больше, чем |
"<" | менее |
">=" | больше или равно |
"<=" | меньше или больше, чем |
// define a variable
setVariable($myVariable, 3)
// test if the variable is bigger than 10
if($myVariable, ">", 10)
setVariable($text, "is bigger than 10")
else
setVariable($text, "is less or equal 10")
endif
// The result in $text is "is less or equal 10"
ifString(, , ) [else] endif
Это ifString
Оператор сравнивает два строковых выражения с помощью указанного компаратора. Сравнение основано на ASCII-коде каждой буквы в строках. Если сравнение истинно, то выполняются следующие команды. В противном случае последующие команды пропускаются до тех пор, пока не будет получено сообщение else
или endif
достигнута.
Действительные компараторы см. в команде if-command.
// define a variable
setVariable($myVariable, "mimoLive")
// test if the variable is "mimoLive"
if($myVariable, "==", "mimoLive")
setVariable($text, "yes")
else
setVariable($text, "no")
endif
// The result in $text is "yes"
ifLayerIsOn(<API Layer ID as String Expression>) - ifLayerIsOff(<API Layer ID as String Expression>) [else] endif
Эти если
Операторы проверяют, включен или нет определенный слой в данный момент. Если указанное условие выполнено (слой включен или выключен), то выполняются следующие команды. В противном случае последующие команды пропускаются до тех пор, пока не будет получена команда else
или endif
достигнута.
setVariable($myLayerA, "D6A326CA-72E6-45E5-836D-9795F8F534F4")
setVariable($myLayerB, "8C58DEA7-CCBE-44CB-A60F-97C5BD456C68")
ifLayerIsOn($myLayerA)
// the layer is live, switch it off
layerOff($myLayerA)
else
// the layer is currently off, switch it on
layerOn($myLayerA)
endif
ifLayerIsOff($myLayerB)
// the layer is currently off, switch it on
layerOn($myLayerB)
endif
ifLayerSetIsActive(<API Layer ID as String Expression>) - ifLayerSetIsInactive(<API Layer ID as String Expression>) [else] endif
Эти если
Заявления проверяют, является ли определенный Набор слоев в данный момент работает или нет. Если да, то следующие команды будут обработаны. В противном случае последующие команды пропускаются до тех пор, пока не будет получена команда else
или endif
достигнута.
setVariable($myLayerSetA, "CEF07AFA-B552-40F8-821C-CF424EB93500")
setVariable($myLayerSetB, "E4B15B8B-EE34-4CCE-BDE7-58120A65E83A")
setVariable($myLayer, "8C58DEA7-CCBE-44CB-A60F-97C5BD456C68")
ifLayerSetIsActive($myLayerSetA)
// the layer set A is active, switch layer on
layerOn($myLayer)
else
// the layer set A is currently inactive, switch the layer off
layerOff($myLayer)
endif
ifLayerSetIsInactive($myLayerSetB)
// the layer set B is currently inactive, switch the layer off
layerOn($myLayer)
endif
ifLayerData(, , , ) [else] endif
Эта сложная команда позволяет Вам проверить любой параметр слоя, который HTTP API Предоставляет. Вам нужно указать слой по его API ID, путь к ключу в JSON-данных, возвращаемых HTTP API, компаратор (в виде строки в кавычках, например, "=="
), и значение.
Допустимыми значениями компаратора являются:
“==” | равно |
“!=” | не равно |
">" | больше, чем |
"<" | менее |
">=" | больше или равно |
"<=" | меньше или больше, чем |
// Example: Testing if the audio volume is turned up on a layer
setVariable($myLayerA, "D6A326CA-72E6-45E5-836D-9795F8F534F4")
setVariable($myLayerB, "8C58DEA7-CCBE-44CB-A60F-97C5BD456C68")
ifLayerData($myLayerA,"data.attributes.volume",">",0.5)
// The audio volume is bigger than 0.5 so turn layer B on
layerOn($myLayerB)
else
// The volume is lower than 0.5, lets turn layer B off
layerOff($myLayerB)
endif
loop([]) [break] endloop
Сайт петля
Команда позволяет Вам выполнять код несколько раз. Если Вы не укажете количество итераций, цикл будет выполняться бесконечно. Команда перерыв
Команда позволяет Вам выйти из цикла в любое время. endloop
необходим для того, чтобы отметить конец командного блока, который должен быть зациклен.
setVariable($myLayerA, "D6A326CA-72E6-45E5-836D-9795F8F534F4")
// blink layer A 4 times
loop(4)
layerOn(setVariable(myLayerA)
sleep(1)
layerOff(setVariable(myLayerA)
sleep(1)
endloop
// wait for volume of layer A will be bigger than 0.5
loop()
ifLayerData($myLayerA,"data.attributes.volume",">",0.5)
// The audio volume is bigger than 0.5 exit the loop now
break
endif
sleep(1)
endloop
httpRequest()
Сайт httpRequest()
команда запускает заданный URL. Это обеспечивает большую гибкость в том, как Вы можете использовать эту команду сценария. В mimoLive
Он может даже вызывать действия в других документах или удаленных сценариях. Для получения подробной информации о mimoLive
Команды HTTP API, пожалуйста, обратитесь к HTTP API Документацию, чтобы изучить все возможные вызовы API.
// включите слой
httpRequest("http://127.0.0.1:8989/api/v1/documents/188462841/layers/BA868701-8131-49CB-8EDD-8C7E6E7CD60B/setLive")
httpRequestJSON($resultVariableName, )
Эта команда считывает ответ HTTP-вызова в формате JSON и сохраняет данные в указанной переменной result. После этого Вы можете получить доступ к данным с помощью команды getJSONData()
Команда.
getJSONData($resultVariableName, $jsonDataVariable, )
Эта команда извлекает определенное значение данных из структуры JSON, хранящейся в переменной. Вам необходимо указать переменную, содержащую данные JSON ($jsonDataVariable
), путь к данным в структуре JSON (), и переменная, в которой должен храниться результат (
$resultVariableName
). Это позволяет точно извлекать данные для дальнейшей обработки или использования в Вашем сценарии.
// получите все данные слоя
httpRequestJSON($myLayerData, "http://127.0.0.1:8989/api/v1/documents/188462841/layers/BA868701-8131-49CB-8EDD-8C7E6E7CD60B")
// получите значение циферблата громкости
getJSONData($volumenDial, $myLayerData, "data.attributes.volume")// Теперь переменная $volumenDial будет содержать значение между 0 и 1.
> Точка останова отладчика
Если отладчик скриптов включен и режим отладки установлен на 'Continuously', выполнение скрипта приостанавливается на этом маркере и ждет, пока оператор mimoLive не нажмет кнопку 'Next Step'. Более подробную информацию о возможностях отладки см. в разделе "Лучшие практики - отладка скриптов".
Типы данных
API Конечные точки
Параметр должен быть конечной точкой API для слоя, варианта слоя, набора слоев, источника или места назначения вывода. Вы можете получить эти конечные точки API, щелкнув правой кнопкой мыши на объекте в документе mimoLive. Должно появиться контекстное меню с пунктом меню 'Copy API Endpoint to Clipboard'.
Это действие скопирует конечную точку API для данного объекта в буфер обмена. Если Вы вставите его в другое место, он будет выглядеть примерно так:
/api/v1/documents/863743527/layers/D6A326CA-72E6-45E5-836D-9795F8F534F4
/api/v1/documents/863743527/layers/68F63C8F-2376-4CA3-9764-CC17CBFC5F8D/variants/3FF72CC3-AF80-4252-A879-F8AFD68DB922
/api/v1/documents/863743527/layer-sets/E6950B7A-7457-44C5-81F7-972D9B04DBC3
Для команд, относящихся к слоям, Вы можете уменьшить API Перейдите к важной части, только удалив префикс "/api/v1/documents//layers/" . Это сделает Ваш скрипт короче, как показано здесь:
// switching on a layer:
layerOn("/api/v1/documents/863743527/layers/D6A326CA-72E6-45E5-836D-9795F8F534F4")
// OR
layerOn("D6A326CA-72E6-45E5-836D-9795F8F534F4")
// switching on a variant:
layerOn("/api/v1/documents/863743527/layers/68F63C8F-2376-4CA3-9764-CC17CBFC5F8D/variants/3FF72CC3-AF80-4252-A879-F8AFD68DB922")
// OR
layerOn("68F63C8F-2376-4CA3-9764-CC17CBFC5F8D/variants/3FF72CC3-AF80-4252-A879-F8AFD68DB922")
Лучшая практика
Конечные точки API
Как получить конечные точки API
- Щелкнув правой кнопкой мыши на слое и выбрав "Копировать конечную точку API".
- с помощью команды getAPIEndpoint() (см. документацию).
Обращение к конечным точкам API
Вы можете либо использовать полную конечную точку API, либо удалить часть "/api/v1/documents//", чтобы убедиться, что Ваш скрипт работает и при копировании в другой документ. Однако ID документа важен, если Вы хотите обратиться к точке API в другом документе mimoLive.
Отладочные сценарии
В слой Automation встроен отладчик сценариев. Вы можете переключить слой в режим отладки, установив параметр слоя "Debug" в положение on.
TBD.
Идеи сценариев
Запускайте рекламу каждые 10 минут
В сочетании с "PIP Слой "Окно" и источник "Медиаплейлист", содержащий несколько коротких рекламных роликов, позволяют воспроизводить одну рекламу каждые 10 минут. Убедитесь, что снят флажок "Non-Stop" в источнике "Media Playlist". Таким образом, каждый раз, когда PIP При установке окна в режим реального времени оно воспроизведет одно объявление из источника Playlist и выключится. Через 10 минут будет воспроизведена следующая реклама.
Запускайте стингер перед переходом на определенный слой
Вам нужно подготовить короткий стингер-ролик, в котором будет происходить переход до тех пор, пока он не займет весь экран (например, через 1 секунду). Через 1 секунду вы переключитесь на слой, который хотите раскрыть. Расположите этот слой под слоем, воспроизводящим видеоролик. Теперь, когда видеоролик закрывает экран, переключение слоя ниже не будет видно. Видеоролик должен продолжаться, раскрывая слой ниже. Убедитесь в том, что видеоролик "стингер" рендерится в видеокодеке ProRes4444, чтобы он передавал прозрачность, необходимую для перехода.
Создайте сложную открывалку для шоу
Поскольку вы можете включать и выключать слои один за другим в течение длительного времени, у вас может быть несколько слоев с текстом или аннотациями, слой с графикой или даже нижние трети, заполняющие экран, чтобы сделать собственную анимированную открывалку. Будьте изобретательны!
Запуск пульта дистанционного управления HTTP URL нажатием на поверхность пульта дистанционного управления
Если вам нужно вызвать HTTP Запрос с помощью кнопки на вашем Поверхность для дистанционного управления вы можете добавить слой Automation в стек слоев и установить параметр "Switch Layer Off" для этого слоя в значение "Automatically". Теперь вы можете поместить одну команду httpRequest() в поле сценария "On Live". На поверхности пульта дистанционного управления добавьте кнопку Live этого слоя на макет. После нажатия этой кнопки на поверхности пульта дистанционного управления на экране появится HTTP запрос будет выполнен.