YAML

Impacto por Arquitectura

Cómo cambia la config de cada servidor media según CSI o USB

Arq. 1 — go2rtc: CSI vs. USB

go2rtc.yaml — CSI:
streams: solar-cam: - v4l2:///dev/video0 # Alternativa más eficiente (zero-copy): # - exec:rpicam-vid -t 0 --codec h264 --inline # --width 1280 --height 720 -o - solar-mic: - alsa:///default api: listen: "127.0.0.1:1984"
go2rtc.yaml — USB:
streams: solar-cam: - v4l2:///dev/video0 # Si webcam soporta H.264 nativo: # - v4l2:///dev/video0#format=h264 solar-mic: - alsa:///default api: listen: "127.0.0.1:1984"
go2rtc + CSIgo2rtc + USB
CapturaV4L2 o exec rpicam-vidV4L2 directo (MJPEG/YUYV)
H.264 HWSí, vía rpicam-vid execSolo si webcam lo entrega nativo
RAM~20-30 MB~20-40 MB (si re-encode)
CPU~5-10%~10-20%
Docker--device /dev/video0 --device /dev/vchiq--device /dev/video0

Arq. 2 — MediaMTX: CSI vs. USB

MediaMTX tiene ventaja diferencial para CSI: soporta rpicam nativo (rpiCamera) sin ffmpeg. Para USB necesita ffmpeg como fuente.
mediamtx.yml — CSI (zero-copy nativo):
paths: solar-cam: source: rpiCamera rpiCameraWidth: 1280 rpiCameraHeight: 720 rpiCameraFPS: 25 rpiCameraCodec: h264 rpiCameraProfile: baseline rpiCameraLevel: "3.1" rpiCameraBitrate: 1000000
mediamtx.yml — USB (requiere ffmpeg):
paths: solar-cam: runOnInit: > ffmpeg -f v4l2 -input_format mjpeg -video_size 1280x720 -framerate 25 -i /dev/video0 -c:v h264_v4l2m2m -b:v 1M -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH runOnInitRestart: yes
MediaMTX + CSIMediaMTX + USB
FuenterpiCamera nativo (zero-copy)ffmpeg exec → RTSP local
ffmpeg❌ No necesario✅ Necesario
CPU~5%~15-20%
Config10 líneas YAML10 líneas YAML + ffmpeg cmd
Auto-convRTSP → HLS → WebRTC automática
★ MediaMTX: óptima para CSI · subóptima para USB ★
★ go2rtc: equilibrada para ambas ★

Arq. 3 — Mumble Hybrid (go2rtc): CSI vs. USB

Hereda el análisis de go2rtc (Arq. 1). El audio va por Mumble → independiente de CSI/USB.
Arq. 3 + CSI                         Arq. 3 + USB
════════════                          ════════════

🎤 Mic ──► murmurd (audio)           🎤 Mic ──► murmurd (audio)
🎥 CSI ──► go2rtc (v4l2/rpicam)      🎥 USB ──► go2rtc (v4l2 MJPEG)
            │                                     │
            └─ MJPEG/HLS → <img>/<video>         └─ MJPEG/HLS → <img>/<video>

Audio: idéntico (Mumble)              Audio: idéntico (Mumble)
Vídeo: ~5-10% CPU                     Vídeo: ~10-20% CPU
RAM: ~65 MB                           RAM: ~75 MB
Si se usa USB, go2rtc sigue siendo preferible a MediaMTX: captura V4L2 directa sin ffmpeg.

Arq. 6 — µStreamer: CSI vs. USB

µStreamer + CSIµStreamer + USB
CapturaV4L2 + M2M HW encodeV4L2 MJPEG directo
CPU~3-8%~15-30%
Formato salidaMJPEG (siempre)MJPEG (siempre)
H.264 USBN/AIgnora H.264 integrado (usa MJPEG)
RAM~10 MB~15 MB
µStreamer siempre sirve MJPEG. No hace HLS ni H.264 streaming. Para Arq. 6 eso es una feature: latencia mínima en LAN.

Arq. 5 — RPi-WebRTC: Solo CSI

RPi-WebRTC NO soporta cámaras USB. Si se usa USB, esta arquitectura queda descartada.
🎥 Cam CSI ──MMAL──► RPi-WebRTC ──WebRTC──► Node.js consumer
🎤 Mic ─────ALSA───►  :8889                  (node-datachannel)
                       │ H.264 HW encode       │
                       │ + Opus audio           ├─ GET /video → MJPEG
                       │ + DataChannel          └─ GET /audio → OGG
CriterioArq. 5
CámaraSolo CSI (MMAL/libcamera)
RAM~80-100 MB (RPi-WebRTC ~40 MB + decode Node.js)
CPU~15-20% encode HW + ~10% decode en Node.js
Estado⚠️ Mantenimiento irregular desde 2023
JS en clienteRequiere WebRTC API → incompatible con "cero JS"
ViabilidadSolo como fuente para go2rtc (patrón composable)
Patrón composable: RPi-WebRTC → go2rtc (WHEP) → MJPEG/HLS. Ventaja: encode HW zero-copy. Desventaja: ~50 MB RAM por 2 procesos media.

☞ Resumen: ¿Qué Arquitectura para Qué Cámara?

ArquitecturaCSIUSBUSB H.264Recomendación
Arq. 1 go2rtc✔ bueno✔ bueno✔ óptimo Equilibrada para ambas
Arq. 2 MediaMTX✔ óptimo⚠️ necesita ffmpeg⚠️ Solo si CSI
Arq. 3 Mumble+go2rtc✔ bueno✔ bueno✔ óptimo ★ Contexto: remoto + Tor · ambas
Arq. 4 Janus⚠️ heavy⚠️ heavy⚠️ Descartada (RAM)
Arq. 5 RPi-WebRTC✔ zero-copy Solo CSI, mantenimiento dudoso
Arq. 6 µStreamer+Mumble✔ ultra-light✔ ok ★ Contexto: solo LAN / RAM crítica
★ Arq. 3 (go2rtc) gana para USB · Arq. 6 (µStreamer) gana para CSI en LAN ★
go2rtc MediaMTX µStreamer RPi-WebRTC rpiCamera MMAL YAML Docker