On air

La vista On air es la lista en runtime de cada Live stream actualmente en emisión. Cada fila conecta un Channel, un Encoding (o Encoding group) y un Destination (o Destination group). Al seleccionar una fila se expande un panel de runtime con cinco pestañas — Destinations, Preview, Logo, Blackout, Source switch — que dirigen la superficie de control en tiempo de ejecución del broadcast sin detenerlo.
Para integradores, la misma superficie de runtime es accesible mediante ocho endpoints POST /c21apiv2/livestreams/{id}/runtimeOptions/*, incluyendo la inyección de metadatos para introducir cues SCTE-35 y etiquetas ID3 en un broadcast en emisión. Los ocho endpoints, los tres que son solo-API y la semántica de respuesta común se documentan al final de esta página.
Acceso
- Ruta:
/liveStreams/onAir. - Rol requerido: cualquier usuario autenticado (Operator o System Administrator).
Cómo se refresca la lista
La lista sondea el servidor cada 5 segundos. La cadencia está fijada por código — no hay un ajuste por usuario ni un botón de refresco manual. Las filas se filtran en servidor para mostrar:
- todo Live stream cuyo
LiveStream.statussea1(en emisión), más - todo broadcast C21 Live Cloud que aún esté aprovisionando su encoder en la nube (la fila aparece con el indicador de cloud hasta que el encoder esté disponible).
Un Live stream arrancado por el Scheduler muestra un icono de calendario junto al nombre del encoder en su fila.
Búsqueda
La barra superior expone un campo de búsqueda libre — escribe una subcadena y las filas se actualizan tras una pausa breve. La única clave de búsqueda es name — no hay chips de filtrado por estado, encoder, destino o tag.
Columnas de la lista
Seis columnas, en este orden:
| Columna | Cabecera | Notas |
|---|---|---|
| 1 | (indicador de estado, sin etiqueta) | Una franja vertical coloreada en el borde izquierdo de la fila refleja la salud global del broadcast. |
| 2 | Live stream | Nombre del Live stream y el encoder/slot en el que corre. |
| 3 | Uptime | Tiempo transcurrido desde que el encoder reportó la emisión como activa. |
| 4 | Source | Nombre del Channel enlazado, con una flecha cuyo color refleja el estado de la entrada. |
| 5 | Encoding | Nombre del Encoding (o Encoding group) enlazado; un indicador por rendition. |
| 6 | Destination | El Destination (o Destination group) enlazado; salud por destino. |
Cuando un destino tiene ambas rutas primary y backup configuradas y el encoder reporta un problema upstream en una ruta que está activa, el tooltip de destino de la fila antepone el mensaje upstream con "Primary: " o "Backup: ".
Estado vacío
Cuando no hay Live streams en emisión y ningún broadcast cloud aprovisionándose, la página muestra:
No live streams running Start a live stream from the Live streams tab to see it here.
Selección de fila
Pulsa una fila para seleccionarla. Al seleccionar una fila se expande su panel de runtime debajo. Una segunda pulsación sobre la misma fila colapsa el panel. Solo una fila a la vez puede tener el panel desplegado.
Detener un Live stream
Desde On air solo se detienen Live streams en marcha; el arranque vive en la lista de Live streams.
La acción Stop muestra un diálogo distinto según si el broadcast se arrancó a mano o por el Scheduler.
Live stream normal.
Do you want to stop this Live stream?
Al confirmar, la UI desmonta el pipeline de preview (si estaba abierto) y detiene el broadcast.
Live stream programado.
Do you want to stop this Scheduled Live stream? The associated Schedule will be deleted.
Para un broadcast programado, confirmar borra además el Schedule activo — el broadcast lo mantenía el Scheduler, así que al eliminar el Schedule el broadcast se detiene como efecto colateral. La entrada del Scheduler desaparece tras esto; para recuperar la misma recurrencia, recréala desde el Scheduler.
Equivalente de la API pública. POST /c21apiv2/livestreams/{id}/stop (operationId stopLivestream). El endpoint público detiene el broadcast pero no toca ningún Schedule. Para detener un broadcast programado y eliminar su Schedule en un solo paso, replica el flujo de la UI: lista los Schedules del Live stream, borra el activo, y el broadcast se detiene como efecto colateral.
Panel de runtime por fila
Cuando se selecciona una fila, debajo se despliega un panel con cinco pestañas. El orden de las pestañas coincide con el orden de los iconos del cluster de runtime de la fila:
| Pestaña | Icono | Backed by |
|---|---|---|
| 1. Destinations | publishing.svg | runtimeTogglePublishings |
| 2. Preview | monitor-eye.svg | Preview embebida solo para operador (no expuesta en la API pública) |
| 3. Logo | logo.svg | runtimeApplyLogo |
| 4. Blackout | blackout.svg | runtimeApplyBlackout |
| 5. Source switch | export.svg | runtimeApplySourceSwitch |
Cada pestaña se describe en su propio apartado a continuación.
Destinations — alternar primary / backup por destino
Alternar por Destination las rutas primary y backup en el broadcast en emisión.
- Endpoint:
POST /c21apiv2/livestreams/{id}/runtimeOptions/publishings— operationIdruntimeTogglePublishings. - Cuerpo:
{ "toggles": [{ "entry_point_id": <id>, "primary": <bool>, "backup": <bool> }, …] }. - División de capacidad. Un Destination con backup URL configurada (típicamente RTMP, SRT, FMS, HLS, IPTV y STREAM) tiene flags
primaryybackupindependientes — ambos pueden estar a true a la vez. Un Destination de canal único cuya backup URL está vacía (Record, SDIOUT, STREAM sin backup) usaprimarycomo on/off y aceptabackupsolo por simetría. - Pertenencia en runtime. Los Destinations añadidos al Destination group enlazado mientras el broadcast emite aparecen aquí automáticamente — el panel se refresca cada pocos segundos — entrando apagados. Activa uno para engancharlo en directo, sin reinicio. Ver Editar un grupo en uso.
- Restricción. Solo el estado on/off es mutable mientras el broadcast emite. Para cambiar las renditions que emite un Destination o las pistas de audio que lleva, detén el Live stream con
POST /c21apiv2/livestreams/{id}/stop, edítalo conPUT /c21apiv2/livestreams/{id}y arráncalo de nuevo.
Ver también: Activar / desactivar un Destination en mitad de la emisión.
Preview — visor embebido para operador
La pestaña Preview abre un visor embebido dentro del panel de runtime. El renderer lo arranca la UI y se desmonta cuando la pestaña se cierra o la fila se colapsa.
No forma parte de la API pública. El endpoint que sirve la preview se mantiene deliberadamente fuera del OpenAPI público — el contrato está reservado al visor en producto, donde la UI gestiona el ciclo de vida del renderer. Los integradores que necesiten una preview externa de un broadcast en emisión deben añadir un Destination real (HLS, DASH o uno de los destinos de streaming) sobre el Live stream y leerlo desde la URL publicada.
Logo — aplicar o quitar la superposición de logo
Aplicar o quitar un logo overlay en el broadcast en emisión.
- Endpoint:
POST /c21apiv2/livestreams/{id}/runtimeOptions/logo— operationIdruntimeApplyLogo. - Cuerpo:
{ "logo": { "filename": "<filename de asset>", "position": "<LogoPosition>" } }. - Valores de posición. Enum canónico:
Center,Left,Right,Top,Bottom,Top-Left,Top-Right,Bottom-Left,Bottom-Right. El entero bitmask legacy se sigue aceptando en entrada por compatibilidad con la UI Vue; las respuestas usan la cadena canónica. - Limpiar el logo. Envía
filenamevacío y conserva laposition. La posición se preserva por si más tarde se quiere volver a aplicar el logo. - Respuesta. Envelope estándar con
data: null— las operaciones de runtime no devuelven el estado aplicado. Para confirmar el logo aplicado, llama aGET /c21apiv2/livestreams/{id}e inspecciona la propiedad Logo del Live stream.
La pestaña Logo usa el catálogo de Logos como fuente de filenames.
Ver también: Aplicar un logo a un Live stream en emisión.
Blackout — alternar entre directo, frame negro y fichero
Sustituye la salida en directo por un frame negro o un fichero estático, o vuelve al input en directo. El blackout puede opcionalmente preservar el audio en directo mientras solo se sustituye el vídeo — útil para broadcasts de radio-como-vídeo donde la pista visual cambia a lo largo del día pero el audio es siempre el input en directo (consulta Emitir radio como vídeo).
- Endpoint:
POST /c21apiv2/livestreams/{id}/runtimeOptions/blackout— operationIdruntimeApplyBlackout. - Cuerpo:
{ "mode": "Live" | "BlackFrame" | "File", "file"?: "<filename>", "keep_input_audio"?: <bool> }. Live— vuelve al input en directo.BlackFrame— sustituye la salida por un frame negro.File— sustituye la salida por el fichero de medios referenciado enfile;filees obligatorio en este modo.keep_input_audio— flag opcional, aplicable en cualquier modo distinto deLive. Cuando estrue, el slate se genera vídeo-only y el audio en directo del Channel se reenvía sin tocar. Cuando se omite o esfalse, el slate lleva vídeo y audio (comportamiento legacy). La idempotencia tiene en cuenta este flag — cambiar de(BlackFrame, false)a(BlackFrame, true)es una transición real, no un skip.- El alias aceptado-pero-obsoleto
Black Frame(con espacio) se preserva en escritura por compatibilidad. Las integraciones nuevas usanBlackFrame. - Código de error. Omitir
fileen modoFile, incluir un separador de ruta o apuntar a un fichero que el encoder no puede leer devuelveAPIf517. - Respuesta.
{ mode, file, keep_input_audio, applied_at, changed, warning? }.changed: falsesignifica que el broadcast ya estaba en el estado pedido (skip idempotente).warningaparece solo cuando el encoder no confirmó a tiempo; el estado queda persistido y el encoder reconcilia por sí mismo.
Compatibilidad. La UI deshabilita la pestaña Blackout con un mensaje de "no soportado" cuando el broadcast en emisión no puede aceptar un blackout. Razones que se exponen hoy:
| Código | Significado |
|---|---|
invalid_codec | El video codec del Encoding enlazado no es H.264 ni HEVC. El relay de blackout solo soporta esos dos codecs. |
hevc_above_1080p | El Encoding es HEVC por encima de 1080p. El relay corrompe el stream en esa combinación. |
hevc_hdr | El Encoding es HEVC con HDR activo. |
hevc_hdr_above_1080p | El Encoding es HEVC con HDR por encima de 1080p. |
Ver también: Hacer blackout o sustituir el programa de un Live stream.
Source switch — cambiar la entrada de un broadcast en emisión
Cambia el Channel de entrada del broadcast en emisión sin detener los Destinations.
- Endpoint:
POST /c21apiv2/livestreams/{id}/runtimeOptions/sourceSwitch— operationIdruntimeApplySourceSwitch. - Cuerpo:
{ "channelId": <id entero del Channel> }. - Respuesta.
{ channelId, applied_at, changed, warning? }.changed: falsesignifica que el broadcast ya apuntaba a ese Channel.warningaparece solo cuando el encoder no confirmó a tiempo; el nuevo Channel queda persistido en el Live stream en emisión y el encoder reconcilia por sí mismo.
Reglas de elegibilidad. El backend aplica todas las reglas con HTTP 422. La UI las refleja para deshabilitar la pestaña cuando un cambio no es posible.
- El Live stream está en emisión.
LiveStream.statusdebe ser1(Live). Un broadcast detenido no se puede cambiar de fuente online — edita el Channel enlazado en la configuración del Live stream y arráncalo de nuevo. - El Channel destino es alcanzable desde el encoder que corre el broadcast. Un Channel anclado a otro Device falla con
APIf526. Los valores virtuales deChannel.type—SRT,Stream,RTMP-Push,SRT Cloud,UDP-R Cloud,NDIyYoutube Live— no tienen anclaje a encoder y son alcanzables desde cualquier encoder. - El Channel destino tiene el mismo tipo de Channel que la fuente actual. Los cambios cruzando tipos (SRT → Youtube Live, Stream → NDI, …) no se soportan online y fallan con
APIf527. Para cambiar de tipo, detén el broadcast, edita el Channel enlazado y arráncalo de nuevo. - El tipo de la fuente actual es uno de los soportados online. Valores soportados de
Channel.typecomo fuente actual:SRT,Stream,RTMP-Push,SRT Cloud,UDP-R Cloud,NDI,Youtube Live. No soportados:SDI,AES/EBU,File— un intento de cambio mientras uno de estos es la fuente en directo falla conAPIf528.
La UI agrupa las tres variantes cloud-push (RTMP-Push, SRT Cloud, UDP-R Cloud) bajo la etiqueta umbrella Stream – C21 Live Cloud en el picker de Channel type; las comprobaciones de elegibilidad anteriores resuelven contra los valores reales del enum. Consulta Sources para el enum completo Channel.type.
Idempotencia. Hacer POST con el mismo channelId que ya está en directo devuelve 200 con changed: false y no genera tráfico al encoder.
Sin efecto sobre la fuente configurada. El switch solo escribe el espejo runtime de la fuente. Un stop y start posterior vuelve a la fuente configurada en el Live stream — para mantener el nuevo Channel tras un reinicio, edita también el Channel enlazado del Live stream.
Ver también: Cambiar la fuente de un Live stream en emisión.
Superficie API — todos los endpoints de runtime en una página
Ocho endpoints POST viven bajo /c21apiv2/livestreams/{livestreamId}/… y cubren tanto las opciones a nivel configuración (persistidas en el Live stream) como las operaciones solo-runtime que controlan un broadcast en emisión. La tabla siguiente las agrupa, da el operationId canónico y marca cuáles expone la UI — tres son solo-API y no tienen un caller UI de primera clase hoy.
| Sufijo de ruta | operationId | UI Interface | Qué hace |
|---|---|---|---|
/options (PUT o POST) | updateLivestreamOptions / updateLivestreamOptionsPost | Indirecta — persistida desde los flujos de configuración, no desde On air | Persiste la unión logo, overlay y scte en la configuración del Live stream. Acepta Idempotency-Key. Regla cruzada: scte.cuepoints: true requiere scte.blackout no vacío (APIF519); un cuerpo vacío devuelve APIf001. |
/runtimeOptions/logo | runtimeApplyLogo | Pestaña Logo | Aplica o quita el logo overlay en un broadcast en emisión. |
/runtimeOptions/text | setLivestreamText | Solo API | Aplica o actualiza la superposición de texto/crawl en un broadcast en emisión. Soporta tokens de formato de fecha %d %m %Y %H %M %S %C, font, size, color, offsets x/y absolutos y date_offset. |
/runtimeOptions/blackout | runtimeApplyBlackout | Pestaña Blackout | Alterna entre Live, BlackFrame o File. |
/runtimeOptions/sourceSwitch | runtimeApplySourceSwitch | Pestaña Source switch | Cambia el Channel de entrada en un broadcast en emisión. |
/runtimeOptions/metadata | runtimePushMetadata | Solo API | Inyecta metadatos, cues SCTE-35 y tags ID3 en un broadcast en emisión. Ver el apartado dedicado. |
/runtimeOptions/ad-values | runtimeSetAdValues | Solo API | Configura duraciones de ad-pods en runtime: default_ad_duration, max_ad_duration, next_ad_duration (todos en segundos, todos opcionales — los campos omitidos mantienen su valor previo). |
/runtimeOptions/publishings | runtimeTogglePublishings | Pestaña Destinations | Alterna el estado primary / backup por Destination en el broadcast en emisión. |
Para la referencia API completa de cada endpoint consulta API → Live streams reference. Para la configuración persistida de logo, overlay y scte en tiempo de definición, consulta Live stream options.
Autenticación y roles
Cada endpoint de runtime requiere una sesión autenticada. La cabecera es el bearer estándar:
Authorization: Bearer <YOUR_API_TOKEN>
Los dos roles de producto que pueden mutar Live streams son System Administrator y Operator — ambos pueden llamar a todos los endpoints de runtime listados arriba. No hay scopes por endpoint más allá del gate de rol. Para el modelo de roles y cómo emitir tokens, consulta Autenticación.
Semántica de respuesta (compartida)
Dos endpoints — runtimeApplyBlackout y runtimeApplySourceSwitch — devuelven un envelope con dos campos que los integradores deben conocer:
changed—falsecuando el estado pedido ya coincidía con el persistido. La llamada es un skip idempotente y no se genera tráfico al encoder.warning— aparece solo cuando el encoder no confirmó a tiempo. El nuevo estado queda persistido en el Live stream y el encoder reconcilia por sí mismo; trata la respuesta como un éxito soft.
El resto de endpoints de runtime devuelven el envelope estándar con data: null (o, para runtimeTogglePublishings, un pequeño bloque de confirmación listando los entry points actualizados).
Inyección de metadatos — runtimePushMetadata
Inyecta un único evento de metadatos en un broadcast en emisión. El handler reenvía la carga al pipeline de metadatos del encoder y devuelve el envelope estándar con data: [] — la llamada es fire-and-forget y la carga inyectada no se devuelve.
- Endpoint:
POST /c21apiv2/livestreams/{id}/runtimeOptions/metadata. - Cuerpo:
{
"type": "<uno de los ocho valores de type>",
"metadata": { "name": "<string>", "value": "<string>" }
}
- Valores de
type(exactamente ocho, sensibles a mayúsculas):
| Valor | Usado para |
|---|---|
Metadata | Metadatos genéricos name/value. metadata lleva la carga. |
CuePoint | Cue point genérico. metadata lleva la carga. |
DateRange | Marcador de rango temporal (familia HLS EXT-X-DATERANGE). |
ID3Tag | Tag ID3 emitido in-band en HLS. |
CueIn | Cue-in genérico. metadata es opcional. |
CueOut | Cue-out genérico. metadata es opcional. |
ScteIn | Splice-in SCTE-35. metadata es opcional. El servidor normaliza el valor (p.ej. ScteIn → scte-in). |
ScteOut | Splice-out SCTE-35. metadata es opcional. Misma normalización en servidor que ScteIn. |
- Objeto
metadata. Se serializa comoname=valueen el comando del encoder. Obligatorio paraMetadata,CuePoint,DateRangeeID3Tag; opcional para los cuatro límites de cue (CueIn,CueOut,ScteIn,ScteOut).
Ejemplos.
Cue de ad para el player vía metadata genérica:
curl -X POST "https://<tu-host>/c21apiv2/livestreams/<livestreamId>/runtimeOptions/metadata" \
-H "Authorization: Bearer <YOUR_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"type": "Metadata",
"metadata": { "name": "adbreak", "value": "preroll-30s" }
}'
Par splice SCTE-35 alrededor de una pausa publicitaria:
# entrar a la pausa
curl -X POST "https://<tu-host>/c21apiv2/livestreams/<livestreamId>/runtimeOptions/metadata" \
-H "Authorization: Bearer <YOUR_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{ "type": "ScteOut" }'
# salir de la pausa
curl -X POST "https://<tu-host>/c21apiv2/livestreams/<livestreamId>/runtimeOptions/metadata" \
-H "Authorization: Bearer <YOUR_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{ "type": "ScteIn" }'
Emisión de tag ID3 en HLS:
curl -X POST "https://<tu-host>/c21apiv2/livestreams/<livestreamId>/runtimeOptions/metadata" \
-H "Authorization: Bearer <YOUR_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"type": "ID3Tag",
"metadata": { "name": "TXXX:show", "value": "evening-news" }
}'
La inyección ocurre en el siguiente tick del encoder; el marcador aparece en el stream de salida en pocos segundos.
FAQ
LiveStream.status es 1 (Live). Una fila en cualquier otro estado solo muestra la fila, sin panel.hevc_above_1080p, hevc_hdr o hevc_hdr_above_1080p y deshabilita la pestaña. Para usar Blackout, baja la resolución del Encoding a 1080p o cambia el codec a H.264.