Cómo funciona tu sistema de cámara en vivo

Una explicación visual, grande y paso a paso del código con Flask, Socket.IO y WebRTC. Aquí cada parte importante tiene su propio modal para ver el código relacionado sin saturar la lectura.

Visión general

Tu sistema no funciona como una transmisión clásica donde el servidor recibe video y luego lo reparte. En este diseño, el servidor ayuda a que los navegadores se encuentren, pero el video lo mueve WebRTC.

La idea central es esta: Flask entrega las páginas, Socket.IO coordina la comunicación y WebRTC transmite el video.
Teléfono Ruta /camara Captura video
Flask + Socket.IO Coordina mensajes No carga el video pesado
Usuarios Ruta /ver Reciben el video

El servidor funciona como un organizador. Cuando el teléfono dice “ya tengo cámara”, el servidor guarda quién es la cámara. Cuando un usuario entra a ver, el servidor le dice a la cámara: “hay un nuevo espectador”. Entonces la cámara crea una conexión WebRTC específica para ese espectador.

Partes del sistema

1

app.py

Es el servidor. Entrega las rutas /camara y /ver. También guarda la cámara activa, los espectadores conectados y el contador de me gusta.

2

camara.html

Es la página que se abre desde el teléfono. Pide permiso a la cámara, muestra la vista previa y crea una conexión WebRTC para cada espectador.

3

ver.html

Es la página del espectador. Avisa que quiere ver, recibe la oferta WebRTC, responde y muestra el video remoto.

Flujo paso a paso

1

Arranca el servidor

Ejecutas python3 app.py. Flask queda escuchando en el puerto 5050. Desde ese momento puede entregar la página de cámara y la página para ver la transmisión.

2

El teléfono entra a /camara

El teléfono abre la página transmisora. Todavía no se usa la cámara. Solamente se carga el HTML con el botón para activar o desactivar la cámara.

3

El usuario activa la cámara

Al presionar el botón, se ejecuta toggleCamara(). Si la cámara está apagada, llama a activarCamara(). Esa función pide permiso al navegador mediante getUserMedia().

4

El teléfono avisa que la cámara está lista

Cuando la cámara ya está activa, el navegador manda el evento camara_lista. El servidor guarda el identificador de ese navegador en camera_sid.

5

Un espectador entra a /ver

La página del espectador se carga y manda el evento ver_listo. El servidor agrega a ese usuario al conjunto viewers.

6

La cámara crea una conexión para ese espectador

El servidor le dice a la cámara que hay un nuevo espectador. La cámara crea un objeto RTCPeerConnection y lo guarda dentro de pcs, usando el identificador del espectador.

7

Oferta, respuesta y candidatos ICE

La cámara crea una oferta, el espectador responde y ambos intercambian candidatos ICE. Estos mensajes viajan por Socket.IO, pero el video viaja por WebRTC.

8

El video aparece en /ver

Cuando WebRTC conecta correctamente, el evento ontrack recibe el stream remoto y lo coloca en remoteVideo.srcObject. Ahí aparece la transmisión.

Código explicado por partes

En lugar de mostrar todo el código de golpe, aquí puedes abrir solamente la parte que necesitas entender. Cada modal resalta en blanco la línea o bloque importante.

Por qué ahora funciona con varios usuarios

Antes el sistema fallaba con dos espectadores porque la cámara usaba una sola conexión WebRTC. Cuando entraba un segundo usuario, esa nueva conexión reemplazaba a la primera. El resultado era que un usuario veía video y el otro se quedaba sin imagen.

La solución fue usar un objeto llamado pcs, donde cada espectador tiene su propia conexión WebRTC.

La idea clave

let pcs = {};

pcs[viewerId] = pc;

Si hay tres usuarios viendo, conceptualmente el objeto funciona así:

pcs = {
    "usuario_1": RTCPeerConnection,
    "usuario_2": RTCPeerConnection,
    "usuario_3": RTCPeerConnection
};

Eso significa que la cámara no tiene una sola conexión general. Tiene una conexión separada por cada espectador. Por eso, cuando se conecta un nuevo usuario, no se destruye la conexión anterior.

Resumen final

El sistema se entiende mejor si lo piensas como una coordinación entre tres actores: el teléfono que transmite, el servidor que organiza y los usuarios que ven.

A

Flask

Entrega las páginas y define las rutas principales.

B

Socket.IO

Mueve mensajes pequeños de control: ofertas, respuestas, candidatos y likes.

C

WebRTC

Transporta el video real entre navegador transmisor y navegadores espectadores.