Videollamadas y streaming en tiempo real con WebRTC y SDKs

  • WebRTC ofrece audio, vídeo y datos en tiempo real con latencias muy bajas usando getUserMedia, RTCPeerConnection y RTCDataChannel.
  • Para funcionar en el mundo real necesita señalización, STUN/TURN e ICE, y escalar suele requerir SFUs o media servers.
  • SDKs como Agora, Twilio o ZEGOCLOUD simplifican la infraestructura a costa de coste recurrente y dependencia de proveedor.
  • Un side project puede empezar con un SDK y evolucionar hacia una infraestructura WebRTC propia cuando el producto madure.

Videollamadas y streaming en tiempo real con WebRTC y SDKs

Si estás montando un side project en JavaScript y necesitas videollamadas, es normal que te entren dudas: ¿tiro de WebRTC puro, uso un SDK como Agora, Twilio, Mux o ZEGOCLOUD, o me lío la manta a la cabeza con RN-WebRTC en React Native? La mala noticia es que no hay una única receta. La buena es que entiendes tiempo real en JS y eso te coloca en una posición ideal para tomar una decisión informada y no “cagarla” con la arquitectura.

En las siguientes líneas vas a ver, paso a paso, cómo funciona WebRTC por dentro, qué papel juega Agora (y otros proveedores similares), qué implica montar tu propia infraestructura (STUN/TURN, señalización, SFU, media servers…), y qué trade-offs reales hay entre coste, complejidad y escalabilidad para videollamadas y streaming en tiempo real.

¿Qué es WebRTC y por qué es la base de todo?

WebRTC (Web Real-Time Communication) es un conjunto de estándares, APIs y protocolos de código abierto que permiten audio, vídeo y datos en tiempo real directamente desde el navegador o una app nativa, sin plugins ni aplicaciones externas. Está estandarizado por W3C e IETF y lo soportan todos los navegadores modernos: Chrome, Firefox, Safari, Edge, Opera y muchos navegadores móviles.

Su filosofía es clara: habilitar comunicación punto a punto (P2P) entre usuarios con latencias muy bajas, gestionando por debajo todos los temas incómodos de redes, códecs, jitter, eco, pérdida de paquetes, cifrado, etc. Eso incluye desde una videollamada uno a uno hasta un sistema de streaming interactivo con cientos o miles de espectadores si lo combinas con la infraestructura adecuada.

app llamadas
Artículo relacionado:
Cómo usar y crear una app de llamadas en Android: Guía definitiva para usuarios y desarrolladores

APIs clave de WebRTC: getUserMedia, RTCPeerConnection y RTCDataChannel

WebRTC se apoya en tres APIs principales del lado del navegador que vas a usar sí o sí, tanto si montas tu solución propia como si usas un SDK tipo Agora:

  • MediaStream / getUserMedia: para capturar vídeo y audio (cámara, micrófono, e incluso pantalla o pestañas).
  • RTCPeerConnection: para negociar y transportar flujos de audio y vídeo entre pares.
  • RTCDataChannel: para enviar datos arbitrarios (texto, binario, archivos) con baja latencia entre clientes.

Con getUserMedia puedes pedir al navegador acceso a cámara y micro y recibir un MediaStream que luego asocias a un elemento <video> con video.srcObject = stream. Puedes aplicar restricciones (resolución, framerate, cámara frontal/trasera, etc.) y, si no se cumplen, obtendrás errores del tipo OverconstrainedError, que debes manejar para ofrecer alternativas (por ejemplo bajar de 1080p a 720p y aplicar ajustes para mejorar el audio del micrófono).

La API de RTCPeerConnection es el corazón de las llamadas: se encarga de la negociación SDP (oferta/respuesta), la recopilación de candidatos ICE (STUN/TURN), el establecimiento de la conexión y la transmisión segura mediante SRTP. Desde tu código solo creas la conexión, añades las pistas de media, reaccionas a eventos como onicecandidate u ontrack y te ocupas de la señalización.

Por último, RTCDataChannel te permite montar canales de datos similares a un WebSocket, pero punto a punto y con control fino de fiabilidad y orden. Es útil para chat integrado en la videollamada, intercambio de archivos, sincronización de estado en juegos o colaboración en tiempo real. La sintaxis es familiar: dataChannel.send() y onmessage en el receptor.

Señalización: el “pegamento” que WebRTC no define

Un malentendido típico: WebRTC no incluye la señalización. RTCPeerConnection necesita intercambiar información, pero no impone cómo. Eso te toca definirlo a ti o te lo abstrae un SDK de terceros.

Mediante señalización los pares se envían:

  • Mensajes de control de sesión: iniciar llamada, colgar, errores.
  • Información de red: candidatos ICE (direcciones IP/puertos descubiertos).
  • Metadatos de medios: ofertas y respuestas SDP con códecs, resoluciones, etc.

