| Campo | Valor |
|---|---|
| Repo | github.com/kclyu/rpi-webrtc-streamer |
| Lenguaje | C++ (basado en libwebrtc / Chromium) |
| Licencia | BSD |
| RAM típica | ~30–50 MB |
| Binario | ~25–40 MB (libwebrtc compilada estáticamente) |
| CPU RPi 3B | ~15–20% (encode HW 10–15% + stack ICE/DTLS 5%) |
| Captura | MMAL (legacy) / libcamera (moderno) — solo CSI |
| Encode | H.264 HW VideoCore IV/VI, zero-copy |
| Audio | ALSA → Opus (libwebrtc AudioEncoder) |
| Transporte | SRTP sobre DTLS, ICE completo |
| DataChannel | ✔ SCTP sobre DTLS |
| Estado | ⚠️ Mantenimiento irregular (último commit significativo: 2023) |
┌───────────────────────────────────────────────────────────────┐
│ RPi-WebRTC Streamer (C++) │
│ │
│ ┌─────────────┐ MMAL/libcamera ┌──────────────────────┐ │
│ │ 🎥 Cam CSI │───────────────────▷│ RaspiCamEncoder │ │
│ └─────────────┘ (zero-copy) │ (H.264 HW encode) │ │
│ └──────────┬───────────┘ │
│ ┌─────────────┐ ALSA ┌──────────┴───────────┐ │
│ │ 🎤 Mic │──────────────────▷│ AudioEncoder (Opus) │ │
│ └─────────────┘ └──────────┬───────────┘ │
│ │ │
│ ┌──────────┴───────────┐ │
│ │ libwebrtc stack │ │
│ │ PeerConnection │ │
│ │ ICE + DTLS + SRTP │ │
│ │ DataChannel (SCTP) │ │
│ └──────────┬───────────┘ │
│ │ │
│ ┌───────────────────────────────────┐ │ │
│ │ HTTP Server (señalización) │◄────────┘ │
│ │ WebSocket (ICE candidates) │ │
│ │ Sirve: SDP offer/answer │ │
│ │ Conf.: resolución, bitrate, etc. │ │
│ └───────────────┬───────────────────┘ │
└──────────────────┼────────────────────────────────────────────┘
│ HTTP/WS (:8889)
▼
Peer (browser o Node.js consumer)
| MMAL (legacy) | libcamera (moderno) | |
|---|---|---|
| Kernel | Raspbian antiguo | Bookworm+ (dtoverlay=imx219/ov5647) |
| Módulos HW | OV5647, IMX219, IMX477 | Todos los soportados por libcamera |
| Zero-copy | ✔ vía GPU memory | ✔ vía DMA-BUF |
| RPi-WebRTC | ✔ Rama principal | ⚠️ Fork / rama experimental |
| Recomendación | Si kernel legacy | Preferido en Bookworm |
| Endpoint | Método | Función |
|---|---|---|
| /offer | POST | Enviar SDP offer → recibir SDP answer |
| /ws | WebSocket | Intercambio de ICE candidates en tiempo real |
| /config | GET/POST | Configurar resolución, bitrate, etc. |
| /snapshot | GET | JPEG snapshot (si soportado) |
| Síntoma | Causa | Fix |
|---|---|---|
| No se detecta cámara CSI | MMAL deprecado en Bookworm | Usar fork con soporte libcamera. Verificar dtoverlay en config.txt |
| Binario no arranca (SIGILL) | Compilado para ARM64, device es ARM32 | Recompilar con target armhf o usar device con OS 64-bit |
| ICE candidates vacíos | Firewall bloquea UDP | Abrir rango de puertos UDP o configurar TURN server |
| High CPU en encode | Fallback a software encode | Verificar que /dev/vchiq existe (VideoCore). ls /dev/vchiq |
| WebSocket connection refused | Puerto 8889 ocupado | Cambiar puerto en conf. Verificar con ss -tlnp | grep 8889 |
| USB cam no funciona | RPi-WebRTC no soporta USB | Cambiar a Arq. 3 (go2rtc) o Arq. 6 (µStreamer) |