mimoLive® - Manual del usuario

Selectores genéricos
Sólo coincidencias exactas
Buscar en el título
Buscar en el contenido
Selectores de tipo de entrada

Manual - Índice

API de preajustes del mando a distancia

Índice

Si está creando una capa personalizada, existe la posibilidad de incluir preajustes de control personalizados con su capa. Esto es útil si la capa tiene botones que controlan el comportamiento de la capa cuando está activa.

Estructura de datos

La siguiente estructura de datos es un ejemplo de salida que debe estar presente en su composición bajo la clave de salida de la estructura `tvOut_ControlRepresentations`:

{
  "tvOut_ControlRepresentations": [
    {
      "title": "Compact Cut's",
      "buttons": [
        {
          "actions": [
            {
              "layerId": "03627C25-CC8A-474F-A738-C4DEB3353FA4",
              "variantId": "F6F52194-06DE-462E-983A-8D505C533A69",
              "type": "signal",
              "signalKey": "tvGroup_Control__Cut_1_TypeSignal",
              "signalName": "Cut 1"
            }
          ],
          "liveState": {
            "layerId": "03627C25-CC8A-474F-A738-C4DEB3353FA4",
            "variantId": "F6F52194-06DE-462E-983A-8D505C533A69",
            "dynamicSourceId": "tvIn_VideoSourceAImage"
          },
          "sourcePreview": {
            "layerId": "03627C25-CC8A-474F-A738-C4DEB3353FA4",
            "variantId": "F6F52194-06DE-462E-983A-8D505C533A69",
            "dynamicSourceId": "tvIn_VideoSourceAImage"
          },
          "color": "#BBBBBB",
          "width": 1,
          "height": 1,
          "x": 0,
          "y": 0,
          "icon": "facetime-video",
          "dynamicText": {
            "template": "{{inputputValues.tvIn_VideoSourceAName}}",
            "layerId": "03627C25-CC8A-474F-A738-C4DEB3353FA4",
            "variantId": "F6F52194-06DE-462E-983A-8D505C533A69"
          }
        }
      ]
    }
  ]
}

Un preajuste tiene un "título" y una serie de "botones", pero un solo botón también está bien.

*

Las claves `layerId` y `variantId` deben rellenarse dinámicamente con los datos de cadena de las claves de entrada de composición `tvIn_LayerIdentifier` y `tvIn_RuntimeIdentifier`.

Uso de la preselección del mando a distancia API en Quartz Composer

Las capas incorporadas de mimoLive utilizan un LUA para generar dinámicamente esta estructura de datos porque Quartz Composer no soporta la generación de estructuras de datos por sí mismo. El LUA contiene una función compleja addButton() que se puede utilizar para crear la estructura de un solo botón. Usualmente puedes usar esta función y no necesitas modificarla. Por lo tanto, es bastante fácil construir nuevas configuraciones predeterminadas de control remoto para su propia capa.

Por ejemplo LUA para generar los controles remotos de la capa Cronómetro. Tenga en cuenta que puede adoptar este código con sólo cambiar las líneas 15 a 29 del código.

inLayerIdentifier = QC_STRING
inVariantIdentifier = QC_STRING
outControlRepresentations = QC_STRUCT
main = function()
  controlRepresentations = {}
  -- first representation
  controlRepresenation = {}
  -- {
    controlRepresenation["Title"] = "Stop Watch"
    buttons = {}
    -- {
      -- addButton(buttonsTable, buttonTitle, subTitle, positionX, positionY, width, height, color, icon, actionTarget, liveStateSource, previewSource)
      -- first row
      addButton(buttons, "{{outputValues.tvOut_TimeString}}", "", 0, 0, 2, 1, "#333333", "", "", "", "")
      addButton(buttons, "Live", "{\{name\}}", 2, 0, 1, 1, "#333333", "", "toggleLive", "layerVariant", "")
      -- second row
      addButton(buttons, "Start", "", 0, 1, 1, 1, "#33cc33", "play", "tvGroup_Control__Start_TypeSignal", "", "")
      addButton(buttons, "Stop", "", 1, 1, 1, 1, "#cc3333", "pause", "tvGroup_Control__Stop_TypeSignal", "", "")
      addButton(buttons, "Reset", "", 2, 1, 1, 1, "#cccc33", "stop", "tvGroup_Control__Reset_TypeSignal", "", "")
    -- }
    controlRepresenation["buttons"] = buttons
  -- }
  table.insert(controlRepresentations , controlRepresenation)
  outControlRepresentations = controlRepresentations