Esa señalización suele implementarse con WebSockets, Socket.IO, HTTP (polling/long-polling), MQTT u otros mecanismos bidireccionales. Un patrón muy típico es un servidor Node.js con Socket.IO que gestiona “salas” y reenvía mensajes tipo texto/JSON entre clientes:

Servidor: recibe create or join, crea una sala si no existe, admite hasta dos clientes (para una videollamada básica) y reenvía mensajes message a los demás sockets de la sala. Tú te encargas de no superar el número máximo de usuarios o de diseñar tu propia lógica de rooms.

Cliente: al cargar la página, pide un nombre de sala (o lo infiere de la URL), emite create or join, escucha eventos como created, joined, full, ready y se pone de acuerdo con el otro extremo para arrancar o rechazar la llamada.

Este patrón es perfecto para un prototipo o side project: te da un servidor ligero de señalización que puedes escalar con clusters y balanceadores si lo necesitas.

STUN, TURN, ICE: atravesar NATs y firewalls sin volverte loco

En un mundo ideal, dos usuarios estarían siempre en redes accesibles y se conectarían directamente. En el mundo real hay NATs, firewalls, CGNAT del ISP y redes corporativas paranoicas. Aquí entra en juego ICE, que combina STUN y TURN.

  • STUN (Session Traversal Utilities for NAT) permite que un cliente averigüe su IP y puerto públicos. El servidor STUN solo responde con esa información.
  • TURN (Traversal Using Relays around NAT) actúa como servidor de retransmisión de medios cuando no hay forma de abrir un canal directo P2P. El tráfico de audio/vídeo pasa por él, así que consume ancho de banda de servidor y dinero.
  • ICE (Interactive Connectivity Establishment) se encarga de probar todos los candidatos posibles (direcciones locales, reflejadas por STUN, relays TURN) hasta encontrar una ruta viable.

En la práctica, en tu objeto de configuración de RTCPeerConnection añades un array de iceServers con URIs STUN/TURN, y el navegador se encarga de la magia. Si montas tu propio infra, tendrás que desplegar y mantener tus servers STUN/TURN; si usas un SDK como Agora, Twilio o ZEGOCLOUD, ellos ya tienen esto resuelto y listo para producción.

Streaming en tiempo real de baja latencia: WebRTC vs HLS/DASH

Videollamadas y streaming en tiempo real con WebRTC y SDKs

Cuando hablamos de streaming en directo hay dos mundos bien diferenciados: protocolos basados en HTTP (HLS, DASH) y WebRTC. HLS/DASH funcionan a base de segmentos de vídeo que el cliente va descargando y reproduciendo; eso es perfecto para escalabilidad vía CDN, pero introduce latencias de varios segundos (5-30 s fácilmente).

WebRTC, en cambio, usa UDP + RTP y entrega el vídeo en modo “empuje” desde el origen al reproductor, con tiempos de inicio muy cortos y latencias típicas por debajo de 500 ms (a menudo ~250 ms) si la red acompaña. Lo consigue gracias a:

  • Control de congestión integrado, que ajusta bitrate y resolución en tiempo real según pérdida de paquetes, jitter o RTT.
  • Uso de códecs eficientes (VP8, VP9, H.264; cada vez más AV1) con aceleración hardware cuando está disponible.
  • Posibilidad de usar SVC (Scalable Video Coding) para que el receptor reciba solo las capas que puede soportar su red/dispositivo.

Por eso WebRTC es la opción natural para subastas en tiempo real, apuestas deportivas live, trading, gaming interactivo, soporte remoto, telemedicina, aulas virtuales participativas o dashboards financieros que no pueden permitirse varios segundos de retraso.

El problema es que WebRTC puro P2P no escala bien a miles de espectadores; para eso necesitas SFUs, media servers o plataformas híbridas, que es justo donde entran soluciones como Flussonic, Agora o similares.

Escalar más allá del P2P: SFU, media servers y arquitecturas híbridas

En una videollamada tú a tú, WebRTC se comporta de lujo. Pero si empiezas a meter 10, 20 o 100 usuarios, la cosa cambia: cada cliente tiene que enviar/recibir múltiples flujos, su CPU se calienta y la red se viene abajo. Aquí aparecen tres patrones clásicos:

  • MCU (Multipoint Control Unit): el servidor recibe todos los flujos, los mezcla y envía uno solo a cada cliente. Ventaja: poco consumo en el cliente. Inconvenientes: carga brutal en servidor, menos control individual de calidad.
  • SFU (Selective Forwarding Unit): el servidor recibe flujos y los reenvía selectivamente, sin mezclar. Cada espectador recibe los streams que necesita, posiblemente en distintas calidades. Es el patrón más usado hoy para videoconferencias multiusuario y streaming interactivo escalable.
  • Arquitecturas híbridas WebRTC + HLS/DASH: WebRTC se usa para la ingesta y la interacción, mientras que HLS/DASH distribuye a grandes audiencias que no necesitan interacción en tiempo real. Es un equilibrio entre latencia ultra baja para los “actores” y escalabilidad masiva para “espectadores”.

