Este repositorio contiene la implementación completa del Trabajo de Fin de Grado “Comunicación multimedia en realidad extendida”, cuyo objetivo principal es explorar y diseñar un sistema capaz de integrar vídeo, audio y comunicación en tiempo real dentro de entornos 3D interactivos basados en WebXR y A-Frame.
El proyecto aborda dos casos de uso fundamentales:
Este caso de uso muestra cómo integrar vídeos, cámara del usuario y contenido tridimensional dentro de una escena A-Frame, y cómo transmitir dicha escena en tiempo real a OBS Studio mediante un servidor WHIP desarrollado en Python.

La escena funciona por sí sola, sin necesidad de OBS ni del servidor WHIP.
La integración con OBS es opcional y solamente se requiere si deseas retransmitir la escena o utilizarla como fuente de vídeo en directo.
La escena puede visualizarse directamente desde:
👉 **https://pclarke17.github.io/TFG/Caso_1
Esto permite:
navegación libre en un entorno WebXR

⚠️ IMPORTANTE:
La retransmisión hacia OBS no funciona desde GitHub Pages.
Para ello es necesario ejecutar el servidor WHIP en local (ver sección 3).
El servidor WHIP funciona exclusivamente por HTTPS, ya que WebRTC no permite conexiones inseguras fuera de localhost.
Para ejecutarlo, necesitas generar un certificado autofirmado:
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes
Esto creará:
cert.pem
key.pem
Colócalos dentro del archivo whip_server.py y en la misma carpeta donde se encuentre el archivo:
#### HTTPS con la ruta de tus certificados ssl_ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ssl_ctx.load_cert_chain( “/Users/pabloclarke/Documents/TFG/Video/cert.pem”, “/Users/pabloclarke/Documents/TFG/Video/key.pem” )
✔ Si NO deseas enviar la escena a OBS:
No necesitas generar certificados ni ejecutar el servidor WHIP.
Si deseas enviar vídeo a OBS, ejecuta:
python3 whip_server.py
En el terminal deberías de ver:
🚀 WHIP HTTPS escuchando en https://0.0.0.0:8080/whip 💾 Enviando señal en vivo a OBS por UDP → udp://127.0.0.1:6000
Este servidor recibe la señal WebRTC de A-Frame, la procesa y la reenvía a OBS en formato MPEG-TS.
Solo necesario si quieres transmitir la escena.
Añadir fuente → Captura de entrada multimedia
Elegir Red (URL)
Introducir:
udp://127.0.0.1:6000
Ajustar búfer (200–400 ms recomendado)

Si todo está configurado correctamente, la cámara del usuario, los vídeos 3D y el entorno de la escena aparecerán en OBS en tiempo real.

(Si la escena no se ve en OBS y está todo corriendo, refresca la página donde estes lanzando la escena)
Este proyecto permite realizar una videollamada bidireccional entre dos usuarios utilizando WebRTC y visualizando el vídeo dentro de una escena A-Frame en 3D/VR.

getUserMedia().RTCPeerConnection y se usa WebSocket para intercambio de señales (SDP/ICE).<a-plane> en A-Frame.<canvas>, y ese canvas se usa como textura para otro <a-plane>.📁 videoconferencia-webrtc/
├── index.html # Escena A-Frame con planos de video local y remoto
├── webrtc.js # Lógica WebRTC + conexión WebSocket + texturizado
├── server.js # Servidor WebSocket seguro (WSS) con Node.js
├── cert/ # Certificados auto-firmados para HTTPS/WSS
│ ├── cert.pem
│ └── key.pem
# Instala dependencias (si usas express o similar)
npm install
# Lanza el servidor seguro
node server.js
Abre en el navegador:
https://<tu-ip-local>/
Ejemplo:
https://192.168.1.141/
Luego abre otro dispositivo/navegador con la misma URL.
| Tecnología | Rol |
|---|---|
| WebRTC | Comunicación P2P de audio/vídeo |
| WebSocket | Canal de señalización (SDP, ICE) |
| A-Frame | Motor VR para visualización 3D de la videollamada |
| HTML5 Video & Canvas | Captura de vídeo y texturizado |
| HTTPS + WSS | Comunicación segura necesaria para WebRTC en producción |
Usamos un certificado auto-firmado para desarrollo:
// server.js (extracto)
const server = https.createServer({
key: fs.readFileSync("./cert/key.pem"),
cert: fs.readFileSync("./cert/cert.pem"),
}, app);
const wss = new WebSocket.Server({ server });
Puedes generarlo con:
mkdir cert
openssl req -x509 -newkey rsa:4096 -keyout cert/key.pem -out cert/cert.pem -days 365 -nodes
Una vez se acceda a la escena, nos encontraremos con distintos botones de carácter HTML, en los que podremos apagar/encender el micrófono y la cámara, elegir qué cámara se va a transmitir y con la que el otro usuario nos verá y elegir el fondo de la escena 3D.

En cuanto a las cámaras, tendremos dos disponibles, la cámara de la escena y la webcam del navegador. Este punto está pensado para dispositivos donde no se puede acceder a sus cámaras propias, como es el caso de las gafas de realidad virtual Meta Quest 3, donde se realizaron las pruebas de visionado de la escena.
El proyecto se estructura en diversos módulos coherentes con la memoria:
video-canvas-texture.js
Permite usar vídeos locales o remotos como texturas dinámicas.
camera-canvas-texture.js
Captura la cámara del usuario y la integra en la escena como textura.
OBS.js
Captura el punto de vista del usuario y establece una sesión WHIP para enviar vídeo hacia OBS.
whip_server.py
Servidor Python basado en aiortc y PyAV que recibe flujos WebRTC y los retransmite a OBS mediante MPEG-TS/UDP.
index.html
Escena de demostración que integra todos los componentes del sistema.
webrtc.js
Implementa una conexión WebRTC bidireccional que permite a los usuarios participar en videoconferencias dentro del escenario VR
server.js
Servidor de señalización WebRTC implementado con WebSocket seguro (WSS)
—
Estas tecnologías permiten combinar XR, comunicación en tiempo real y producción multimedia en un mismo sistema Web.
El TFG demuestra cómo es posible integrar canales multimedia complejos en un entorno XR accesible desde el navegador, habilitando aplicaciones como: