Optimice su producción con la capa de automatización de mimoLive
La capa de automatización de mimoLive se desarrolló originalmente como una prueba de concepto, pero desde entonces ha demostrado ser una herramienta increíblemente útil para los usuarios. Esta capa puede utilizarse para automatizar el encendido y apagado de capas en una secuencia específica o en momentos predeterminados, transportar información de una capa a otra, iniciar y detener Destinos de salida, ¡y mucho más!
Puede ser especialmente útil para crear producciones complejas con múltiples capas y entradas, ya que elimina la necesidad de conmutar y temporizar manualmente. Con esta capa, los usuarios pueden centrarse en crear contenidos atractivos mientras el software se encarga de la temporización y la secuenciación de su producción. Ahora, en la versión 2 de esta capa, hemos ampliado los comandos para llevar la automatización en mimoLive a un nivel completamente nuevo.
Ejemplo: Capa de automatización
Los scripts de automatización en mimoLive no se ejecutan en tiempo real
Tenga en cuenta que la sincronización de los scripts de automatización en mimoLive puede no ser exacta debido a la naturaleza asíncrona de las solicitudes HTTP llamadas por el motor de renderización de vídeo. Estas secuencias de comandos dependen de las solicitudes HTTP a la API y la duración de estas solicitudes no se puede determinar con precisión, lo que resulta en posibles discrepancias de tiempo. Por favor, tenga esto en cuenta cuando utilice scripts de automatización en su flujo de trabajo de producción.
Requisito previo
Para que esta capa funcione es necesario activar la capa HTTP Servidor en mimoLive para activar el Control Remoto API. Ir a mimoLive -> Preferencias -> Mandos a distancia: Marque la opción "Permitir acceso de control remoto". (Actualmente la capa de automatización en mimoLive sólo funciona sin contraseña)
Configurar la capa de automatización
Hay dos opciones sobre cómo debe comportarse la capa después de ser activada:
Opción | Comportarse |
---|---|
Apagado automático de la capa | Para esta opción sólo hay un script disponible. Una vez procesado este script, la capa se apagará sola. Esta opción puede utilizarse cuando una secuencia debe ejecutarse una sola vez. |
Apagar la capa manualmente (por ejemplo, por el operario) | En este caso hay tres scripts disponibles. Cuando la capa se activa, se procesa el script "On Live". Una vez hecho esto, el script "While Live" se procesa en un bucle sin fin. Cuando la capa se apaga, se procesa el script "Apagado". Si no necesita una fase determinada, puede dejar vacía la secuencia de comandos asociada. |
Comentarios sobre el código fuente
Para ayudarle a recordar la función de su script, le recomendamos que utilice comentarios en el mismo:
// First sleep for 5 seconds...
sleep(5)
// ...then start the stopwatch layer:
layerOn("7C4665C4-0E17-4F63-BCFF-B59D68D75956")
Los comentarios deben ir en una línea aparte.
Comandos de secuencias de comandos
El lenguaje de scripting es propio e incluye varios comandos. Esos comandos se enumeran en una hoja de trucos en la vista previa de capas de la derecha. Como la lista puede resultar un poco pequeña para leerla, puede ampliar la vista previa utilizando el botón situado encima y a la derecha del área de vista previa.
layerOn()
Este comando le permite activar una capa o una variante de capa.
// 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)
capaOff(<API ID de capa como expresión de cadena>)
Este comando le permite desactivar una capa o una variante de capa.
// 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(<Capa API Establecer ID como expresión de cadena>)
Este comando puede utilizarse para activar la recuperación de un determinado Conjunto de capas.
// 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(<Salida API ID de destino como expresión de cadena>)
Utilice este comando para activar un destino de salida.
// iniciar un Destino de Salida por su id
outputOn("1953186E-4176-4849-A8ED-5B47EE1627BD")
// inicie un Destino de Salida por su URL larga de punto final de API
outputOn("/api/v1/documents/1677022440/output-destinations/1953186E-4176-4849-A8ED-5B47EE1627BD")
// inicie un Destino de Salida con una variable definida
setVariable($myOutputDestinationtID, "1953186E-4176-4849-A8ED-5B47EE1627BD")
outputOn($myOutputDestinationtID)
outputOff(<Salida API ID de destino como expresión de cadena>)
Utilice este comando para desactivar un destino de salida.
// detener un Destino de Salida por su id
outputOff("1953186E-4176-4849-A8ED-5B47EE1627BD")
// detener un Destino de salida por su URL larga de punto final de API
outputOff("/api/v1/documents/1677022440/output-destinations/1953186E-4176-4849-A8ED-5B47EE1627BD")
// detener un Destino de Salida con una variable definida
setVariable($myOutputDestinationtID, "1953186E-4176-4849-A8ED-5B47EE1627BD")
outputOff($myOutputDestinationtID)
getLayerData($resultVariableName, , )
Este comando combina varios comandos en un solo paso de script: Lee la información de la capa del servidor HTTP y almacena un campo de datos específico de las respuestas JSON en una variable. Necesita la ruta exacta al valor que desea leer. Para los parámetros de entrada de las capas esta ruta suele empezar por "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, , )
Este comando obtiene el punto final de la API para un objeto mimoLive específico por su nombre de visualización. Tenga en cuenta que el nombre de visualización puede ser cambiado fácilmente por el operador mimoLive en la interfaz de usuario mimoLive, lo que a su vez romperá el script de automatización si ya no puede encontrar el objeto específico. Por otro lado, este comando puede utilizarse para encontrar puntos finales de la API mediante programación sin necesidad de codificar los puntos finales de la API en el script.
Las opciones válidas para son: "fuente", "capa", "conjunto-capa", "salida-destino".
// Get the API Endpoint for the Basketball Score layer
getObjectIDByName($myBasketballScoreLayerID, "layer", "My Basketball Score Keeper")
// switch this layer on
layerOn($myBasketballScoreLayerID)
dormir(<Segundos> como número)
La orden sleep() detendrá la ejecución del script durante el intervalo de tiempo dado expresado en segundos.
// 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(<Hora como expresión de cadena>)
El comando sleepUntil() permite al script hacer una pausa hasta que se alcance el tiempo especificado. Si el tiempo ya ha pasado, el script espera hasta el día siguiente. El formato de la hora es HH:MM o HH:MM:SS en un periodo de 24 horas.
// 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)
dormirEnElMinuto()
Este comando de script pausa el script hasta que se alcanza la siguiente fracción de hora "al minuto".
// 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, <valor>)
Para definir una variable local, utilice el comando setVariable
. Debe especificar un nombre de variable (que empiece por $
) y el valor que debe tener esta variable. El valor puede ser un número, texto (entre comillas) o los valores booleanos true
y false
.
setVariable($myText, "This is a text")
setVariable($myNumber, 15.73)
setVariable($myBoolValue, false)
setGlobal($variableName, <valor>)
Una variable global puede utilizarse tanto en la capa actual como en cualquier capa de Automatización situada por encima de ella. Esta funcionalidad es especialmente útil para compartir la misma información en varias capas de Automatización, como los puntos finales de la API de una determinada capa. Para el valor de la variable, se aplican las mismas reglas que para el comando setVariable
.
Tenga en cuenta que las variables globales son accesibles a otras capas de Automatización siempre que la capa de origen esté activa. Esta disposición le permite cambiar las variables globales activando una capa diferente con definiciones de variables globales distintas. La mejor práctica en este escenario es establecer la opción 'Desactivar capa' de la capa de Automatización en 'Manualmente' y definir las globales en el script 'En vivo'.
setGlobal($myGlobalText, "This is a text")
setGlobal($myGlobalNumber, 15.73)
setGlobal($myGlobalBoolValue, false)
concat($resultVariableName, )
Este comando de script concatena cadenas y almacena el resultado como una cadena.
// 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($resultadoNombreVariable, )
Este comando realiza cálculos matemáticos sencillos, incluyendo sumas (+), restas (-), multiplicaciones (*) y divisiones (/). Tenga en cuenta que los cálculos se realizan en el orden en que aparecen y NO siguen la regla 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
Esta sentencia if
compara dos expresiones numéricas utilizando un comparador especificado. Si la comparación es verdadera, se ejecuta(n) la(s) siguiente(s) orden(es). En caso contrario, los comandos siguientes se omiten hasta que se alcanza un else
o un endif
.
Los comparadores válidos son:
“==” | es igual a |
“!=” | no es igual a |
">" | superior a |
"<" | menos de |
">=" | mayor o igual que |
"<=" | menos o qual que |
// 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
Esta sentencia ifString
compara dos expresiones de cadena utilizando un comparador especificado. La comparación se basa en el código de caracteres ASCII de cada letra de las cadenas. Si la comparación es verdadera, se ejecutan las órdenes siguientes. En caso contrario, los comandos siguientes se omiten hasta que se alcanza un else
o un endif
.
Para conocer los comparadores válidos, consulte el comando if.
// 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 ID de capa como expresión de cadena>) - ifLayerIsOff(<API ID de capa como expresión de cadena>) [else] endif
Estas sentencias if
comprueban si una determinada capa está activa o no. Si se cumple la condición especificada (la capa está activada o desactivada), se procesan los comandos siguientes. En caso contrario, los comandos siguientes se omiten hasta que se alcanza un else
o un 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 ID de capa como expresión de cadena>) - ifLayerSetIsInactive(<API ID de capa como expresión de cadena>) [else] endif
Estas sentencias if
comprueban si un determinado Conjunto de capas está actualmente activo o no. En caso afirmativo, se procesan los comandos siguientes. En caso contrario, los comandos siguientes se omiten hasta que se alcanza un else
o un 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
Este complejo comando le permite probar cualquier parámetro de una capa que el HTTP API proporciona. Necesita especificar una capa por su ID de API, la ruta clave dentro de los datos JSON devueltos por la API HTTP, un comparador (como una cadena entre comillas, por ejemplo, "=="
), y un valor.
Los valores válidos del comparador son:
“==” | es igual a |
“!=” | no es igual a |
">" | superior a |
"<" | menos de |
">=" | mayor o igual que |
"<=" | menos o qual que |
// 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
bucle([]) [break] endloop
El comando bucle
le permite ejecutar código varias veces. Si no especifica el número de iteraciones, el bucle se ejecutará indefinidamente. El comando break
le permite salir del bucle en cualquier momento. endloop
es necesario para marcar el final del bloque de comandos que debe ejecutarse en bucle.
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()
En httpRequest()
comando dispara la URL dada. Esto ofrece mucha flexibilidad en la forma de utilizar este comando de script. En mimoLive
incluso puede desencadenar acciones en otros documentos o scripts remotos. Para más detalles sobre mimoLive
comandos de la API HTTP, consulte el HTTP API documentación para explorar todas las posibles llamadas a la API.
//activar una capa
httpRequest("http://127.0.0.1:8989/api/v1/documents/188462841/layers/BA868701-8131-49CB-8EDD-8C7E6E7CD60B/setLive")
httpRequestJSON($resultVariableName, )
Este comando lee la respuesta de la llamada HTTP como JSON y almacena los datos en la variable de resultado especificada. Después, puede acceder a los datos mediante el comando getJSONData()
.
getJSONData($resultVariableName, $jsonDataVariable, )
Este comando recupera un valor de datos específico de una estructura JSON almacenada en una variable. Debe especificar la variable que contiene los datos JSON ($jsonDataVariable
), la ruta a los datos dentro de la estructura JSON () y la variable donde debe almacenarse el resultado (
$resultVariableName
). Esto permite una extracción precisa de los datos para su posterior procesamiento o uso en su script.
// obtenga todos los datos de una capa
httpRequestJSON($myLayerData, "http://127.0.0.1:8989/api/v1/documents/188462841/layers/BA868701-8131-49CB-8EDD-8C7E6E7CD60B")
// obtenga el valor del dial de volumen
getJSONData($volumenDial, $myLayerData, "data.attributes.volume")
// Ahora, la variable $volumenDial contendrá un valor entre 0 y 1.
> Punto de ruptura del depurador
Cuando el depurador de scripts está activado y el modo de depuración está establecido en 'Continuamente', la ejecución del script se detendrá en este marcador y esperará hasta que el operador de mimoLive haga clic en el botón 'Siguiente paso'. Consulte 'Prácticas recomendadas - Depuración de scripts' para obtener más información sobre las posibilidades de depuración.
Tipos de datos
API Puntos finales
El parámetro debe ser un punto final de la API para una capa, una variante de capa, un conjunto de capas, una fuente o un destino de salida. Puede obtener estos puntos finales de la API haciendo clic con el botón derecho del ratón sobre el objeto en el documento mimoLive. Debería aparecer un menú contextual con un elemento de menú "Copiar punto final de API al portapapeles".
Esta acción copiará el punto final de la API para este objeto en el portapapeles. Si lo pega en otro lugar, tendrá un aspecto similar al siguiente:
/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
Para los comandos relacionados con la capa puede reducir el API Endpoints a la parte importante sólo eliminando el prefijo "/api/v1/documents//layers/" . Esto hará que su script sea más corto como se muestra aquí:
// 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")
Buenas prácticas
Puntos finales de la API
Cómo obtener los puntos finales de la API
- Haciendo clic con el botón derecho en la capa y seleccionando "Copiar punto final de API"
- utilizando el comando getAPIEndpoint() (consulte la documentación)
Cómo dirigirse a los puntos finales de la API
Puede utilizar el punto final de la API completo o eliminar la parte "/api/v1/documents//" para asegurarse de que su script también funciona cuando se copia en otro documento. Sin embargo, el ID del documento es importante si desea dirigirse a un punto API en un documento mimoLive diferente.
Depuración de scripts
Hay un depurador de scripts integrado en la capa de Automatización. Puede poner la capa en modo depuración activando el parámetro de capa "Depuración".
TBD.
Ideas para guiones
Publique un anuncio cada 10 minutos
En combinación con un "PIP Ventana" y una "Fuente de lista de reproducción multimedia" que contenga varios clips cortos de películas publicitarias, puede reproducir una publicidad cada 10 minutos. Asegúrese de desmarcar la opción "Non-Stop" en la fuente Media Playlist. De este modo, cada vez que se reproduzca la PIP Window se pone en directo, reproducirá un anuncio de la fuente Playlist y se apagará. Transcurridos 10 minutos, se reproducirá el siguiente anuncio.
Ejecuta un aguijón antes de cambiar a una capa determinada
Necesitas preparar un video stinger corto que tendrá un In-transition hasta que cubra toda la pantalla (por ejemplo después de 1 seg). Después de 1 segundo cambia en vivo la capa que quieres revelar. Coloca esta capa debajo de la capa que está reproduciendo el vídeo. Ahora que el vídeo stinger está cubriendo la pantalla, el cambio de la capa de abajo no se puede ver. El vídeo stinger debería continuar revelando la capa de abajo. Por favor, asegúrese de que el vídeo stinger se renderiza en códec de vídeo ProRes4444 para que lleve consigo la transparencia necesaria para la transición.
Crear un inicio de espectáculo complejo
Como puedes activar y desactivar las capas una tras otra durante un período de tiempo más largo, puedes tener varias capas de texto o anotación, una capa de ubicación que muestre gráficos o incluso tercios inferiores que llenen la pantalla para crear tu propio inicio de espectáculo animado. ¡Da rienda suelta a tu creatividad!
Activar un mando a distancia HTTP URL mediante un toque en la superficie del mando a distancia
Si necesita activar un HTTP Solicitar mediante un botón en su Superficie de control remoto puede añadir una capa de Automatización a su pila de capas y establecer la opción "Desactivar capa" de esa capa en "Automáticamente". Ahora puede poner un único comando httpRequest() en el campo de script "On Live". En su Superficie de Control Remoto añada el botón En Directo de esta capa al diseño. Una vez que pulse este botón en su Superficie de Control Remoto, el comando HTTP se realizará la solicitud.