Media servers como Flussonic u otros proporcionan el backend necesario: reciben el flujo WebRTC, lo transcodifican si hace falta, reenvían mediante WebRTC a otros clientes o lo convierten a protocolos tipo HLS para distribución masiva. Este tipo de infraestructura es lo que, en la práctica, hace que sea viable ir más allá de las llamadas uno a uno sin tener que reinventar toda la rueda.

Casos de uso típicos: videollamadas, streaming, IoT y mucho más

WebRTC se ha vuelto omnipresente y probablemente lo uses cada día sin darte cuenta. Algunos ejemplos donde encaja especialmente bien son las videollamadas y videoconferencias:

  • Videollamadas y videoconferencias: Google Meet, Jitsi, Slack, Microsoft Teams y muchas otras herramientas se apoyan en WebRTC (en parte o totalmente) para el vídeo, audio y compartir pantalla.
  • Servicios de streaming en tiempo real: plataformas tipo Twitch, Meta Live, Vimeo Livestream o herramientas como Streamyard combinan WebRTC para la ingesta y otras tecnologías para distribución masiva.
  • Chat y mensajería con intercambio de archivos: gracias a RTCDataChannel puedes tener chat en tiempo real, envío de ficheros, sincronización de estado, etc., sin servidores centrales de media.
  • Gaming en la nube y multijugador: servicios como GeForce NOW o Xbox Cloud Gaming aprovechan tecnologías similares para video interactivo; muchos juegos P2P utilizan WebRTC para sincronizar partidas.
  • IoT y vigilancia: cámaras inteligentes, monitores de bebé, timbres con vídeo o drones pueden enviar vídeo en tiempo real a móviles y navegadores usando WebRTC.
  • Educación y telemedicina: aulas virtuales con pizarras, cuestionarios y vídeo bidireccional, o consultas médicas online donde la latencia y la seguridad son cruciales.

Seguridad en WebRTC: cifrado, permisos y buenas prácticas

La seguridad en WebRTC no es un extra: está integrada desde el diseño. Todos los componentes de media van cifrados y las APIs solo funcionan desde orígenes seguros (HTTPS o localhost), aunque conviene estar alerta ante estafas mediante videollamadas.

  • DTLS (Datagram Transport Layer Security) cifra los datos en tránsito.
  • SRTP (Secure Real-time Transport Protocol) protege audio y vídeo para que no se puedan manipular o interceptar fácilmente.
  • El acceso a cámara y micrófono requiere permiso explícito del usuario, con indicadores visuales visibles (iconos, puntos de color, etc.).
  • Al no haber plugins que instalar, se reduce el riesgo de software malicioso camuflado en extensiones o binarios de terceros.

Aun así, tienes que cuidar tu propia capa: usar HTTPS en todo, revisar los permisos que pides, mantener navegadores y librerías actualizadas, y no descuidar la seguridad de tu servidor de señalización o de tus APIs REST.

WebRTC vs otras tecnologías: VoIP, WebSockets y plataformas propietarias

Si vienes del mundo VoIP clásico, te sonarán SIP, PBX, softphones y servidores caros. WebRTC cambia el paradigma: no necesitas requerir al usuario ningún cliente de escritorio ni un hardware específico, basta el navegador y un servidor de señalización relativamente sencillo.

Frente a VoIP tradicional, WebRTC reduce el peso en infraestructura central y abre la puerta a aplicaciones directamente integradas en la web. En muchos casos puedes reutilizar tu backend SIP a través de pasarelas que traduzcan señalización a WebRTC.

Respecto a WebSockets, hay que verlos más como complementarios: son ideales para notificaciones, chat ligero o cambios de estado, pero no para media intensivo. WebRTC está optimizado para audio/vídeo en tiempo real, con control de congestión, códecs, jitter buffer, etc. En la práctica, muchos proyectos usan WebSockets para la señalización y WebRTC para el transporte de medios.

Si los comparas con plataformas tipo Zoom, GoToMeeting o WebEx, la diferencia es de modelo: esas herramientas son soluciones cerradas, muchas veces con apps de escritorio obligatorias y backend propietario. WebRTC, en cambio, es una tecnología base; sobre ella puedes construir tu propia “mini-Meet” o integrarte con servicios que ya la usan (como hace Google Meet o Microsoft Teams).