end
function addButton(buttonsTable, buttonTitle, buttonSubTitle, positionX, positionY, width, height, color, icon, actionTarget, liveStateSource, previewSource)
  local button = {}
  -- {
  if #buttonTitle > 0 then
    if string.find(buttonTitle, "{{") then
      -- dynamic titel
      local dynamicText = {}
      -- {
        dynamicText["layerId"] = inLayerIdentifier
        dynamicText["variantId"] = inVariantIdentifier
        dynamicText["template"] = buttonTitle
      -- }
      button["dynamicText"] = dynamicText
    else
      -- static title
      button["text"] = buttonTitle
    end -- if dynamic
  end -- if buttonTitle
  if #buttonSubTitle > 0 then
    if string.find(buttonSubTitle, "{{") then
      -- dynamic titel
      local dynamicSubText = {}
      -- {
        dynamicSubText["layerId"] = inLayerIdentifier
        dynamicSubText["variantId"] = inVariantIdentifier
        dynamicSubText["template"] = buttonSubTitle
      -- }
      button["dynamicSubText"] = dynamicSubText
    else
      -- static title
      button["subtext"] = buttonSubTitle
    end -- if dynamic
  end -- if buttonSubTitle
  button["x"] = positionX
  button["y"] = positionY
  button["width"] = width
  button["height"] = height
  if #color > 0 then
    button["color"] = color
  end -- if
  if #actionTarget > 0 then
    local actions = {}
    -- {
      local action = {}
      -- {
        action["layerId"] = inLayerIdentifier
        action["variantId"] = inVariantIdentifier
        if string.ends(actionTarget, "_TypeSignal") then
          action["type"] = "signal"
          action["signalKey"] = actionTarget
          action["signalName"] = buttonTitle
        elseif actionTarget == "toggleLive" then
          action["type"] = "toggleLive"
        else
          action["type"] = "toggleSwitch"
          action["toggleSwitchKey"] = actionTarget
          action["toggleSwitchName"] = buttonTitle
        end -- if
      -- }
      table.insert(actions , action)
    -- }
    button["actions"] = actions
  end -- if actionTarget
  if #liveStateSource > 0 then
    local liveState = {}
    -- {
      liveState["layerId"] = inLayerIdentifier
      liveState["variantId"] = inVariantIdentifier
      if string.starts(liveStateSource,"tvIn_VideoSource") then
        -- get the live state from a dynamic video source
        liveState["dynamicSourceId"] = liveStateSource
      elseif liveStateSource == "layerVariant" then
        -- nor more information needed
      else
        liveState["propertyPath"] = liveStateSource            end -- if
    -- }
    button["liveState"] = liveState
  end -- if liveState Source
  if #previewSource > 0 then
    local sourcePreview = {}
    -- {
      sourcePreview["layerId"] = inLayerIdentifier
      sourcePreview["variantId"] = inVariantIdentifier
      sourcePreview["dynamicSourceId"] = previewSource
    -- }
    button["sourcePreview"] = sourcePreview
  end -- if
  if #icon > 0 then
    -- See bottom of documentation page for list of avaiable icon names
    button["icon"] = icon
  end -- if
  -- }
  table.insert(buttonsTable, button)
end -- func
function string.starts(String,Start)
   return string.sub(String,1,string.len(Start))==Start
end
function string.ends(String,End)
   return End=='' or string.sub(String,-string.len(End))==End
end

Button Posicionamiento

Cuando se utilizan varios botones, su disposición debe controlarse manualmente. Esto significa que los botones se colocan en la cuadrícula mediante los atributos "x" e "y", que, al igual que los atributos "anchura" y "altura", se indican en múltiplos de celdas de la cuadrícula. Las posiciones son relativas a la celda superior izquierda de la cuadrícula a la que se ha arrastrado el grupo de botones.

