-
Notifications
You must be signed in to change notification settings - Fork 0
Runbook y Operaciones
- Versión del Sistema: RTMS v2.8.0+
- Autor: Joaquín Yarsky (joaquinyarsky@gmail.com)
- Área: Operaciones / Compilación / Kernel Tuning / Benchmarking / Troubleshooting
RTMS se distribuye como una aplicación de Windows x64 autónoma y portable (Zero-Install), que integra el entorno de Python, dependencias nativas y los binarios de medios (ffmpeg.exe, mediamtx.exe, ffplay.exe).
Para compilar la versión de distribución oficial:
:: 1. Activar entorno virtual con dependencias bloqueadas
uv sync --locked
:: 2. Ejecutar script maestro de empaquetado
build_portable.batEl empaquetado se rige por las siguientes banderas arquitectónicas:
-
--noconsole: Oculta la ventana de comandos negra de Windows. En runtime,main.pyredirigesys.stdoutysys.stderra_NullWriterpara evitar excepcionesNoneType.write()en entornos GUI. -
--add-data "gui;gui": Incluye plantillas HTML5, estilos CSS3, scripts JS y recursos vectoriales de marca (brand_assets_sheet.png, logos). -
--add-data "bin;bin": Embebe los ejecutables binarios estáticos de 64 bits (ffmpeg.exe,mediamtx.exe,ffplay.exe). -
--icon "icon.ico": Asigna el imagotipo de alta resolución al ejecutable compilado. -
rtms.exe.config: Manifiesto .NET/Win32 con flags DPI-Aware (PerMonitorV2) y compatibilidad para Windows 10/11.
Para garantizar latencias estables por debajo de 100 ms y evitar la pérdida de cuadros en producciones continuas de más de 8 horas, se aplican las siguientes directivas de optimización del sistema:
Por defecto, Windows utiliza un tick de reloj de 15.6 ms. RTMS eleva automáticamente la frecuencia a 1 ms en su arranque mediante la API multimedia:
winmm = ctypes.windll.winmm
winmm.timeBeginPeriod(1) # Inyectado al iniciar el servicio
winmm.timeEndPeriod(1) # Restaurado al finalizar la sesiónEsto reduce la desviación estándar (jitter) en la temporización de cuadros de video a menos de 0.8 ms.
Para evitar micro-cortes y fluctuaciones en sockets SRT/UDP, se desactiva el ahorro de energía en todas las tarjetas de red físicas directamente mediante la manipulación del registro de Windows:
:: Clave de Registro:
HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\<DeviceIndex>
:: Valor fijado:
PnPCapabilities = 0x00000018 (24 decimal)Nota: Realizado de forma nativa por core/power_mgr.py sin utilizar scripts PowerShell para evitar alertas en antivirus.
RTMS provisiona automáticamente las reglas requeridas en Windows Defender Firewall para permitir el tráfico de video en red local:
netsh advfirewall firewall add rule name="RTMS API" dir=in action=allow protocol=TCP localport=8000-8099
netsh advfirewall firewall add rule name="RTMS Streaming" dir=in action=allow protocol=UDP localport=8890,9000-9200
netsh advfirewall firewall add rule name="RTMS MediaMTX" dir=in action=allow program="%BASE_DIR%\bin\mediamtx.exe" enable=yesRTMS incluye una suite de certificación matemática de latencia de extremo a extremo que no depende de sensores externos ni de OCR.
Ejecute la suite completa de pruebas de la cadena de ejecución:
python scripts/e2e_pipeline_tester.py --allPara medir la latencia exacta introducida por el pipeline de captura, codificación, conmutación en MediaMTX y decodificación:
python scripts/verify_ultra_low_latency_pipeline.py --duration 10 --port 9050Métricas Reportadas:
- Ping Mínimo / Máximo / Promedio: Medido muestreando los centroides de la cabecera Barker de 72 bits grabada cuadro a cuadro.
-
Jitter (
$J$ ): Desviación estándar de los tiempos de llegada de paquetes. - Cuadros Perdidos (Dropped Frames): Saltos detectados en el contador secuencial de 16 bits.
- Cuadros Duplicados (Stutter / Freezes): Detección de timestamps estancados con reloj de sistema avanzando.
Criterio de Aceptación de Grado de Producción:
- Ping Promedio
$\le 100$ ms. - Jitter
$\le 15$ ms. - Cuadros Perdidos
$= 0%$ en red local cableada Gigabit.
-
Síntoma: Al iniciar una cámara en el dashboard, transiciona a estado
ERRORy el log muestra:[in#0] Could not set video options: video=...: I/O error (code 4294967291). -
Causa Raíz: El sensor de video o capturadora HDMI no admite compresión interna MJPEG en sus pines DirectShow (solo entrega formatos no comprimidos
yuyv422onv12). -
Procedimiento de Resolución:
- Abrir la configuración de la cámara en el Dashboard (
⚙️). - Verificar que
Negociación Dinámica DirectShowesté en modo Automático (ADR-0002). - Si el dispositivo persiste en fallo, desmarcar la opción
Forzar MJPEGpara que el sistema solicite entrada crudapixel_format=yuyv422con buffer ampliadortbufsize=65M.
- Abrir la configuración de la cámara en el Dashboard (
- Síntoma: Error al iniciar MediaMTX en el puerto 8890 o fallo al arrancar transmisiones SRT.
- Causa Raíz: Un proceso externo o una instancia huérfana de una versión antigua no blindada retiene el socket.
-
Procedimiento de Resolución:
- Identificar el proceso ocupando el puerto:
netstat -ano | findstr :8890 netstat -ano | findstr :8000
- Si el proceso no es el RTMS activo, liquidarlo por PID:
taskkill /F /PID <PID>
- En RTMS v2.8.0+, el gestor
PortManagerreasigna automáticamente el flujo al siguiente puerto disponible (reallocate_if_collided). Reiniciar el flujo desde la interfaz web.
- Identificar el proceso ocupando el puerto:
-
Síntoma: El video en OBS Studio presenta un retraso incremental de varios segundos, o MediaMTX registra en logs
gosrt: ERROR:ROGUE. - Causa Raíz: El emisor no está descartando paquetes atrasados o el parámetro de suavizado (smoother) está introduciendo retardo artificial.
-
Procedimiento de Resolución:
- Verificar que la URL de publicación contenga incondicionalmente
tlpktdrop=1(garantizado enStreamProc). - Asegurarse de que
smoother=liveesté desactivado en modo caller. - En OBS Studio, en la fuente multimedia SRT, añadir la cadena de latencia calibrada:
srt://127.0.0.1:8890?streamid=read:{cam_id}&latency=50000&rcvbuf=65536&tlpktdrop=1
- Verificar que la URL de publicación contenga incondicionalmente
- Síntoma: VLC Media Player muestra pantalla negra o tarda más de 5 segundos en reproducir la señal UDP.
- Causa Raíz: El buffer de red predeterminado de VLC (1000 ms) desincroniza el reloj frente al flujo en tiempo real de RTMS.
-
Procedimiento de Resolución:
- No abrir la URL directamente con doble clic simple en VLC sin argumentos.
- Utilizar el comando generado por RTMS con parámetros de baja latencia:
vlc.exe "udp://@239.255.0.1:9000" :network-caching=50 :clock-jitter=0 :clock-synchro=0
- Alternativamente, utilizar el botón
Abrir en VLCdel Dashboard, el cual genera y ejecuta automáticamente un archivo de lista de reproducción.xspfcon las directivas de caching precargadas.
-
Síntoma: Al encender la cuarta o quinta cámara, la transmisión falla con
Cannot open video encoder: No available sessions. - Causa Raíz: Las tarjetas gráficas NVIDIA de la línea GeForce tienen un límite de hardware impuesto por el controlador (habitualmente 3 a 5 sesiones simultáneas de codificación NVENC).
-
Procedimiento de Resolución:
- RTMS detecta automáticamente el código de error
ENCODERen la máquina de estados. - El supervisor watchdog degrada automáticamente dicho flujo a CPU con
libx264 -preset ultrafast -tune zerolatency(force_cpu=True) conforme a ADR-0007. - En la interfaz web, el indicador de la cámara mostrará la insignia de advertencia amarilla
CPU Fallback, garantizando que la emisión nunca se interrumpa.
- RTMS detecta automáticamente el código de error
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