Desarrollar con WebRTC: complejidad real y trampas habituales

Aunque las APIs parecen sencillas sobre el papel, implementar WebRTC desde cero tiene su miga. Tendrás que lidiar con:

cómo usar Tor Browser para entrar en la deep web
Artículo relacionado:
Tor Browser para Android: configuración avanzada y uso seguro
  • Señalización a medida: diseñar mensajes, rooms, gestión de reconexiones, reintentos, errores.
  • Gestión de ICE/STUN/TURN: desplegar servidores, monitorizar uso de TURN (que consume ancho de banda), ajustar timeouts.
  • Calidad de servicio (QoS): adaptar bitrates, manejar redes inestables, negociar códecs, detectar cuando una conexión se degrada y reaccionar.
  • Escalado: pasar de un simple P2P a grupos, luego a cientos de usuarios, introducir SFUs o media servers sin romper el diseño original.
  • Compatibilidad entre navegadores: aunque la situación es buena, seguirás encontrando matices. Usar adapter.js sigue siendo muy recomendable.

En un side project pequeño, montar un servidor Node con Socket.IO y un STUN público puede ser suficiente para llamadas 1:1 o grupos muy reducidos. Pero si tu idea crece y necesitas mucha concurrencia, control de calidad fino, grabaciones, análisis, transcripciones o monetización, pronto tendrás que plantearte o bien incorporar un media server propio, o pasarte a un proveedor especializado.

CDN en tiempo real con SDKs: Agora, Twilio, Mux, ZEGOCLOUD…

Servicios como Agora, Twilio, Mux, ZEGOCLOUD o similares construyen encima de WebRTC una capa de valor que te ahorra meses de trabajo e infinidad de dolores de cabeza:

  • Te ofrecen una red global de media con SFUs repartidos por el mundo, optimizados para baja latencia.
  • Abstraen STUN/TURN, señalización, reintentos, reconexiones y gestión de red complicada.
  • Incluyen SDKs bien mantenidos para web, iOS, Android, React Native y otros frameworks.
  • Aportan extras como grabación, broadcasting a RTMP/HLS, moderación, estadísticas en tiempo real, controles de calidad, roles de usuario (host, audience, speaker), etc.

El coste, como ya sospechas, es el principal problema: a poco que tengas muchos minutos de vídeo o bastantes usuarios concurrentes, la factura se dispara. Además, te vuelves dependiente de su plataforma y de sus cambios de precio o de API.

En tu situación concreta, con experiencia fuerte en JS en tiempo real, una opción bastante sensata es empezar con un SDK para acelerar el desarrollo, validar el producto y aprender de su modelo de rooms, roles, ciclo de vida de streams y gestión de estado. Más adelante, si el proyecto despega y el coste se convierte en un problema, puedes migrar gradualmente partes de la solución a una infraestructura WebRTC propia o apoyarte en un media server tipo Flussonic para controlar la capa de distribución.

Buenas prácticas y herramientas para depurar WebRTC

Para que no te pierdas en la caja negra de WebRTC, conviene que te apoyes en las herramientas que ya existen en los navegadores y en el ecosistema:

  • chrome://webrtc-internals (o about:webrtc en Firefox): panel con estadísticas detalladas de conexiones, bitrates, pérdida de paquetes, codecs activos, etc.
  • adapter.js: shim mantenido por la comunidad que suaviza diferencias entre navegadores y versiones.
  • test.webrtc.org: para comprobar cámara, micro, red y compatibilidad general en una máquina.
  • Samples oficiales en webrtc.github.io/samples: ejemplos de constraints, peer connections, data channels, screen sharing… muy útil para copiar patrones.

También es buena idea estructurar el código separando claramente la capa de señalización (sockets, rooms, mensajes) de la capa de WebRTC puro (creación de conexiones, gestión de streams, handlers de eventos). Así podrás sustituir un backend de señalización o un media server sin reescribir toda la lógica del cliente.

Android y Linux
Artículo relacionado:
Android y Linux: Las mejores alternativas a KDE Connect

Con todo lo anterior sobre la mesa, para un side project que empieza y donde valoras tanto el tiempo de desarrollo como el coste a medio plazo, la estrategia más equilibrada suele ser arrancar con un SDK en tiempo real basado en WebRTC que te permita iterar rápido en React/React Native, interiorizar bien cómo gestionan roles, sesiones, ciclo de vida de streams y estados en vivo, y en paralelo ir profundizando en WebRTC “a pelo” (getUserMedia, RTCPeerConnection, RTCDataChannel, señalización con Node+Socket.IO, STUN/TURN, SFU) para no quedarte atado para siempre a una sola plataforma y poder dar el salto a una solución más custom cuando el producto lo justifique.