Button Acciones

Buttons puede tener varias acciones, una sola acción o ninguna. Hay varias combinaciones válidas de objetivos de acción y tipos de acción.
Tenga en cuenta que las acciones "textInput" y "numericInput" deben ir por separado, ya que no se garantiza una experiencia de usuario coherente en el mando a distancia.

Objetivos de la acción

Los objetivos de acción son elementos dentro del documento mimoLive. Se abordan de forma jerárquica:

El "ID del documento" se dibuja siempre en tiempo de ejecución, por lo que no tiene que estar presente en el preajuste.

  • Si no se indican ni "layerId" ni "variantId", la acción se activará en el propio documento.
  • Si se indica "layerId", la acción se activará en la capa especificada.
  • Si "layerId" y "variantId", la acción se activará en la variante especificada. Sólo en este caso, se puede especificar "toggleSwitchKey" o "signalKey" adicionales (véase Tipos de acción más abajo).

Tipos de acción

Tipo de acciónExplicaciónAtributos adicionalesObjetivos válidos
toggleLiveAlternar el estado en directoningunoDocumento (Iniciar/Parar espectáculo), Capa, Variante
setLiveEstablecer el estado "live" a "live"ningunoDocumento (Start Show), Capa, Variante
setOffPoner el estado en directo en "off"ningunoDocumento (Stop Show), Capa, Variante
señalActivar una señalsignalKey, signalName (recomendado)Variante
toggleSwitchConmutar un valor de entrada booleanotoggleSwitchKey, toggleSwitchName (recomendado)Variante
textInputAbre un campo de entrada de texto que, al enviarse, actualiza el valor de inputKey.inputKey, inputName (recomendado)Capa, Variante, Fuente
numericInputDeslizador que controla un valor numérico en inputKey.inputKey, inputDescription (objeto con valores mínimo y máximo), inputName (recomendado)Capa, Variante, Fuente
*

Los tipos de acción "textInput" y "numericInput" están disponibles desde mimoLive 5.2.

Button Estado vivo

El objeto "liveState" permite configurar el estado de la luz de recuento del botón, que puede estar encendido (marca roja), en transición (marca amarilla) o apagado (sin marca).

Fuentes estatales vivas

De forma similar a los objetivos de acción de los botones, el estado vivo puede obtenerse de múltiples fuentes:

  • El "ID del documento" se dibuja siempre en tiempo de ejecución, por lo que no tiene que estar presente en el preajuste.
  • Si no se indican ni "layerId" ni "variantId", se utilizará el estado en directo del documento (se ha iniciado la presentación o no).
  • Si se indica "layerId", se utiliza el estado activo de la capa.
  • Si se indican "layerId" y "variantId", se utiliza el estado activo de la variante.
    - Sólo en este caso, se puede especificar "propertyPath" adicional para indicar que se debe utilizar una propiedad booleana en los valores de entrada o salida de la variante.
    - Otra posibilidad (¡mutuamente excluyente con propertyPath!) es especificar una propiedad "dynamicSourceId" que redirija la búsqueda de estado en directo a una fuente (obtenida por ID), que respete los cambios dinámicos de la fuente seleccionada (por ejemplo, en el conmutador de vídeo). El valor de "dynamicSourceId" se busca en los valores de entrada de la variante.

*Indique la ruta completa a la propiedad, empezando por la variante como raíz, por ejemplo "inputValues.some_Boolean_Property" o "outputValues.other_Property".

  • Si se indica "sourceId", se utiliza el estado activo de la fuente.

Button Texto

Los botones de acción pueden mostrar líneas de texto primarias y secundarias, ambas pueden ser de naturaleza estática o dinámica.

Texto principal

Este texto será el indicador principal de lo que el botón hará por el usuario. Si el botón preestablecido contiene una propiedad de texto, es un texto estático que se mostrará tal cual.

Alternativamente, se puede dar un dynamicText que permite la inclusión de propiedades de capa o variante mimoLive utilizando una sencilla sintaxis de plantilla. En la cadena de plantilla, se pueden combinar caracteres regulares con rutas de propiedades encerradas entre llaves:

