┌──────────────────────────────────────────────────────────────────┐
│ RASPBERRY PI 3B · SOLAR NET HUB │
│ BCM2837 · Cortex-A53 · VideoCore IV │
│ │
│ ┌──────────┐ ribbon ┌──────────────────┐ │
│ │ 🎥 CAM │─────────▷│ rpicam-vid │ │
│ │ CSI │ zero- │ H.264 HW encode │ │
│ └──────────┘ copy │ (nativo, sin │ │
│ │ ffmpeg) │ │
│ └────────┬─────────┘ │
│ │ RTSP │
│ ┌────────┴──────────────────────┐ │
│ │ MediaMTX :8554 │ │
│ │ │ │
│ │ Auto-conversión: │ │
│ │ RTSP → HLS (:8888) │ │
│ │ RTSP → WebRTC (:8889) │ │
│ │ RTSP → RTMP (:1935) │ │
│ │ Hooks → Node.js │ │
│ └────────┬──────────────────────┘ │
│ │ localhost │
│ ┌──────────────────────────────┴────────────────────────────┐ │
│ │ OASIS :3000 (Node.js · SSB · cero JS en browser) │ │
│ │ │ │
│ │ GET /video ──▷ proxy MediaMTX HLS │ │
│ │ GET /snapshot ──▷ proxy MediaMTX JPEG │ │
│ │ │ │
│ │ HTML: <video src="/video.m3u8"> (HLS sin JS en Safari) │ │
│ │ Alt: <img src="/snapshot"> + refresh meta │ │
│ │ │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ node-datachannel (P2P DataChannels) │ │ │
│ │ │ texto · archivos · señalización │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌────────────┐ ┌─────────────┐ ┌────────────┐
│ 📺 BROWSER │ │ 📡 PEER │ │ 🌐 REMOTE │
│ LAN (no JS)│ │ P2P data │ │ HLS viewer │
│ <video>HLS │ │ node-dc │ │ <video>HLS │
│ ó snapshot │ │ text/file │ │ via Tor OK │
└────────────┘ └─────────────┘ └────────────┘
rpicam-vid para obtener H.264 del encoder HW del VideoCore sin pasar por V4L2 ni ffmpeg. Zero-copy del GPU al stream RTSP. En RPi 3B, esto significa ~5% CPU vs ~15–20% con ffmpeg.| Propiedad | Estado |
|---|---|
| Cero JS en browser LAN | ✔ (HLS/snapshot) |
| Cámara CSI | ✔ Zero-copy HW |
| Cámara USB | ⚠️ Necesita ffmpeg |
| Audio captura | ⚠️ Necesita ffmpeg→RTSP |
| Audio bidireccional | ✘ (no nativo) |
| Funciona sobre Tor | ⚠️ HLS sí; WebRTC no |
| Auto-conversión | ✔ RTSP↔HLS↔WebRTC↔RTMP |
| HLS para remoto | ✔ |
| WebRTC (WHEP) | ✔ |
| RTSP output | ✔ |
| Hooks a Node.js | ✔ on_connect/disconnect |
| DataChannels P2P | ✔ (node-datachannel) |
| RAM nuevos procesos | ~15–30 MB |
| MediaMTX + CSI | MediaMTX + USB | |
|---|---|---|
| Fuente | rpiCamera nativo (zero-copy) | ffmpeg exec → RTSP local |
| ffmpeg necesario | ❌ No | ✔ Sí (decode MJPEG + encode H.264) |
| CPU | ~5% (HW encode directo) | ~15–20% (ffmpeg transcoding) |
| Config | 10 líneas YAML | 10 líneas YAML + ffmpeg command |
| Auto-conversión | ✔ RTSP→HLS→WebRTC automática | ✔ Igual (una vez el RTSP existe) |
| Docker devices | /dev/video0 + /dev/vchiq | /dev/video0 |
| Criterio | MediaMTX | go2rtc |
|---|---|---|
| CSI zero-copy | ✔ rpicam nativo | ⚠️ V4L2 (con copia) |
| USB directo | ✘ Necesita ffmpeg | ✔ V4L2 directo |
| Audio ALSA | ✘ Necesita ffmpeg→RTSP | ✔ ALSA directo |
| MJPEG stream | ⚠️ Solo snapshots | ✔ MJPEG continuo |
| HLS | ✔ Auto-conversión | ✔ Nativo |
| WebRTC (WHEP) | ✔ | ✔ |
| RTSP | ✔ (protocolo base) | ✔ |
| RTMP | ✔ | ✘ |
| SRT | ✔ | ✘ |
| Auth | ✔ internal/HTTP/JWT | Básica (API key) |
| Hooks | ✔ on_connect/disconnect | ✘ |
| RAM | ~15–30 MB | ~20–40 MB |
| CPU (CSI) | ~5% | ~5–10% |
| CPU (USB) | ~15–20% (ffmpeg) | ~10–20% |
| Binario | ~20 MB | ~15 MB |
| GitHub ★ | ~13k | ~7k |
MediaMTX
┌─────────────────┐
│ │
rpicam-vid ──RTSP──▷ │ RTSP :8554 │
│ │ │
│ ├──▷ HLS :8888 → <video src=".m3u8">
│ ├──▷ WebRTC :8889 → peers con JS
│ ├──▷ RTMP :1935 → re-stream externo
│ ├──▷ SRT :8890 → low-latency link
│ └──▷ API :9997 → control / status
│ │
└─────────────────┘
★ Publicas UNA fuente RTSP → sale en TODOS los formatos ★
★ Sin config adicional por protocolo ★
| Opción | Descripción | Bid. | Tor | Complejidad |
|---|---|---|---|---|
| ffmpeg→RTSP | ffmpeg captura ALSA, publica RTSP en MediaMTX. Auto-conv a HLS audio. | ✘ | ⚠️ | Baja |
| Mumble | murmurd (ya instalado) + bridge HTTP. Audio bidireccional, Tor-compatible. | ✔ | ✔ | Media |
| Sin audio | Solo vídeo. Válido para vigilancia/monitorización. | ✘ | N/A | Ninguna |
| Riesgo | Prob. | Impacto | Mitigación |
|---|---|---|---|
| USB cam descarta ventaja CSI | Media | Medio | hardware_detect.js → redirigir a Arq. 3 (go2rtc) para USB |
| Sin MJPEG stream continuo | Segura | Medio | Usar snapshots + meta refresh, o proxy ffmpeg RTSP→MJPEG |
| Audio requiere componente extra | Segura | Bajo | Combinar con Mumble (ya instalado) para audio bidireccional |
| rpicam API cambia en nuevas distros | Baja | Medio | MediaMTX se actualiza regularmente (~13k ★, releases frecuentes) |