用mimoLive的自动化层精简你的生产
mimoLive 自动化层最初是作为概念验证而开发的,但后来证明对用户来说是非常有用的工具。该层可用于按照特定顺序或在预定时间自动开启和关闭层、将信息从一个层传输到另一个层、启动和停止层、将信息从一个层传输到另一个层、将信息从一个层传输到另一个层、将信息从一个层传输到另一个层、将信息从一个层传输到另一个层。 输出目的地等等!
它对于创建具有多个层和输入的复杂制作特别有帮助,因为它消除了手动切换和计时的需要。有了这一层,用户就可以专注于创建引人入胜的内容,而软件则可以处理制作的计时和排序。现在,在该层的第 2 版中,我们扩展了命令,将 mimoLive 的自动化提升到了一个全新的水平。
例子:自动化层
mimoLive 中的自动化脚本无法实时运行
请注意,由于视频渲染引擎调用的HTTP请求的异步性,mimoLive中自动化脚本的时间可能不准确。这些脚本依赖于对API的HTTP请求,这些请求的长度无法准确确定,导致潜在的时间差异。在你的生产工作流程中使用自动化脚本时,请牢记这一点。
先决条件
为了使这一层发挥作用,你需要打开 HTTP 在mimoLive中的服务器,以启用远程控制 API.转到 姆雷特-沃尔夫斯堡 -> 首选项 -> 远程控制:选中 "允许远程控制访问 "选项。(目前 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)
层关闭(<API 层 ID 字符串表达式>)
使用该命令可以关闭一个图层或一个图层变量。
// 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)
层集调用(<API 层将 ID 设置为字符串表达式>)
这条命令可以用来触发对某一领域的召回。 层套.
// 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 输出目的地 ID 作为字符串表达式>)
使用这条命令可以打开一个输出目的地。
// 根据输出目的地的 id 启动输出目的地
outputOn("1953186E-4176-4849-A8ED-5B47EE1627BD")
// 通过长 API 端点 URL 启动输出目的地
outputOn("/api/v1/documents/1677022440/output-destinations/1953186E-4176-4849-A8ED-5B47EE1627BD")
// 使用定义的变量启动输出目的地
setVariable($myOutputDestinationtID, "1953186E-4176-4849-A8ED-5B47EE1627BD")
outputOn($myOutputDestinationtID)
outputOff(<API 输出目的地 ID 作为字符串表达式>)
使用这条命令可以关闭一个输出目的地。
// 根据输出目的地的 id 停止输出目的地
outputOff("1953186E-4176-4849-A8ED-5B47EE1627BD")
// 通过长 API 端点 URL 停止输出目的地
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,,)
此指令会根据显示名称取得特定 mimoLive 物件的 API 端点。请注意,显示名称很容易被 mimoLive 操作员在 mimoLive 用户界面上更改,如果找不到特定对象,就会破坏自动化脚本。另一方面,此指令可用于以编程方式查找 API 端点,而无需在脚本中硬编码 API 端点。
// 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 小时内的 HH:MM 或 HH:MM:SS。
// 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($myText, "This is a text")
setVariable($myNumber, 15.73)
setVariable($myBoolValue, false)
setGlobal($variableName, <值>)
全局变量既可在当前层中使用,也可在其上的任何自动化层中使用。此功能对于在多个 Automation 层共享相同信息(如某层的 API 端点)尤其有用。对于变量的值,适用的规则与 设置变量
指挥。
请注意,只要初始层处于激活状态,其他自动化层也可访问全局变量。这种安排允许您通过激活具有不同全局变量定义的不同层来切换全局变量。这种情况下的最佳做法是将自动化层的 "关闭层切换 "选项设置为 "手动",并在 "启用 "脚本中定义全局变量。
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
这 如果
语句使用指定的比较器比较两个数字表达式。如果比较结果为真,则执行后续命令。否则,将跳过后续命令,直到出现 不然
或 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 字符编码。如果比较结果为真,则执行以下命令。否则,将跳过后续命令,直到出现 不然
或 endif
达到。
有关有效比较器,请参阅 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 字符串表达式>) - ifLayerIsOff(<API 层 ID 字符串表达式>) [else] endif
这些 如果
语句测试某个图层当前是否处于运行状态。如果满足指定条件(层打开或关闭),则处理后续命令。否则,将跳过后续命令,直到出现 不然
或 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 字符串表达式>) - ifLayerSetIsInactive(<API 层 ID 字符串表达式>) [else] endif
这些 如果
语句测试某一 层套 当前是否处于运行状态。如果是,则处理后续命令。否则,将跳过后续命令,直到出现 不然
或 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(, , , )[否则] endif
通过这条复杂的命令,您可以测试层的任何参数。 HTTP API 提供。您需要通过 API ID、HTTP API 返回的 JSON 数据中的关键路径、比较器(带引号的字符串,如" ")来指定层。=="
) 和一个值。
有效的比较器值是:
“==” | 等同于 |
“!=” | 不等于 |
">" | 大于 |
"<" | 不到 |
">=" | 大于或等于 |
"<=" | 低于或等于 |
// 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
ǞǞǞ 环
命令允许多次执行代码。如果不指定迭代次数,循环将无限期运行。迭代次数 断裂
命令可以随时退出循环。 结束循环
标记应循环的命令块的结束。
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。这就为如何使用该脚本命令提供了很大的灵活性。在 姆雷特-沃尔夫斯堡
它甚至可以触发其他文档或远程脚本中的操作。有关 姆雷特-沃尔夫斯堡
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, )
该命令以 JSON 格式读取 HTTP 调用的响应,并将数据存储在指定的结果变量中。之后,您可以通过 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 之间。
> 调试器断点
当脚本调试器启用且调试模式设置为 "持续 "时,脚本的执行将在此标记处暂停,直到 mimoLive 操作员点击 "下一步 "按钮。有关调试可能性的更多信息,请参阅 "最佳实践 - 调试脚本"。
数据类型
API 端点
参数应该是一个图层、一个图层变量、一个图层集、一个源或一个输出目的地的 API 端点。您可以通过右键单击 mimoLive 文档中的对象来获取这些 API 端点。右键单击 mimoLive 文档中的对象,会出现一个上下文菜单,其中有一个 "将 API 端点复制到剪贴板 "菜单项。
此操作会将此对象的 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//layer/",只将端点指向重要部分。这将使您的脚本更短,如图所示:
// 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 端点"。
- 使用 getAPIEndpoint() 命令(请参阅文档)
寻址应用程序接口端点
您可以使用完整的 API 端点或移除 "/api/v1/documents//" 部分,以确保您的脚本复制到其他文档时也能正常工作。然而,如果您想在不同的 mimoLive 文档中处理 API 点,文档 ID 是很重要的。
调试脚本
自动化层内置了脚本调试器。您可以通过将层参数 "调试 "设置为开启,将层切换到调试模式。
待定。
脚本创意
每10分钟运行一个广告
与""结合起来。PIP 窗口 "层有一个 "媒体播放列表源",其中包含多个简短的广告影片剪辑,你可以每10分钟播放一个广告。请确保取消勾选媒体播放列表源中的 "不间断 "选项。这样,每次 PIP 窗口被设置为实时,它将从播放列表源中播放一个广告,并自行关闭。10分钟后,下一个广告将被播放。
在切换到某一层之前运行一个刺针
你需要准备一个简短的刺痛视频,它将有一个内转换,直到它覆盖所有的屏幕(例如1秒后)。1秒后,你要切换到你想显示的层。把这个层放在播放激振视频的层下面。现在激振视频已经覆盖了屏幕,下面的层的切换就看不到了。激振视频应该继续播放,并显示下面的层。请确保激振视频是以ProRes4444视频编解码器渲染的,这样它就具有了过渡所需的透明度。
创建一个复杂的节目开场
因为你可以在较长的时间内一个接一个地开关图层,你可以有多个文本或注释图层,显示图形的Placer图层,甚至是充满屏幕的下三层,来制作你自己的动画节目开场。发挥创意吧!
触发一个远程 HTTP URL 通过轻击遥控器表面来实现。
如果你需要触发一个 HTTP 通过在你的网站上的一个按钮要求 遥控表面 你可以在你的图层堆栈中添加一个自动化图层,并将该图层的 "关闭图层 "选项设置为 "自动"。现在你可以在 "On Live "脚本字段中输入一个httpRequest()命令。在你的远程控制表面上,把这个图层的Live按钮添加到布局中。一旦你在你的远程控制表面上按下这个按钮,那么 HTTP 请求将被执行。