Saltearse al contenido

Resumen de streams

El tile de streams es un navegador unificado para cada fuente de vídeo en directo que tiene la misión. Tiene tres pestañas y un único evento de selección al que escucha el resto de la consola.

Las tres pestañas

Cada pista de vídeo peer-to-peer actualmente publicada en la sala de la misión — drones Android de mano, aeronaves de DJI dock, bodycams, cámaras de móvil. Renderizado como una cuadrícula de miniaturas en directo.

VMS

Cámaras CCTV e IP vinculadas a esta misión — HLS, MJPEG, MP4 directo o embed. Incluye un formulario para añadir cámara, prueba por cámara, controles PTZ y metadatos de integración con el mapa.

DOCKS

DJI docks actualmente asignados a esta misión, limitado al ámbito de tu organización. Estado, batería, texto de actividad y apertura con un clic.

Consulta las páginas por pestaña para más detalles:

Qué lee el tile de la sala

El tile se suscribe a WebRtcService.status$ y refleja status.video.streams[]. Cada entrada contiene:

  • peerId — la identidad del participante LiveKit (p. ej. dji-dock-{sn} para el peer de telemetría de un DJI dock; dji-dock-{sn}-{videoSlug} para su ingress de vídeo; otros IDs para peers de mano).
  • trackId — la pista de vídeo específica dentro de ese peer. Las pistas secundarias de drone (zoom/térmica) llevan un sufijo VIDEO_DRONE_TRACK_ID + '_…' y se ocultan de la cuadrícula.
  • stream — el propio MediaStream.
  • active — si la pista está produciendo frames actualmente.

La resolución del nombre del drone se ejecuta en un efecto reactivo: cada nuevo peer id se busca contra los assets de Firestore (firebaseApi.getAsset(droneId)) para mostrar un indicativo legible en lugar de un UUID. Los resultados se almacenan en caché en un signal droneNames para que los renderizados posteriores sean gratuitos.

Abrir un stream (el evento de selección)

Al hacer clic en cualquier miniatura de stream se emite el evento streamSelected desde el tile. La forma del payload:

{
peerId: string;
trackId: string;
isDrone: boolean;
dockSn?: string;
mode?: 'taclink' | 'djiCloud';
}
  • Para peers de drone normales, isDrone: true, sin dockSn, mode: 'taclink'.
  • Para peers de DJI dock, isDrone: true, dockSn resuelto desde el peer id, mode: 'djiCloud' — esto indica al tile de drone-stream que enrute a través del transporte DJI Cloud en lugar de TACLINK.
  • Para cámaras VMS, un flujo independiente (sin evento streamSelected) enruta al tile de camera-stream o al panel del reproductor VMS.

El componente padre (normalmente operation.component) escucha el evento y cambia el tile de drone-stream enlazado al stream seleccionado.

Overlays en modo depuración

Con el modo depuración activado, cada tarjeta de stream muestra un pequeño badge de latencia con el tiempo de ida y vuelta en milisegundos. El tile consulta RTCPeerConnection.getStats() para cada peer conectado cada 2 segundos y extrae currentRoundTripTime del par de candidatos seleccionado. Los valores por encima de ~200 ms indican pérdida de paquetes o un relé TURN; por debajo de 100 ms indica una ruta directa sana o un relé rápido.

Los badges de depuración son aditivos — si los activas antes de abrir TACLINK, aparecerán para cada stream en cuanto cambies a esa pestaña.

Cicla entre streams

La cabecera del tile tiene botones chevron prev/next cuando hay más de un stream disponible. Invocan cyclePrevStream() / cycleNextStream() que avanzan la selección en módulo sobre el número de streams, con wrap-around en los extremos. La cabecera muestra la posición actual como N / total.

No hay atajos de teclado conectados para ciclar; los operadores que quieran atajos deben reasignarlos desde la página de controles.

Persistencia de pestañas

La pestaña actual se guarda en el signal activeTab — es de ámbito de sesión (no persiste entre recargas). Si siempre quieres TACLINK primero, ese es el valor por defecto — las demás pestañas son opt-in por sesión.

Relacionado