¿Por qué medir la latencia de tu streaming? Porque "me parece bien" no alcanza
La mayoría de los operadores de streaming no miden su latencia de forma sistemática. Hacen el "test del ojo": abren el stream en otro dispositivo, hablan frente a la cámara y estiman cuántos segundos tarda en llegar. Eso es mejor que nada, pero tiene problemas serios:
- ⚠️ No es reproducible: La latencia varía por ubicación, hora del día y carga del servidor
- ⚠️ No captura picos: Tu stream puede tener 3s de latencia en promedio pero picos de 15s cada hora
- ⚠️ No identifica la causa: ¿El delay es del encoder, del CDN o del player? Sin medición por etapa, no lo sabes
La latencia es un indicador de rendimiento (KPI) que debe medirse, monitorearse y optimizarse — igual que el bitrate, el uptime o los viewers concurrentes. Aquí te enseñamos cómo hacerlo de verdad.
Las métricas que importan
| Métrica | Qué mide | Valor típico | Alerta si supera |
|---|---|---|---|
| Glass-to-glass latency | Cámara a pantalla del espectador (total) | 3-30s (HLS), <2s (WebRTC) | Depende del SLA |
| Encoder latency | Captura a salida del encoder | 50ms - 2s | >3s |
| Ingest latency | Encoder a media server | 100ms - 1s | >2s |
| Processing latency | Media server (transcoding) | 50ms - 500ms | >1s |
| CDN latency | Media server a edge | 100ms - 3s | >5s |
| Player buffer | Buffer en el reproductor | 1-6s (HLS), 0-500ms (WebRTC) | >10s |
| Time to first frame (TTFF) | Click "play" a primer frame visible | 1-5s | >8s |
📏 Glass-to-glass es la métrica gold standard: desde que algo ocurre frente a la cámara hasta que el espectador lo ve en su pantalla. Es la suma de TODAS las latencias del pipeline. Si solo puedes medir una cosa, mide esta.
Cómo medir la latencia glass-to-glass de forma precisa
Método 1: Reloj en cámara (simple y efectivo)
- Abre una página web que muestre un reloj con milisegundos (ejemplo:
time.iso una app de cronómetro) - Apunta tu cámara al reloj en la pantalla
- Abre tu stream en otro dispositivo (celular, laptop)
- Toma una foto que capture AMBAS pantallas: el reloj real y el reloj en el stream
- La diferencia entre ambos tiempos = latencia glass-to-glass
Limitación: Solo mide un punto en el tiempo, no la variación a lo largo de horas.
Método 2: Timestamps programáticos (para desarrolladores)
- Inyecta un timestamp UTC en cada frame del video usando un overlay en OBS (funciona con plugin "datetime")
- En el reproductor, lee el timestamp del frame actual
- Compara con
Date.now()del navegador - La diferencia = latencia aproximada (requiere que ambos relojes estén sincronizados via NTP)
Método 3: APIs del reproductor
Algunos reproductores avanzados exponen métricas de latencia directamente:
| Reproductor | API de latencia | Qué reporta |
|---|---|---|
| HLS.js | hls.latency | Diferencia entre live edge y posición actual |
| Video.js + HLS | player.liveTracker.seekableEnd() - currentTime() | Buffer latency del player |
| DASH.js | player.getCurrentLiveLatency() | Latencia total estimada |
| WebRTC nativo | RTCPeerConnection.getStats() | Round trip time, jitter, packet loss |
⚠️ Importante: Las APIs de los reproductores miden la latencia DESDE EL SERVIDOR al reproductor, no la latencia total glass-to-glass. Para la latencia completa, necesitas incluir la latencia del encoder y la ingesta — que requiere medición separada.
Herramientas de monitoreo de latencia en tiempo real
Para monitorear la latencia de forma continua (no solo "de vez en cuando"), existen herramientas especializadas:
Herramientas gratuitas
| Herramienta | Qué mide | Cómo usarla |
|---|---|---|
| OBS Stats (F12) | Dropped frames, bitrate de salida, CPU/GPU | Indica problemas del encoder |
| HLS Analyzer (Mux) | Segmentos HLS, playlist latency | Analiza un stream HLS existente |
| FFprobe | Propiedades del stream, codec info | ffprobe -v quiet -print_format json tu_stream.m3u8 |
| Chrome DevTools (Network tab) | Timing de descarga de segmentos HLS | Filtrar por .ts o .m4s y ver latencia de cada descarga |
| WebRTC Internals | Stats detalladas de conexión WebRTC | chrome://webrtc-internals |
Herramientas comerciales
| Herramienta | Funcionalidad | Precio |
|---|---|---|
| Mux Data | Analytics de video completo: latency, rebuffering, TTFF, QoE score | Desde $0 (freemium) |
| NPAW (Nice People at Work) | Video analytics enterprise con latencia por CDN, device, ISP | Enterprise |
| Conviva | Real-time video intelligence, comparación contra benchmarks | Enterprise |
| Datadog APM | Monitoreo de infraestructura + custom metrics de video | Desde $15/host/mes |
Configurar alertas: los umbrales que importan
- 🟢 Normal: Latencia glass-to-glass dentro del SLA (ej: <5s para HLS, <2s para WebRTC)
- 🟡 Warning: Latencia 50% sobre el SLA (ej: 7.5s para HLS con SLA de 5s)
- 🔴 Crítico: Latencia 100%+ sobre el SLA o picos de >30s. Investigar de inmediato
Diagnóstico: dónde se está generando el delay
Cuando detectas latencia alta, el siguiente paso es identificar EN QUÉ ETAPA se produce. Aquí está el diagrama de diagnóstico:
Árbol de diagnóstico
¿Latencia alta? (>SLA)
│
├── ¿OBS muestra "Dropped frames"?
│ └── SÍ → Problema de encoder o upload
│ ├── CPU >80%? → Bajar preset o resolución
│ ├── Upload saturado? → Bajar bitrate
│ └── WiFi? → Cambiar a Ethernet
│
├── ¿OBS OK pero stream retrasado?
│ └── Problema en servidor o CDN
│ ├── ¿Server CPU alto? → Optimizar transcoding
│ ├── ¿CDN cache stale? → Verificar TTL y purge
│ └── ¿Segmentos HLS grandes? → Reducir a 2s
│
└── ¿Server OK pero viewer retrasado?
└── Problema en reproductor o red del viewer
├── ¿Buffer grande? → Reducir live back buffer
├── ¿Player no soporta LL-HLS? → Actualizar HLS.js
└── ¿Red del viewer lenta? → ABR debería adaptar
Causas más comunes de latencia excesiva
| Causa | Latencia que agrega | Solución |
|---|---|---|
| Segmentos HLS de 6-10s | 6-10s directos | Reducir a 2s o usar LL-HLS |
| Keyframe interval alto (4-8s) | 4-8s | Reducir a 1-2s |
| x264 preset "slow" o "medium" | 1-3s | Usar "veryfast" o "ultrafast" |
| B-frames activados | 200-500ms | Desactivar para ultra baja latencia |
| CDN cache agresivo | 5-15s | Reducir TTL de manifiestos HLS |
| Player con buffer alto | 3-10s | Configurar liveSyncDuration bajo en HLS.js |
Cheat sheet de optimización por protocolo
HLS estándar → latencia objetivo: 6-15 segundos
- Segmentos de 2 segundos (no 6 ni 10)
- Keyframe interval = 2 segundos
- 3 segmentos en playlist (no 5)
- CDN TTL del manifiesto = 1 segundo
LL-HLS → latencia objetivo: 2-5 segundos
- Partial segments de 200ms habilitados
- Blocking playlist reload activo
- HLS.js con
liveSyncDuration: 3 - CDN que soporte chunked transfer encoding
- Keyframe interval = 1 segundo
WebRTC (WHIP/WHEP) → latencia objetivo: 0.3-1.5 segundos
- Codec: H.264 Baseline o VP8 (menor latencia de encoding)
- B-frames: 0
- Keyframe interval: 1 segundo
- Bitrate: CBR preferido sobre VBR (más predecible)
- Audio: Opus (menor latencia que AAC)
- SFU en lugar de MCU (menos procesamiento)
SRT ingesta → latencia de contribución objetivo: 100-500ms
- Parámetro
latency: empezar en 300000 (300ms), subir si hay pérdida de paquetes - Modo Caller desde OBS (no Listener)
- Puerto dedicado (no compartido)
- Encrypt con AES-256 si el contenido es premium
📊 Panel de estadísticas de XtreamCast: XtreamCast ofrece métricas en tiempo real de viewers, bitrate y calidad por cada canal. Con el addon de Ultra Baja Latencia, también reportamos la latencia WebRTC por sesión del espectador, permitiéndote optimizar continuamente.
¿Quieres optimizar la latencia de tu streaming?
XtreamCast te da métricas en tiempo real y ultra baja latencia WebRTC por $15 USD/mes. Mide, monitorea y optimiza con datos reales.