Cámaras VMS
La pestaña VMS del tile de streams gestiona cámaras IP de terceros — feeds CCTV NVR, cámaras PTZ ONVIF, streams sólo embed de sistemas propietarios. Puedes añadir, probar, editar y eliminar cámaras por misión, y cada cámara tiene un perfil completo de geolocalización + campo de visión para renderizarse como un cono FOV en el mapa.
La cuadrícula de cámaras
Cada cámara vinculada a esta misión se renderiza como una tarjeta que muestra:
- Miniatura (en directo si el stream se resuelve).
- Nombre + etiqueta de grupo.
- Badge del tipo de stream (HLS / MJPEG / MP4 / Embed).
- Chip de ubicación + rumbo si está geocodificada.
- Botones Editar (lápiz) y Eliminar (papelera).
Las tarjetas se alimentan de una suscripción a Firestore — cualquier edición que hagas, o cualquier cosa que haga un compañero, aparece en menos de un segundo.
Formulario para añadir cámara
Haz clic en Añadir cámara en la cabecera de la pestaña. Se desliza un panel lateral con el formulario. Todos los campos:
Básicos
- Nombre — obligatorio. Se muestra en la tarjeta y en el tooltip del cono del mapa.
- URL — obligatorio. La URL cruda del stream. Para HLS es un
.m3u8; para MJPEG es el endpoint motion-JPEG de la cámara; para MP4 es una URL de reproducción directa; para embed es una URL de iframe. - Tipo de stream — desplegable: HLS / MJPEG / MP4 / Embed.
- Habilitada — toggle. Las cámaras deshabilitadas se quedan en la lista pero no renderizan su stream ni el cono FOV.
- Canal — numérico. Útil cuando múltiples cámaras comparten un esquema de nombres NVR común.
- Grupo — texto libre (p. ej. “Perímetro norte”, “Cámaras de puerta”).
- Ubicación — etiqueta de ubicación en texto libre.
- Notas — texto libre, hasta unos cientos de caracteres.
Los cuatro tipos de stream
| Tipo | Qué proporcionas | Cómo se renderiza |
|---|---|---|
| HLS | URL de playlist .m3u8 | Reproducción adaptativa de bitrate vía hls.js. Funciona en cualquier navegador. |
| MJPEG | Endpoint HTTP motion-JPEG | Frame a frame vía tag <img>. CPU alta en el visor pero universal. |
| MP4 | URL directa MP4 (archivo o live-MP4) | Elemento <video> nativo. Baja latencia si tu servidor produce live fragmented MP4. |
| Embed | URL de iframe arbitraria | <iframe> — usado para reproductores web propietarios que no pueden extraerse a un stream directo. |
Autenticación
- Tipo de auth — desplegable:
none/basic/token. - Usuario + contraseña — se muestra sólo para
basic. HTTP Basic Auth. - Auth token — se muestra sólo para
token. Se adjunta como token Bearer vía la cabeceraAuthorization(o se añade como query-string si la cámara no puede manejar auth por cabecera; el reproductor prueba ambos).
PTZ
- PTZ habilitada — toggle. Revela el resto del bloque PTZ.
- URL PTZ — opcional. Para PTZ controlada por HTTP, la plantilla de URL
con placeholders
{direction}/{speed}. Para ONVIF, déjala en blanco. - Tipo PTZ — desplegable:
onvif/http. ONVIF habla comandos SOAPContinuousMove; http sustituye en la plantilla de URL. - Velocidad PTZ — slider 1-10. Se envía con cada comando PTZ.
- Token de perfil PTZ — sólo ONVIF. La mayoría de cámaras ONVIF exponen un perfil por defecto automáticamente; sólo configura esto si tu cámara tiene múltiples perfiles y quieres apuntar a uno específico.
Ubicación + campo de visión
Rellena esto para renderizar la cámara en el mapa como un cono FOV en el suelo:
- Lat / Lng — obligatorios para renderizar en mapa.
- Altura (m) — por defecto 3 m. Altura de la cámara sobre el suelo.
- Rumbo (grados) — 0-360, por defecto 0. Rumbo de la brújula al que apunta la cámara.
- Inclinación (grados) — -90 a 0. Pitch hacia abajo; -30 es un ángulo habitual para cámaras de perímetro.
- FOV horizontal (grados) — 10-180. Ángulo de cono horizontal de la cámara.
Los campos de ubicación ausentes simplemente saltan el renderizado en mapa — la tarjeta y el reproductor siguen funcionando.
El flujo de test-stream
Haz clic en Probar después de rellenar URL + auth. El tile invoca
vmsService.checkHealth(fakeCam) y el signal testResult cicla entre estos
estados:
| Estado | Significado |
|---|---|
none | Aún no probado. |
live | Prueba exitosa — el stream es alcanzable y devuelve vídeo. |
auth_error | 401/403 desde la cámara. Tus credenciales son incorrectas. |
offline | Conexión rechazada / timeout / fallo DNS. La cámara no es alcanzable. |
error | Algo más falló — URL inválida, codec no soportado, stream corrupto. |
El badge de resultado permanece hasta que cambies un campo o pulses Probar de nuevo. Una prueba exitosa no garantiza que la cámara funcione en producción (cortes transitorios de red) pero detecta los casos comunes de error de configuración.
Guardar
Haz clic en Guardar. La cámara se escribe en Firestore bajo
missions/{missionId}/vms_cameras/{cameraId}. Aparece en la cuadrícula de
cada participante en menos de un segundo y, si los campos de ubicación están
rellenos, en el mapa como un cono.
Editar
Haz clic en el icono del lápiz de cualquier tarjeta. El formulario se reabre precargado con todos los valores actuales. Al guardar se actualiza el documento Firestore in-place — el ID de la cámara se preserva para que las flags y cualquier otro documento que la referencie sigan siendo válidos.
Eliminar
Haz clic en el icono de la papelera. Aparece un prompt de confirmación (dos pasos por seguridad). Al confirmar, la cámara se elimina de Firestore y de la cuadrícula de todo el mundo. Eliminar una cámara NO elimina ninguna grabación — estas viven por separado.
Compartir entre misiones
Las cámaras añadidas vía la pestaña VMS viven dentro de la misión. Para compartirlas entre misiones, añádelas a nivel de org vía Admin → Organización → Biblioteca VMS — esas aparecen en cada misión automáticamente.
Reproducción por cámara
Haz clic en una tarjeta para abrir el reproductor VMS dentro del tile. Controles:
- Reproducir / Pausar.
- Silenciar / Activar sonido.
- Pantalla completa.
- Captura (PNG del frame actual).
- Flechas PTZ + balancín de zoom si PTZ está configurada y habilitada.
- Grabación (iniciar / detener) — delega en el servicio VMS la grabación del lado del servidor.
Los comandos PTZ van a través de un proxy de ARGUS (tu navegador no puede
hablar ONVIF SOAP directamente). El proxy vive en la superficie /api/vms de
argus-api.
Limitaciones conocidas
- Sin auto-ciclo para streams que pierden la conexión — si el NVR se reinicia, debes hacer clic manualmente en la cámara para forzar un reintento.
- Sin RTSP directo — sólo HLS / MJPEG / MP4 / Embed. Para cámaras RTSP, pon
un transcodificador (p. ej.
go2rtcoRTSPtoWeb) delante y apunta ARGUS a la salida HLS. - Sin tour multi-cámara de presets — cada cámara se reproduce individualmente; no hay modo “tour de cuatro cámaras secuencialmente”.
Relacionado
- Resumen de streams
- Camera stream tile — dedica un tile a una sola cámara.
- Admin → Organización → Biblioteca VMS para cámaras compartidas a nivel de org entre misiones.