Saltar a contenido

Integración de videoanalítica externa

El sistema externo recibe vídeo, detecta eventos y los envía a videovigilancia. Elija contrato según el resultado:

  • Evento con intervalo y descripción — cree generic mediante Watcher Client API, con token de usuario y permiso de edición. Watcher asigna ID.
  • Evento tipado vehicle o face — use contrato de servicio Central con autenticación separada. La integración asigna ID y aporta sus resultados; abajo se muestra vehicle.

Crear generic no reconoce caras ni matrículas ni crea resultados de analítica integrada. Enviar face a Central tampoco inicia identificación por huella. Estas operaciones guardan resultados externos.

RTSP para analítica

Proporcione un token separado para ver la cámara según acceso RTSP. Para enviar generic, use otra cuenta Watcher con edición de las cámaras y autenticación API.

Sincronice relojes de fuente y analítica. Los tiempos son milisegundos Unix; la llegada de HTTP no sustituye la hora del evento en vídeo.

Episodios generic mediante Watcher Client API

Cree el episodio:

POST /watcher/client-api/v3/episodes
Authorization: Bearer <token>
Content-Type: application/json

{
  "media": "entrance-example",
  "opened_at": 1793692800000,
  "closed_at": 1793692810000,
  "title": "Evento de sensor externo",
  "description": "Movimiento en la entrada"
}

Sustituya media por el nombre API. Se necesita edición, no solo visualización.

Campos:

  • media — nombre obligatorio de cámara.
  • opened_at — inicio obligatorio en milisegundos Unix.
  • closed_at — final opcional en las mismas unidades.
  • title — hasta 64 caracteres.
  • description — hasta 256 caracteres.
  • preview — JPEG opcional en Base64 sin data:image/jpeg;base64,; la interfaz añade el prefijo.

Prepare preview de un JPEG con Python:

import base64
from pathlib import Path

preview = base64.b64encode(Path("preview.jpg").read_bytes()).decode("ascii")

Incluya el valor en el JSON. El backend conserva la cadena sin convertir; compruebe antes que el archivo sea JPEG válido.

Guarde episode_id. Otro POST crea otro episodio; al repetir entregas, controle resultados ya guardados.

Para cambiar texto, use el ID devuelto:

PUT /watcher/client-api/v3/episodes/{episode_id}
Authorization: Bearer <token>
Content-Type: application/json

{"title":"Evento revisado","description":"Comentario del operador"}

Solo cambia title y description. No amplía detección ni reenvía objetos completos de analítica integrada.

Identificadores generic

Watcher asigna el ID usando opened_at y elige otro si está ocupado. La integración no necesita generar Snowflake. Guarde el episode_id real para leer y actualizar.

Comprobar generic

  1. Confirme permiso de edición de la cuenta de prueba.
  2. Cree un episodio para un intervalo con grabación existente.
  3. Lea GET /watcher/client-api/v3/episodes/{episode_id} o búsquelo en Watcher.
  4. Compruebe título y descripción y abra vídeo del intervalo.
  5. Pruebe una cuenta de solo visualización: debe rechazar la creación.

Existir el episodio no demuestra grabación. Para reproducir debe estar activada y ser accesible al usuario.

Eventos vehicle mediante Central

PUT /central/api/v3/episodes/{episode_id} también existe bajo /streamer/api/v3. Acepta face y vehicle; para un ID existente aplica JSON merge-patch. Aquí se usa vehicle.

Use dirección y clave propias de Central. El ejemplo envía Bearer <central_api_key>. La emite su administrador; también puede usarse un token de servicio Central con lectura/escritura y ámbito de episodios. access_token de Watcher no concede ese acceso.

La integración asigna un entero único episode_id en la ruta y lo reutiliza al actualizar. Sustituya los valores ficticios:

PUT /central/api/v3/episodes/1793692800000001
Authorization: Bearer <central_api_key>
Content-Type: application/json

{
  "episode_type": "vehicle",
  "media": "entrance-example",
  "opened_at": 1793692800000,
  "started_at": 1793692800000,
  "closed_at": 1793692810000,
  "updated_at": 1793692811000,
  "license_plate_text": "A000AA00",
  "license_plate_missing": false,
  "vehicle_purpose": "regular"
}

media es el nombre técnico de cámara existente, no el título. Todos los tiempos son milisegundos Unix. Un evento nuevo necesita media, opened_at y updated_at; el tipo es vehicle. El ID no es un campo temporal. Central asigna su propio updated_at monótono al guardar para recuperar cambios.

preview y frame_preview son JPEG opcionales en Base64 sin prefijo: miniatura del objeto y fotograma completo. Imágenes y texto vienen del sistema externo; enviarlos no ejecuta OCR en Watcher.

Tras PUT, lea con la misma clave Central:

GET /central/api/v3/episodes/1793692800000001
Authorization: Bearer <central_api_key>

Devuelve HTTP 200. Compare tipo, cámara, intervalo y matrícula. Para corregirla envíe actualización parcial:

PUT /central/api/v3/episodes/1793692800000001
Authorization: Bearer <central_api_key>
Content-Type: application/json

{"license_plate_text":"A001AA00"}

Repita GET: debe cambiar el número conservando episode_type, media, opened_at y closed_at. Central renueva su updated_at.

Tras procesarlo Watcher, compruebe por Client API con un token de usuario que acceda a esos episodios:

GET /watcher/client-api/v3/episodes/1793692800000001
Authorization: Bearer <watcher_user_token>

Compare tipo, nombre y matrícula nueva. Si falta, repita tras procesar actualizaciones y compruebe conexión Central y permisos. Watcher conserva parte de los datos; leerlo no confirma transferencia de toda la estructura, identificación facial ni archivo para el intervalo.