"template": "{\{propertyPath\}}"

Las rutas de las propiedades se evalúan en relación con el objeto que se resuelve utilizando "layerId", "variantId", "sourceId" y "filterId". La resolución del objetivo sigue estas reglas:

  • El "ID del documento" se dibuja siempre en tiempo de ejecución, por lo que no tiene que estar presente en el preajuste.
  • Si no se indican ni "layerId" ni "variantId", las rutas de las propiedades se evalúan en relación con el documento
  • Si se indica "layerId" (y opcionalmente "variantId"), las rutas de las propiedades se evalúan en relación con una capa/variante.
  • Se puede acceder a la capa padre de una variante iniciando una ruta con "layer", como "aslayer.name".
*

El primer segmento de ruta de los valores de entrada y salida debe ir en camelCased ("inputValues.tvIn...") y no en kebab-cased ("input-values.tvIn...") como en los documentos de la API.

  • El texto estático siempre tendrá prioridad sobre el texto dinámico, porque esto permite a los usuarios sobrescribir el texto dinámico con algún texto personalizado que pueda ser más útil en su situación.

Texto secundario

Para dar al usuario más información sobre un botón, como el nombre de su capa padre, se le puede dar un texto secundario utilizando las propiedades "subtext" o "dynamicSubText".

La sintaxis de las plantillas y la resolución de objetos siguen exactamente las mismas reglas que el texto principal.

Button Tamaño de texto e icono

El texto y los iconos de los botones pueden variar de tamaño en función del contexto. Con la opción "fontScale" puede especificar una escala relativa a un tamaño por defecto calculado para el tamaño de pantalla actual. "1" será el tamaño por defecto. Menos de 1 (por ejemplo, 0,8) reducirá el tamaño de la fuente y más de 1 (por ejemplo, 1,5) lo aumentará.

Button Avance

Los botones de acción pueden mostrar una imagen de vista previa de la fuente que controlan o de cualquier otra fuente disponible en el documento.

Dependiendo de si la fuente es estática (sólo imágenes que fueron arrastradas a mimoLive), un PNG de la fuente que sí admite un canal alfa. Para cualquier otra fuente, se carga una JPEG La representación de la fuente se actualiza regularmente. La frecuencia de actualización prevista para las fuentes dinámicas es de 5 fotogramas por segundo, pero esta frecuencia se reduce cuando la velocidad de conexión a la red resulta insuficiente para la carga repetida de fotogramas de previsualización.

Actualmente no se admite mostrar la salida del programa del documento en un botón de acción. Las imágenes por defecto de las capas, aunque no son visibles en la lista de fuentes, están disponibles para su previsualización.

Para especificar una vista previa de la fuente, se utiliza un mecanismo de resolución de objetos:

  • El "ID del documento" se dibuja siempre en tiempo de ejecución, por lo que no tiene que estar presente en el preajuste.
  • Si se indica "sourceId", se utilizará la fuente con ese ID para la previsualización.
  • Si se indican "layerId", "variantId" y "dynamicSourceId", el ID de la fuente se buscará en la variante de la capa especificada bajo la clave de "dynamicSourceId". Esto se puede utilizar para hacer referencia a fuentes como la fuente A-G del conmutador de vídeo, incluso cuando se cambian en el documento.

Button Color

Utilizando el atributo "color", los botones pueden colorearse con cualquier código de color que sea representable en HTML (por ejemplo, "#f80", "#ff0088", "naranja" o "rgb(255, 66, 88)").

Button Icono

Los Buttons pueden mostrar un icono para indicar su funcionalidad. Para ver una lista de todos los iconos disponibles, abre http://localhost:8989/icons/demo.html mientras mimoLive está en marcha y los mandos a distancia están activados.
Utiliza el nombre normal del icono. Por ejemplo, "hacia atrás" o "flecha abajo".

Su opinión

¿Cómo calificaría su experiencia con esta función de mimoLive?

Última actualización de las páginas del manual

Boletín electrónico

Español

Únase a la demostración en directo 24/7 de Zoom

*requerido