-
Notifications
You must be signed in to change notification settings - Fork 0
Contratos de Interfaz y Protocolos
- Versión del Sistema: RTMS v2.8.0+
- Autor: Joaquín Yarsky (joaquinyarsky@gmail.com)
- Área: API REST / WebSockets / Protocolos de Red / Streaming / Seguridad
Todos los endpoints mutantes y administrativos requieren autenticación mediante la cabecera X-RTMS-Token o la cookie de sesión HttpOnly rtms_session. Queda categóricamente prohibido el paso de tokens mediante parámetros de consulta (query parameters), retornando HTTP 403 Forbidden.
| Método | Endpoint | Cabeceras Requeridas | Parámetros / Body (JSON) | Códigos HTTP | Descripción |
|---|---|---|---|---|---|
GET |
/api/health |
Ninguna | Ninguno | 200 |
Health check del servidor y estado de MediaMTX. |
GET |
/api/system/devices |
X-RTMS-Token |
?force_refresh=bool |
200, 403 |
Retorna lista de dispositivos DirectShow físicos. |
GET |
/api/streams |
X-RTMS-Token |
Ninguno | 200, 403 |
Retorna el inventario consolidado y estados FSM de cámaras. |
POST |
/api/streams/action |
X-RTMS-Token |
StreamAction (device_path, action) |
200, 400, 403 |
Inicia, detiene o reinicia un flujo de cámara. |
POST |
/api/streams/stop-all |
X-RTMS-Token |
Ninguno | 200, 403 |
Detiene todas las transmisiones activas. |
GET |
/api/config |
X-RTMS-Token |
Ninguno | 200, 403 |
Obtiene la configuración completa del sistema. |
POST |
/api/config/camera |
X-RTMS-Token |
CameraConfigUpdate |
200, 422, 403 |
Modifica parámetros de resolución, bitrate, encoder o SRT. |
POST |
/api/preview/ticket |
X-RTMS-Token |
PreviewTicketRequest (device_path, ttl_seconds) |
200, 403 |
Genera un token efímero de un solo uso para streaming. |
GET |
/api/preview/mjpeg/{cam_id} |
Ninguna | ?ticket={token_urlsafe} |
200, 403, 429 |
Flujo continuo multipart/x-mixed-replace de cuadros JPEG. |
POST |
/api/preview/ffplay |
X-RTMS-Token |
{"url": "srt://..."} |
200, 400, 403 |
Lanza reproductor de baja latencia nativo FFplay. |
POST |
/api/system/shutdown |
X-RTMS-Token |
SystemShutdownRequest (force) |
200, 403 |
Ejecuta el protocolo de apagado ordenado del sistema. |
{
"device_path": "@device_pnp_\\\\?\\usb#vid_046d&pid_0825...",
"resolution": "1080p",
"fps": 30,
"bitrate": 4500,
"protocol": "srt",
"encoder": "h264_nvenc",
"srt_latency": 50,
"srt_passphrase": "clave_segura_produccion_2026",
"secret_action": "set",
"zerolatency": true,
"auto_start": true,
"udp_mode": "multicast"
}-
Restricción
srt_passphrase: Si se provee, debe cumplir con la longitud de 10 a 79 caracteres impuesta por el estándarlibsrt.
El canal WebSocket provee un flujo bidireccional continuo de datos y eventos en tiempo real.
Emitido 10 veces por segundo cuando hay clientes conectados.
{
"type": "telemetry",
"timestamp": 1790875200.123,
"host": {
"cpu_percent": 14.2,
"memory_used_mb": 4210.5,
"memory_total_mb": 16384.0,
"memory_percent": 25.7,
"net_sent_kbps": 9450.2,
"net_recv_kbps": 320.1,
"gpu": {
"load_percent": 18.0,
"memory_used_mb": 840.0,
"memory_total_mb": 6144.0,
"temperature_c": 52.0
}
},
"streams": [
{
"device_path": "@device_pnp_\\\\?\\usb#vid_046d&pid_0825...",
"friendly_name": "Logitech HD Webcam C270",
"state": "running",
"fps": 30.0,
"bitrate_kbps": 4480.5,
"speed": "1.00x",
"dropped_frames": 0,
"total_frames": 18450
}
],
"summary": {
"active_streams": 1,
"total_streams": 3,
"total_bitrate_kbps": 4480.5
}
}Emitido instantáneamente ante transiciones de estado, desconexión de hardware o alertas.
{
"type": "event",
"event": "stream_state_changed",
"data": {
"device_path": "@device_pnp_\\\\?\\usb#vid_046d&pid_0825...",
"previous_state": "starting",
"new_state": "running"
},
"timestamp": 1790875200.150
}-
Modo de Conexión:
mode=caller(FFmpeg empuja el flujo al broker local). -
Dirección de Enlace:
srt://127.0.0.1:8890?streamid=publish:{cam_id}&... -
Parámetros de Capa de Transporte:
-
latency = 50000($\mu\text{s}$ , 50 ms en zerolatency). -
tlpktdrop = 1(incondicional en caller: descarta paquetes tardíos para evitar acumular buffer). transtype = live-
sndbuf = 65536bytes,rcvbuf = 65536bytes. -
pkt_size = 1316bytes (exactamente 7 paquetes MPEG-TS de 188 bytes). -
smoother= deshabilitado en modo caller para erradicar retardo artificial de pacing.
-
-
Modo de Conexión:
mode=listener(MediaMTX escucha conexiones entrantes de clientes). -
URL Canónica Generada:
srt://{host}:8890?streamid=read:{cam_id}&latency=50000&rcvbuf=65536&tlpktdrop=1&passphrase={secret} -
Cifrado Simétrico: AES-128 nativo con derivación de clave por contraseña (
pbkeylen=16).
Para evitar colisiones entre múltiples cámaras dentro del segmento LAN, RTMS calcula de forma determinista la IP del grupo multicast en base al puerto de transmisión:
-
Parámetros del Socket Multicast:
-
pkt_size=1316: Tamaño óptimo de payload MTU. -
ttl=16: Tiempo de vida restringido a la red de producción local (evita escape hacia WAN). -
buffer_size=65536: Buffer mínimo para evitar acumulación de latencia. -
overrun_nonfatal=1: Continuar transmisión si el buffer se satura temporalmente. -
fifo_size=5000: Cola interna de paquetes en FFmpeg.
-
-
Sintaxis de Reproducción en VLC Player:
- Multicast:
vlc.exe "udp://@239.255.0.x:{port}" :network-caching=50 :clock-jitter=0 :clock-synchro=0 - Unicast Local:
vlc.exe "udp://@:{port}" :network-caching=50 :clock-jitter=0 :clock-synchro=0
- Multicast:
Para autorizar solicitudes de imágenes o flujos sin cabeceras HTTP personalizadas:
-
Generación: El cliente envía
POST /api/preview/ticketcon cabeceraX-RTMS-Token. El backend responde con un token urlsafe de 32 bytes (ticket). -
Asociación: El token queda ligado a la ruta de la cámara y a una marca de tiempo de expiración:
$$t_{\mathrm{exp}} = t_{\mathrm{actual}} + \Delta t_{\mathrm{ttl}} \quad (\text{con } \Delta t_{\mathrm{ttl}} = 60\text{ s por defecto})$$ donde el tiempo de vida en segundos se configura mediante el parámetrottl_seconds. -
Consumo Atómico: Al recibir
GET /api/preview/mjpeg/{cam_id}?ticket={ticket}, la funciónconsume_ticket()extrae y borra atómicamente el ticket bajothreading.Lock(). Cualquier petición posterior con el mismo ticket es rechazada conHTTP 403. - Desalojo por Capacidad: Máximo 100 tickets simultáneos en memoria. Al alcanzar el límite, el ticket más antiguo es purgado automáticamente.
RTMS (Real-Time Multicam System) — Ingeniería de Sistemas Audiovisuales de Misión Crítica
Desarrollado y mantenido por Joaquín Yarsky (joaquinyarsky@gmail.com)
Repositorio GitHub • Releases & Binarios • Historial de Cambios • Reporte de Seguridad • Licencia MIT
Documentación oficial generada y sincronizada automáticamente desde el repositorio.
- Vistas C4 del Sistema
- Modelo de Concurrencia e Hilos
- Contratos de Interfaz y Red
- Matriz de Trazabilidad
- 📚 Índice y Matriz de ADRs
- ADR-0001: Broker MediaMTX
- ADR-0002: Formatos DirectShow
- ADR-0003: Cifrado SRT AES-128
- ADR-0004: Reloj Óptico E2E
- ADR-0005: Distribución Multicast
- ADR-0006: Asincronía Tray/API
- ADR-0007: Priorización GPU
- ADR-0008: Sanitización de Datos
- ADR-0009: Win32 Job Objects
- ADR-0010: SQLite WAL ACID
- ADR-0011: Cifrado Windows DPAPI
- ADR-0012: Energía y Reloj 1 ms
- ADR-0013: Named Mutex Win32
- ADR-0014: Single-Flight Cache
- ADR-0015: Telemetría 10 Hz
- ADR-0016: Admisión MJPEG
- ADR-0017: FSM y Watchdog
- ADR-0018: Seguridad Tokens
- ADR-0019: WebView2 & Tray
- 📚 Índice de RFCs
- RFC-0001: Verificación Óptica
- RFC-0002: Multicámara <100ms
- RFC-0003: SQLite WAL Migrator
- RFC-0004: Previews Zero-Copy
- RFC-0005: Blindaje Resiliente