Releases: FJYarsky/RTMS
Releases · FJYarsky/RTMS
Release list
RTMS v2.7.0 — Ultra-Baja Latencia SRT/UDP, Zero GPU Bloat, Identidad Visual Oficial, Gobernanza Dinámica Energética y Seguridad Integral
RTMS v2.7.0 — Ultra-Baja Latencia SRT/UDP, Zero GPU Bloat, Identidad Visual Oficial, Gobernanza Dinámica Energética y Seguridad Integral
Latest
RTMS v2.7.0 — Ultra-Baja Latencia SRT/UDP, Zero GPU Bloat, Identidad Visual Oficial, Gobernanza Dinámica Energética y Seguridad Integral
(2026-09-24)
🚀 Motor Multimedia de Ultra-Baja Latencia y Mitigación de Saturación GPU
- Eliminación de VBV Buffer Bloat: Reducción del buffer VBV a sub-segundo (
bufk = int(bitrate * 0.5)k), eliminando colas y buffers inflados que generaban latencia progresiva de varios segundos. - Sintonización Fina NVENC: Ajuste exhaustivo de parámetros
h264_nvenc(-preset p2 -tune ll -rc cbr -delay 0 -zerolatency 1 -forced-idr 1 -bf 0 -b_adapt 0 -pix_fmt nv12), erradicando la saturación artificial al 100% de la GPU dedicada y previniendo fallos con webcams DirectShow en formato YUYV. - Cadencia Determinista CFR: Forzado de
-fps_mode cfrantes de la codificación para sincronía estricta de marcas de tiempo PTS/DTS. - Optimización de Sockets UDP y Mapeo Multicast Inyectivo: Buffers de red configurados a
buffer_size=131072(128 KB) yfifo_size=50000. Fórmula inyectiva(port - 9000) + 1asignando IPs de multidifusión únicas (239.255.0.1..239.255.0.201) para puertos 9000..9200, garantizando cero colisiones. - Latencia Sub-100ms en Clientes SRT y VLC: Receptores SRT con URLs de reproducción directa sin búfer retardado en OBS/vMix y VLC. Formato canónico
udp://@:<port>para VLC UDP Unicast LAN. - Watchdog Anti-Freeze: Monitoreo de
last_progress_atcon reinicio automático si la transmisión se congela (>10s sin avance de frames).
💾 Persistencia Transaccional SQLite v2 y Semántica REST PATCH
- Migración de Base de Datos a Esquema v2: Soporte nativo para persistir
is_virtual,udp_modeyudp_hostde forma idempotente y segura (ACID WAL). - Semántica PATCH Granular: Actualización de cámaras preservando campos omitidos y control seguro de credenciales SRT (
secret_action = keep | set | clear). - Arquitectura No-Mutante en StreamManager:
get_procretornaNone/ HTTP 404 para cámaras inexistentes, previniendo asignaciones residuales de puertos y procesos fantasma. - Reinicio Selectivo Inteligente: Las importaciones de configuración en caliente sólo reinician procesos cuando los parámetros del pipeline de codificación han cambiado.
🎨 Identidad Visual Oficial, Estética y Branding Vectorial
- Badge de Versión Fluorescente: Píldora
.version-tagrediseñada con tipografía monospace fluorescente (JetBrains Mono/Consolas), halo de luz sutil y micro-interacción hover. - HUD Superior y Animación de Tarjetas: Indicadores en vivo en la barra de navegación con animación esmeralda pulsante
pulse-livepara transmisiones activas. - Modal "Acerca de" con Imagotipo Vectorial: Integración de
gui/static/imagotype_vertical.svg, tarjeta glassmorphism de autor y enlace directo a la web oficialhttps://fjyarsky.github.io/RTMS/. - Selector de Protocolo y Modal QR: Experiencia pulida con selección directa de "UDP Unicast LAN" y host destino.
🛡️ Seguridad Integral, Prevención de Fugas y Gobernanza de Energía
- Eliminación de Tokens en Query Strings (CWE-598): Rechazo explícito con HTTP 403 en previsualizaciones WHEP y código 1008 en
/ws/telemetry. Autenticación obligatoria mediante cookies de sesión HttpOnlyrtms_sessiono cabecerasX-RTMS-Token. - Prevención de Fuga de Handles Win32: Invocación garantizada de
CloseHandleen bloquesfinallyen el gestor de Job Objects. - Gobernador Dinámico de Energía: Activación automática del plan de Alto Rendimiento en Windows durante streaming activo y restauración del esquema previo al detener flujos.
- Cabeceras CSP: Inyección de
Content-Security-Policyestricto en respuestas HTTP. - Redirección de Logs MediaMTX: Redirección segura a
config/mediamtx.logcon rotación preventiva (5 MB). - Operaciones No Bloqueantes: Envoltura de comandos
powercfgy tareas de I/O en hilos asíncronos víaasyncio.to_thread.
🧪 Suite de Pruebas y Control de Calidad
- 186/186 Pruebas Automatizadas Pasando al 100%: Cobertura exhaustiva de endpoints, pipeline multimedia, base de datos, persistencia, seguridad y rendimiento.
- 0 Errores de Mypy en 41 Archivos Fuente: Verificación de tipado estricto completada.
- Linter y Formato 100% Limpio: Ruff check y ruff format sin advertencias.
🛡️ Verificación de Seguridad e Integridad (VirusTotal)
El binario oficial de esta distribución fue analizado y validado contra múltiples motores antivirus:
- RTMS-v2.7.0-Windows-x64.zip: Ver reporte completo en VirusTotal
RTMS v2.6.0 — Previsualizaciones WebRTC WHEP, Canal WebSocket de Telemetría a 10 Hz, Monitoreo Determinista, Negociación MJPEG por Silicio y Escaneo Continuo Snyk
RTMS v2.6.0 — Previsualizaciones WebRTC WHEP, Canal WebSocket de Telemetría a 10 Hz, Monitoreo Determinista, Negociación MJPEG por Silicio y Escaneo Continuo Snyk
(2026-09-23)
🌐 Previsualizaciones WebRTC de Latencia Cero (<40 ms) con WHEP y Proxy Anti-CORS
- Protocolo RFC 9397 (WHEP):
- Integración nativa con MediaMTX WebRTC (
webrtc: yes,webrtcAddress: :8889,webrtcLocalUDPAddress: :8189). - Visor HTML5
<video id="preview-video">en el frontend, eliminando la sobrecarga y latencia del streaming MJPEG en flujos activos. - Proxy seguro
POST /api/stream/{device_path}/whepen FastAPI para evitar bloqueos CORS y mantener el tráfico dentro del mismo origen (127.0.0.1:8000). - Fallback automático y transparente al generador MJPEG para cámaras virtuales o flujos detenidos.
- Integración nativa con MediaMTX WebRTC (
⚡ Canal WebSocket de Telemetría a 10 Hz y Eventos Reactivos
- Ruta Asíncrona
/ws/telemetry:TelemetryWebSocketHubcon control de ciclo de vida: ticker de 10 Hz activo únicamente cuando hay clientes conectados (0% CPU en reposo).- Tasa de 10 Hz (100 ms) para métricas de video (FPS instantáneo, bitrate, dropped frames), GPU y rendimiento de red.
- Muestreo a 1 Hz para métricas pesadas de sistema (CPU y memoria RAM).
- Push reactivo inmediato de eventos de hardware y streaming (
device_lost,device_recovered,stream_started,stream_stopped), eliminando la necesidad de polling HTTP continuo. - Mutación granular en tiempo real del DOM por identificador, sin re-renderizado destructivo.
📊 Monitoreo Determinista con -progress pipe:1 (Sin Regex en Stderr)
- Eliminación de Scraping Regex en Stderr:
- Inyección de
-progress pipe:1 -nostatsen el generador de comandos FFmpeg. - Lector asíncrono
proc.read_progressenStreamProcpara parseo determinista de pareskey=valuedesdestdout. - Prevención garantizada de bloqueos de buffer de tubería (pipe deadlock) en Windows mediante drenado concurrente de
stdoutystderr. - Contabilización precisa de fotogramas caídos (dropped frames) y total de frames procesados.
- Inyección de
🔌 Negociación Inteligente DirectShow MJPEG por Silicio con Fallback Automático a YUYV/NV12
- Descompresión en el Chip Interno de la Cámara con Fallback de Alta Resiliencia:
- Sonda preventiva en memoria (
probe_device_mjpeg_support) de soporte de compresión MJPEG en DirectShow. - Conmutación automática instantánea a formato nativo sin compresión (
YUYV/NV12) cuando la cámara no soporta hardware MJPEG (webcams integradas de laptops), eliminando caídas porCould not set video options. - Fallback reactivo en tiempo de ejecución ante fallos de negociación en DirectShow.
- Reducción de más del 95% del consumo de ancho de banda en el bus USB en webcams con sensor MJPEG (de ~1000 Mbps en YUY2 sin comprimir a 25–40 Mbps en MJPEG).
- Sonda preventiva en memoria (
🎨 Refinamiento Visual y Estético en el Panel Web
- Badge de Versión Independiente en Barra Superior:
- Desacoplamiento de
<span class="version-tag">del contenedor degradado con recorte de texto-webkit-background-clip: text. - Diseño de píldora moderno, nítido y perfectamente centrado para
v2.6.0en WebView2.
- Desacoplamiento de
🛡️ Seguridad Continua con Snyk Security y Resolución de Dependabot
- Escaneo Automatizado SAST & SCA:
- Workflow
.github/workflows/snyk.ymlpara auditoría de vulnerabilidades con reporte SARIF integrado en GitHub Code Scanning. - Sincronización completa con
ruff >= 0.16.8ymypy >= 2.3.1(absorbiendo y resolviendo Dependabot PR #13 y PR #14). - Resolución determinista de 68 dependencias con
uv.lock. SECURITY.mdactualizado para soporte oficial de la versión>= 2.6.0.
- Workflow
📐 Modelos Pydantic v2 de Dominio Estricto
core/config_models.py:CameraConfig: validación estricta de resoluciones (480p,720p,1080p,1440p,4K), FPS (15–120), bitrate (500–50000 kbps), encoders y passphrases SRT (10–79 chars).SystemSettingsConfig: validación de puertos MediaMTX (SRT, WebRTC) y ajustes del sistema.
🧪 Calidad, Verificación y Suite de Pruebas
- Suite ampliada con pruebas automatizadas completas cubriendo WebSockets, WHEP proxy,
-progress pipe:1, modelos Pydantic v2 y workflows de CI/CD. - Linters y formateador
ruffvalidados sin advertencias. - Preservación estricta del catálogo canónico de GitHub (32/32 [OK]).
RTMS v2.5.2 — Optimización de Latencia Extrema en SRT/UDP, Soporte UDP Unicast/Multicast, Códigos QR Offline y Aceleración de Arranque
RTMS v2.5.2 — Optimización de Latencia Extrema en SRT/UDP, Soporte UDP Unicast/Multicast, Códigos QR Offline y Aceleración de Arranque
(2026-09-22)
🚀 Optimización de Latencia Extrema en SRT y UDP (VLC Media Player, OBS)
- Modos UDP Unicast y Multicast:
- Soporte explícito para UDP Unicast (
udp_unicast, por defecto a127.0.0.1o IP destino específica) para enlaces directos locales, y UDP Multicast (udp_multicast, grupo239.255.0.X) para distribución en red de área local (LAN). - Formato MRL canónico para VLC:
udp://@<ip>:<port>sin parámetros de consulta query (?pkt_size), garantizando reconocimiento inmediato del analizador de red de VLC. - Comprobado en decodificación dummy en tiempo real de VLC con cero pérdida de paquetes y retardo inferior a 80 ms.
- Soporte explícito para UDP Unicast (
- Reducción Drástica de Retardo en SRT:
- Eliminado
smoother=liveen publicaciones caller hacia MediaMTX, suprimiendo esperas de pacing innecesarias en tráfico de loopback local. - Fijación de GOP a 1 segundo (
gop = fpsen modo zerolatency), asegurando llegada continua de paquetes IDR/SPS/PPS para enganche de reproducción instantáneo (<100 ms). - Parámetros de multiplexión MPEG-TS optimizados:
-pat_period 0.1 -pcr_period 20para sincronización ultrarrápida de reloj y demuxing.
- Eliminado
📱 Códigos QR Offline para Conexión Móvil en VLC
- Integración Autónoma sin Dependencias de Internet:
- Biblioteca
qrcode.min.jsempaquetada localmente (100% offline, sin llamadas externas a CDN). - Generación dinámica de código QR accesible con un clic desde las tarjetas de cámara y desde la vista de conexión universal OBS/VLC.
- Permite a cámaras de control, directores de escena y operadores en smartphones/tablets apuntar la cámara de su dispositivo y abrir el stream al instante en VLC Mobile (iOS/Android).
- Incluye botón de copiado directo al portapapeles y guía paso a paso de uso en VLC para móviles.
- Biblioteca
⚡ Arranque Instantáneo y Prevención de Diálogos UAC / Administrador
- Desbloqueo Automático de Binarios Windows:
- Función
unblock_app_binariespara eliminar flujos alternativos NTFS (Zone.Identifier) enffmpeg.exe,ffplay.exeymediamtx.exe.
- Función
- Reglas Asíncronas de Firewall de Windows:
- Creación y verificación de reglas para
mediamtx.exeejecutadas en segundo plano (asyncio.to_thread) sin bloquear la apertura de la ventana de WebView2 (<1 segundo).
- Creación y verificación de reglas para
- Temporizador Multimedia de Alta Precisión:
- Llamada a
timeBeginPeriod(1)en Windows para asegurar resolución de reloj de 1 ms en el planificador de hilos, reduciendo el jitter de streaming.
- Llamada a
- Prioridad de Proceso para FFmpeg:
- Asignación de
ABOVE_NORMAL_PRIORITY_CLASS(0x00008000) a los procesos de captura y codificación para evitar caídas de cuadros ante picos de uso del sistema.
- Asignación de
👁️ Monitores de Vista Previa Instantáneos y Confiables
- Inicialización de Latencia Cero:
- Parámetros
-probesize 100k -analyzeduration 500k -fflags nobuffer+flush_packets -flags low_delayen flujos MJPEG y visores FFplay, abriendo la previsualización en menos de 200 ms. - Detección y generación virtual (
lavfi testsrc2) para cámaras virtuales y estados inactivos, evitando excepciones en el demuxer DirectShow de Windows.
- Parámetros
🎨 Refinamiento Estético y Consistencia Visual
- Corrección del diseño y estilos en el campo de entrada de puerto MediaMTX en el modal de Ajustes Generales (
form-ctrl, fondo oscuro y borde unificado). - Realineación geométrica del encabezado y badge de estado en el modal de vista previa.
RTMS v2.5.1 — Compatibilidad de Reproducción SRT (VLC), Parches de Seguridad CodeQL y Sincronización en Memoria
RTMS v2.5.1 — Compatibilidad de Reproducción SRT (VLC), Parches de Seguridad CodeQL y Sincronización en Memoria
(2026-09-22)
🎬 Compatibilidad Total de Reproducción SRT (VLC Media Player, ffplay, OBS)
- Sintaxis Canónica RFC 3986:
- Inclusión de barra delimitadora (
/) antes de los parámetros query en las URLs SRT generadas (srt://IP:PORT/?streamid=read:{cam_id}). - Resuelve la incompatibilidad en VLC 3.0 donde el parser de red descartaba el
streamidal omitir la barra de ruta, impidiendo la reproducción.
- Inclusión de barra delimitadora (
- Normalización de Latencia y Prevención de Retardo:
- Eliminado el parámetro
latencyde la URL cliente. - Corrige el problema de bloqueo/buffering de 2 minutos (120 s) provocado por la discrepancia de unidades (microsegundos en FFmpeg vs milisegundos en el módulo
access_srtde VLC). - La latencia se negocia de forma óptima a nivel de servidor (120 ms por defecto).
- Eliminado el parámetro
- Contraseña SRT Limpia por Defecto:
- Las cámaras recién añadidas o detectadas se configuran sin contraseña (
srt_passphrase: ""), permitiendo la reproducción inmediata en clientes SRT estándar sin autenticación (ERROR:BADSECRET). - La protección criptográfica por contraseña se mantiene disponible de forma opcional mediante el modal de ajustes de cada cámara.
- Las cámaras recién añadidas o detectadas se configuran sin contraseña (
🛡️ Parches de Seguridad CodeQL (Alertas #11 y #12)
- Alerta #11 (CWE-116 - Incomplete string escaping or encoding):
- Corregido en
gui/static/app.js: se reemplazó la concatenación insegura de JavaScript en atributosonclickpor enlace declarativodata-device-path="${escapeHtml(dev.device_path)}"consumido de manera segura mediantethis.dataset.devicePath.
- Corregido en
- Alerta #12 (CWE-312 - Clear-text storage of sensitive information):
- Corregido en
core/mediamtx_mgr.py: se eliminó el almacenamiento en texto claro de contraseñas SRT en el archivoconfig/mediamtx.ymlen disco. - La configuración de rutas protegidas y contraseñas de lectura (
srtReadPassphrase) se gestiona ahora exclusivamente en memoria a través de la API REST local de MediaMTX (/v3/config/paths/addy/v3/config/paths/patch).
- Corregido en
⚡ Sincronización Dinámica de Rutas en MediaMTX
- Nuevos métodos asíncronos
sync_paths_api()ysync_path_api()para actualización en caliente de credenciales y rutas en el Media Server. - Sincronización automática invocada al iniciar MediaMTX, al actualizar o eliminar configuraciones de cámaras en la API REST y durante el ciclo de sincronización con hardware.
RTMS v2.5.0 — Core Media Server, Pipeline Desacoplado, Blindaje de Kernel y Persistencia ACID
RTMS v2.5.0 — Core Media Server, Pipeline Desacoplado, Blindaje de Kernel y Persistencia ACID
(2026-09-22)
🌐 Ingesta Desacoplada con MediaMTX (Opción A Estándar Broadcast)
- Media Server Local (
bin/mediamtx.exev1.9.3):- FFmpeg publica localmente de forma ininterrumpida como caller (
srt://127.0.0.1:8890?streamid=publish:{cam_id}&mode=caller). - MediaMTX expone el servicio en la red LAN a través de un puerto central SRT (por defecto
8890, configurable en Ajustes en los rangos recomendados8890-8990o9000-9200). - Formato universal de conexión para OBS Studio y vMix:
srt://{ip}:{mediamtx_port}?streamid=read:{cam_id}&latency={latency}. - Inmunidad Total ante Desconexiones de Clientes: Las aperturas, cierres o reconexiones de OBS Studio jamás detienen a FFmpeg ni causan reinicios de hardware ni parpadeos en las cámaras físicas.
- Múltiples receptores pueden conectarse a la misma cámara simultáneamente sin sobrecargar la CPU del emisor.
- FFmpeg publica localmente de forma ininterrumpida como caller (
🛡️ Blindaje de Procesos por Kernel (Win32 Job Objects)
- Cero Procesos Huérfanos (
core/job_object.py):- Implementación nativa con
kernel32.dlldel flagJOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE(0x2000). - Todas las instancias de FFmpeg, MediaMTX y visores FFplay quedan asociadas al Job Object de Windows.
- Si RTMS es cerrado o finalizado desde el Administrador de Tareas, el kernel de Windows liquida atómica e instantáneamente todos los procesos secundarios.
- Implementación nativa con
- Registro Centralizado de Tareas (
core/task_registry.py):- Supervisión, drenaje y cancelación limpia de corrutinas asíncronas en el shutdown.
💾 Persistencia Transaccional ACID (SQLite WAL)
- Capa de Repositorio (
core/repository/):- Reemplazo de JSON monolítico por base de datos SQLite en modo
WAL(Write-Ahead Logging) conbusy_timeout=5000y transacciones inmediatas. - Migración Automática Reversible: Detección transparente de
config.json, migración atómica aconfig/rtms.db, creación de copia de seguridad inmutableconfig.json.v2.4.1.baky réplica exportada sincronizada.
- Reemplazo de JSON monolítico por base de datos SQLite en modo
🔄 Papelera y Recuperación de Cámaras Eliminadas (Bugfix Hallazgo #20)
- Sección de Dispositivos Ocultados / Eliminados:
- Nuevos endpoints API:
GET /api/devices/ignored,POST /api/devices/unignore,POST /api/devices/unignore_all. - Nueva sección colapsable en la interfaz Web con contador badge y botón interactivo
🔄 Restaurar Cámaraindividual y masivo, devolviendo las cámaras a estadoSTOPPEDcon reasignación dinámica de puertos ante colisiones.
- Nuevos endpoints API:
🧪 Calidad, CI/CD y Gobernanza GitHub
- Suite completa de 139 pruebas automatizadas (100% aprobadas).
- Tipado estricto
mypyverificado encore/yapi/. - Linters y formato
ruffvalidados sin advertencias. - Catálogo canónico de GitHub preservado en 31/31 elementos raíz (
scripts/manage_descriptions.py --check). - Empaquetado portable con PyInstaller actualizado (
build_portable.bat) con inclusión demediamtx.exe,mediamtx.example.ymly soporte deaiosqlite. - Avisos de licencias de terceros actualizados con la licencia MIT de MediaMTX (
THIRD_PARTY_NOTICES.md).
RTMS v2.4.1 — Corrección de Detección de Dispositivos, Desconexión Hotplug y Control de Inicio
RTMS v2.4.1 — Corrección de Detección de Dispositivos, Desconexión Hotplug y Control de Inicio
(2026-09-22)
🎥 Corrección Forense de Detección DirectShow (Micrófonos vs Video)
- Aislamiento Estricto de Cámaras de Video (
core/hardware.py):- Detección precisa de salida moderna de FFmpeg 7.x+ mediante marcadores
(video),(audio),(none)y corchetes[in#. - Eliminado por completo el falso positivo reportado al desactivar la cámara de la laptop con la tecla rápida F5 o interruptor físico: en lugar de caer al parser heredado y capturar erróneamente los micrófonos del sistema, el sistema identifica correctamente 0 dispositivos de video y retorna
[]. - Filtro canónico por GUIDs de DirectShow: exclusión automática e incondicional de dispositivos bajo la categoría
KSCATEGORY_AUDIO(33D9A762-90C8-11D0-BD43-00A0C911CE86/4DF0A701-02CD-11CF-8356-0080C73DF13A) y rutas DirectShow con prefijo@device_cm_.
- Detección precisa de salida moderna de FFmpeg 7.x+ mediante marcadores
🔌 Manejo Reactivo de Desconexión Física (Hotplug)
- Transición Inmediata a
DISCONNECTED(core/stream_manager.py):- Al desenchufar una cámara USB o apagarla por hardware, los errores
ErrorCategory.DEVICEson interceptados al instante. El proceso de FFmpeg se detiene ordenadamente, pasando el stream aState.DISCONNECTEDsin penalizar contadores de error de software ni entrar en ciclos de reintentos innecesarios con backoff. - Detección de Congelamiento a 0 FPS: Watchdog optimizado que detecta streams activos sin entrega de cuadros por más de 8 segundos continuos. Si el hardware desapareció de DirectShow, se detiene el proceso y se marca
DISCONNECTED. - Reconexión Automática Limpia: Al volver a enchufar la cámara o reactivarla por teclado, el sistema limpia estados de falla anteriores y, si la cámara posee
auto_start = True, reanuda la transmisión automáticamente en menos de 5 segundos. - Sondeo Acelerado: Intervalo de sondeo periódico de hardware reducido a 5 segundos (anteriormente 20 segundos).
- Al desenchufar una cámara USB o apagarla por hardware, los errores
⚙️ Control de Inicio y Política de Carga Inicial
- Desactivación de Transmisión Masiva al Iniciar (
core/config_mgr.py):- Las cámaras recién descubiertas en el sistema se registran con
auto_start = Falsepor defecto. Al iniciar RTMS por primera vez, las cámaras permanecen en reposo (STOPPED), permitiendo al usuario decidir individualmente cuáles iniciar o activar para inicio automático. - Plantillas de configuración por defecto actualizadas con
unattended_autostart: false.
- Las cámaras recién descubiertas en el sistema se registran con
🧹 Limpieza de Ramas y Catálogo GitHub Oficial
- Eliminación de branches y worktrees temporales huérfanos. Rama
mainestablecida como única rama activa. - Catálogo oficial de 31 elementos raíz verificado y sincronizado al 100%.
RTMS v2.4.0 — Arquitectura Limpia, Descomposición Modular sin Fachadas, Tooling Determinista y Cierre de Fase 1
RTMS v2.4.0 — Arquitectura Limpia, Descomposición Modular sin Fachadas, Tooling Determinista y Cierre de Fase 1
(2026-09-22)
🏗️ Arquitectura Limpia y Descomposición Modular
- Eliminación Total de Monolitos:
core/ffmpeg_mgr.py(813 líneas) descompuesto y reemplazado en su totalidad por 4 módulos de responsabilidad única:stream_proc.py,command_builder.py,hardware_sync.pyystream_manager.py.api/routes.py(797 líneas) descompuesto y transformado en el paquete canónico de FastAPIapi/routes/(health.py,streams.py,preview.py,config.py,system.py,power.py) yapi/deps.py.
- Cero Fachadas Residuales: Prescindido de intermediarios y aliases artificiales. Los módulos se resuelven directamente sin capas superfluas ni wrappers.
🛡️ Erradicación Total de "Mock Drift" en Tests
- Actualización integral de la suite de pruebas automatizadas: cada test importa y mockea directamente el módulo real donde se ejecuta la lógica (
core.stream_proc,core.stream_manager,api.routes.preview,api.routes.streams,api.deps), eliminando cualquier falso positivo.
📦 Tooling Determinista y Catálogo Oficial
justfile: Recetas estándar de automatización de desarrollo (install,test,lint,format,build)..pre-commit-config.yaml: Hooks locales para validación de linters y formato con Ruff.uv.lock: Resolución determinista de dependencias del proyecto.- Catálogo Canónico GitHub: Dimensionamiento y preservación estricta de 31 elementos raíz oficiales sin truncamiento ni drift.
RTMS v2.3.0 — Seguridad Crítica, Gobernador Energético Win32 y Estandarización de Arquitectura
RTMS v2.3.0 — Seguridad Crítica, Gobernador Energético Win32 y Estandarización de Arquitectura
(2026-09-19)
🛡️ Seguridad Crítica y Protección de Sesión (Hotfixes P0)
- Corrección de Limpieza Asíncrona de Procesos (
core/process_cleanup.py):- Resuelto fallo P0-01 encapsulando
asyncio.gatherdentro de una corrutina real antes de llamar aasyncio.run_coroutine_threadsafe(), garantizando la terminación ordenada de los managers de streaming y preview sin excepciones de runtime.
- Resuelto fallo P0-01 encapsulando
- Filtro Estricto y Seguro de Terminación de Procesos (
core/process_cleanup.py):- Resuelto fallo P0-02 acotando la terminación forzada exclusivamente a subprocesos hijos de RTMS (
ppid == my_pid), binarios ubicados en el directoriobin/de RTMS o líneas de comando con marcartms. Protege instancias externas de FFmpeg utilizadas por otras aplicaciones en el sistema del usuario.
- Resuelto fallo P0-02 acotando la terminación forzada exclusivamente a subprocesos hijos de RTMS (
- Eliminación de Fuga de Tokens en Query Parameters (
api/routes.py):- Resuelto fallo P0-03 eliminando la aceptación de tokens en la URL (
?token=...), retornando código HTTP 403. Incorporadas cabecerasCache-Control: no-store, no-cache, must-revalidateyPragma: no-cacheen/api/stream/{device}/connect_url.
- Resuelto fallo P0-03 eliminando la aceptación de tokens en la URL (
- Autenticación por Cookie HttpOnly y Eliminación de Meta Tag (
main.pyygui/templates/index.html):- Resuelto fallo P0-04 eliminando
<meta name="rtms-token">del DOM y del contexto de plantilla. Emisión de cookie segurartms_sessioncon flagshttponly=True, samesite='lax'y configuración decredentials: 'same-origin'en todas las peticionesapiFetchde la interfaz web.
- Resuelto fallo P0-04 eliminando
- Corrección de Visualización y Revelado de Contraseña en URLs (
gui/static/app.js):- Las URLs de conexión mostradas en las tarjetas cargan inmediatamente la contraseña descifrada para streams activos e incorporan un botón conmutable para ocultar/mostrar la clave (icono 👁️ / 🔒), garantizando la copia exacta al portapapeles.
⚡ Gestión Energética Profesional y Nativa (Win32)
- Nuevo Módulo de Energía Nativo (
core/power_mgr.py):- Implementación de control energético mediante APIs Win32 nativas (
powrprof.dll,kernel32.dll) sin invocar scripts externos de PowerShell, eliminando alertas de antivirus y falsos positivos.
- Implementación de control energético mediante APIs Win32 nativas (
- Gobernador Dinámico de Energía (
DynamicPowerGovernor):- Elevación automática al plan de energía de Alto Rendimiento de Windows en cuanto inicia al menos una transmisión activa (
active_streams >= 1) y restauración inmediata y transparente del plan original al concluir todas las transmisiones (active_streams == 0).
- Elevación automática al plan de energía de Alto Rendimiento de Windows en cuanto inicia al menos una transmisión activa (
- Prevención Nativa de Suspensión de Pantalla y Equipo:
- Activación continua de
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED) durante la operación activa.
- Activación continua de
- Optimización de Adaptadores de Red Vía Registro:
- Desactivación de ahorro de energía (
PnPCapabilities = 24) mediante manipulación directa en el registro conwinregy verificación de privilegiosis_admin().
- Desactivación de ahorro de energía (
- Rollback Atómico y Persistencia:
- Creación de respaldo seguro en
config/power_backup.jsoncon restauración garantizada de directivas originales al cerrar o solicitar la restauración.
- Creación de respaldo seguro en
🔄 Ruptura Limpia de Retrocompatibilidad (< 2.3.0)
- Esquema de Configuración v4 (
core/config_mgr.py):- Actualizado a
CURRENT_SCHEMA_VERSION = 4y purgadas todas las rutinas de migración heredadas v1 y v2. - Detección automática de versiones de configuración previas (< 4) con respaldo seguro en
config/config.json.legacy_v2_baky reinicialización limpia a valores por defecto para v2.3.0. - Eliminado el script obsoleto
run_silent.vbsy actualizadas las referencias de arranque en el proyecto.
- Actualizado a
🛠️ Estandarización de Arquitectura y Herramientas (PEP 621)
- Modernización de pyproject.toml:
- Configuración del sistema de empaquetado estándar
hatchlingcon metadatos PEP 621. - Incorporadas reglas de linting y formato estrictas con Ruff (
line-length = 120, reglasE,F,W,I,B), tipado con Mypy y configuración de Pytest. - 100% de la base de código formateada y alineada con estándares modernos de Python.
- Configuración del sistema de empaquetado estándar
RTMS v2.2.6 — Corrección Crítica de Conexión SRT, Optimización UDP 1080p60 y Suite de Diagnóstico FFmpeg
RTMS v2.2.6 — Corrección Crítica de Conexión SRT, Optimización UDP 1080p60 y Suite de Diagnóstico FFmpeg
(2026-09-17)
🛠️ Corrección Crítica de Entablado de Conexión SRT y Copia de URL
- Resolución de Rechazo por Contraseña Faltante (
ERROR:UNSECURE):- RTMS genera passphrases criptográficas seguras al registrar cámaras, pero la interfaz web copiaba la URL
srt://IP:port?mode=caller...omitiendo el parámetro&passphrase=.... Sockets externos como OBS Studio o vMix eran rechazados inmediatamente conERROR:UNSECURE (Password required or unexpected). - Se implementó el endpoint protegido
GET /api/stream/{device_path}/connect_urlenapi/routes.pyque calcula y devuelve la URL completa y funcional con su passphrase configurada y codificación URL segura. - Se actualizó
gui/static/app.js(copyUrlByIndex) para consultar este endpoint al pulsar "Copiar URL", copiando al portapapeles la dirección exacta y garantizando la conexión al 100%.
- RTMS genera passphrases criptográficas seguras al registrar cámaras, pero la interfaz web copiaba la URL
- Resiliencia del Listener SRT ante Desconexiones de Clientes:
- En
core/ffmpeg_mgr.py, el Watchdog detecta cuando FFmpeg finaliza tras la desconexión normal de un cliente receptor (-5 I/O error) y reinicia el proceso listener de inmediato con penalización cero y sin retardos de backoff, dejando el socket disponible para reconexión instantánea.
- En
🚀 Optimización y Estabilidad Continua de Streaming UDP a 1080p @ 60 FPS
- Ampliación de Buffer de Socket de Red a 4 MB:
- El buffer de socket UDP en
core/ffmpeg_mgr.py(build_multicast_url) se incrementó de 64 KB (buffer_size=65535) a 4 MB (buffer_size=4194304&overrun_nonfatal=1&fifo_size=50000000). Esto elimina la saturación de socket en Windows a altas tasas de bits (6–12 Mbps) y erradica por completo la pérdida de paquetes y tirones de framerate.
- El buffer de socket UDP en
- Inyección Forzada de Cabeceras SPS/PPS (
repeat-headersydump_extra):- Se añadieron los parámetros
-x264-params repeat-headers=1(para CPUlibx264) y-forced-idr 1(para GPUh264_nvenc), combinados con el bitstream filter-bsf:v dump_extrapara MPEG-TS. Receptores que conectan con la transmisión ya iniciada reciben de inmediato los parámetros de secuencia sin arrojar erroresnon-existing PPS 0 referenced.
- Se añadieron los parámetros
- Soporte Nativo de Fuentes de Cámara Virtual (
virtual:///testsrc):core/ffmpeg_mgr.pyahora admite cámaras virtualesvirtual://que generan patrones sintéticostestsrc2en tiempo real, permitiendo transmitir y verificar 1080p60 continuo en hardware de test o sin cámara física 60fps.
🔬 Suite Integral de Diagnóstico, Digestión de Video y Pruebas en Vivo
- Motor de Análisis y Digestión en Tiempo Real (
core/ffmpeg_tester.py):VideoReceiverDigest: Receptor y analizador de flujos en vivo que decodifica flujos SRT y UDP con-progress pipe:1, calculando FPS decodificados reales, bitrate instantáneo, estabilidad de jitter, frames descartados y errores de bitstream H.264.VirtualCameraSource: Generador de video sintético calibrado con patronestestsrc2, barras SMPTE y reloj OSD con microsegundos a cualquier resolución y framerate.FFmpegDiagnosticSuite: Orquestador de pruebas locales que valida binarios, códecs de hardware (NVENC/x264), dispositivos DirectShow y entablado de conexiones en bucle local (loopback).
- Herramienta CLI de Consola (
scripts/test_ffmpeg_pipeline.py):- CLI interactivo y automatizado con soporte nativo UTF-8 en consolas Windows, banderas de diagnóstico (
--all,--srt,--udp,--bench,--camera,--virtual-cam).
- CLI interactivo y automatizado con soporte nativo UTF-8 en consolas Windows, banderas de diagnóstico (
- Tests Automatizados de Integración (
tests/test_ffmpeg_live.py):- 5 tests de integración en vivo añadidos a la suite oficial de Pytest, elevando la cobertura a 113 tests unitarios y de integración pasando al 100%.
RTMS v2.2.5 — Desbloqueo Mark-of-the-Web, Ventana Nativa WebView2 y System Tray de Cero Latencia
RTMS v2.2.5 — Desbloqueo Mark-of-the-Web, Ventana Nativa WebView2 y System Tray de Cero Latencia
(2026-09-16)
🚀 Desbloqueo Automático Mark-of-the-Web y Ejecución Nativa Garantizada
- Eliminación Automática de Flujos NTFS Zone.Identifier (
unblock_app_binaries):- En Windows, descargar archivos zip de releases desde la web adjunta automáticamente la marca de seguridad
Zone.Identifier(ZoneId=3). Esto causaba que la capa de interoperabilidad unmanaged de .NET Framework bloquearaPython.Runtime.dllarrojandoFailed to resolve Python.Runtime.Loader.Initializey obligando a la aplicación a abrirse en Google Chrome. - Se implementó el desmarque nativo Win32 en
core/system_env.pyque recorre y desbloquea en milisegundos todos los binarios y bibliotecas de la aplicación al arrancar.
- En Windows, descargar archivos zip de releases desde la web adjunta automáticamente la marca de seguridad
- Configuración de Runtime CLR (
rtms.exe.config):- Se añade el manifiesto de configuración
rtms.exe.configautorizando explícitamente la carga de ensamblados remotos (<loadFromRemoteSources enabled="true"/>) y vinculando el runtime .NET 4.6.2+.
- Se añade el manifiesto de configuración
- Empaquetado Completo de
clr_loader:- En
build_portable.bat, se añade--collect-all=clr_loadery los módulos ffi nativos para empaquetarClrLoader.dlljunto artms.exe.
- En
⚡ System Tray con Despacho Asíncrono y Cero Latencia
- Desacoplamiento Total de la Bomba de Mensajes Win32:
- Todas las acciones del menú contextual en
core/tray_icon.py(Mostrar RTMS,Detener todas las transmisiones,Finalizar todos los procesos,Acerca de RTMS,Salir de RTMS) ahora se ejecutan de forma estrictamente asíncrona en hilos de trabajo independientes (daemon=True). - La bomba de mensajes Win32 de
pystraynunca se bloquea, garantizando que el menú contextual se despliegue instantáneamente (<1 ms) y siempre en la posición exacta del cursor.
- Todas las acciones del menú contextual en
- Control de Sincronización de Ventana (
_main_window_ready):- Se implementa una bandera de inicialización en
main.pypara sincronizar el estado del motor gráfico antes de interactuar con la ventana nativa. - Se erradican los retardos y congelamientos de 10 a 20 segundos (
events.shown.wait(10)) que ocurrían al restaurar o consultar el modal Acerca de en estados transitorios o tras errores gráficos.
- Se implementa una bandera de inicialización en