HARDWARE

CSI vs. USB

Cámaras en el Solar Net Hub · RPi 3B
Qué cambia según la cámara — pipeline, CPU, RAM, Docker
web-rtc-ext.md · EXT-1 + EXT-2

☞ Deep-Dive Specs

Pipeline & Comandos — ffmpeg, rpicam-vid, autodetección
Impacto por Arquitectura — go2rtc, MediaMTX, µStreamer, YAML configs
~5%CPU CSI
~15%CPU USB
250 mWCSI power
1.5WUSB power
20 cmCSI max
5 mUSB max

Comparativa Hardware

CriterioCámara CSI (ribbon)Cámara USB (UVC)
Interfaz FFC 15-pin · MIPI CSI-2 · D-PHY lanes USB 2.0 (480 Mbps) · Conector estándar
Protocolo RAW Bayer directo al ISP del SoC UVC 1.1/1.5 · Frames YUYV/MJPEG/H.264
GPU/ISP ✔ Directo · VideoCore IV procesa RAW ✘ No pasa por ISP · Frame llega a userspace
H.264 HW ✔ rpicam-vid encode directo · ~5% CPU ⚠️ Captura UVC → V4L2 M2M → GPU · ~10-15% CPU
Latencia ~20-50 ms (ISP pipeline, zero-copy) ~50-150 ms (USB polling + decode)
Driver bcm2835-unicam · libcamera uvcvideo (genérico) · V4L2
rpicam-* ✔ rpicam-vid, rpicam-still, rpicam-hello ✘ No detecta USB · Usar ffmpeg/v4l2-ctl
Distancia ~20 cm (ribbon frágil, extensor ~1 m) Hasta 5 m (USB 2.0) · >10 m con hub activo
Hot-plug ✘ Requiere apagado ✔ Plug & play en caliente
Consumo ~250 mW (3.3V del conector CSI) ~500 mW–1.5W (5V bus USB)
Coste Cam Module 3: ~€25 · HQ: ~€50 Genérica: €5-20 · H.264 HW: €50-80
Docker ⚠️ --device /dev/vchiq + /dev/video0 + /dev/media0 ✔ --device /dev/video0 (simple)
★ CSI: zero-copy del sensor al encoder HW · USB: 2 copias por frame ★

¿Cuándo CSI? ¿Cuándo USB?

EscenarioCSIUSB
Cámara fija integrada
Distancia >30 cm
Pan-tilt-zoom (PTZ)
Webcam reciclada
Visión nocturna (IR) NoIR⚠️
Múltiples cámaras⚠️ 1 CSI
Docker simple⚠️
Máx. eficiencia CPU
Máx. eficiencia mW
RPi 3B tiene 1 solo puerto CSI. Si se necesitan 2+ cámaras, al menos una será USB.

Encoder H.264 HW: La Diferencia Clave

CSI — zero-copy:
Sensor → MIPI CSI-2 → ISP (GPU) → H.264 (GPU) → DMA Sin copia a RAM principal · CPU: ~5%
USB — con copia:
Sensor → USB → uvcvideo → RAM → V4L2 M2M → GPU Copia a userspace + copia a GPU · CPU: ~10-15%
2-3× más consumo CPU con USB. En un device solar de 22W con 1 GB RAM compartida CPU/GPU, cada frame USB se copia dos veces.
Excepción: webcams con H.264 integrado (C920, C930e) entregan H.264 directo por USB — sin re-encode. CPU ~3%. Pero cuestan €50-80 y consumen ~1.5W.

☞ Flujo de Captura: CSI vs. USB

  CÁMARA CSI                             CÁMARA USB
  ══════════                             ══════════

  ┌──────────┐                           ┌──────────┐
  │ Sensor   │                           │ Sensor   │
  │ IMX219/  │                           │ (varios) │
  │ IMX708   │                           └────┬─────┘
  └────┬─────┘                                │
       │ MIPI CSI-2                           │ USB UVC
       │ (RAW Bayer)                          │ (YUYV/MJPEG/H.264)
       │                                      │
  ┌────┴───────────┐                    ┌─────┴──────────────┐
  │ ISP VideoCore  │                    │ Driver uvcvideo    │
  │ Debayer + AWB  │                    │ Decode YUYV/MJPEG  │
  │ + H.264 HW     │                    │ → Buffer userspace │
  └────┬───────────┘                    └─────┬──────────────┘
       │                                      │
       │  /dev/video0                         │ /dev/video0
       │  (libcamera)                         │ (V4L2)
       │                                      │
  ┌────┴──────────────────────────────────────┴────┐
  │                                                │
  │  A: rpicam-vid (SOLO CSI · zero-copy)          │
  │  B: ffmpeg -f v4l2 (ambas)                     │
  │  C: go2rtc v4l2 (ambas)                        │
  │  D: µStreamer V4L2 (ambas)                      │
  │  E: MediaMTX rpiCamera (SOLO CSI · zero-copy)  │
  │  F: RPi-WebRTC MMAL (SOLO CSI)                 │
  │                                                │
  └────────────────────────────────────────────────┘

Impacto en las Arquitecturas Elegidas

CSIUSBUSB con H.264 HW
Arq. 3 (go2rtc) v4l2 o exec rpicam-vid · ~5-10% CPU v4l2 MJPEG · ~10-20% CPU v4l2 H.264 passthrough · ~3% CPU
Arq. 6 (µStreamer) V4L2 + M2M HW · ~3-8% CPU V4L2 MJPEG direct · ~15-30% CPU V4L2 MJPEG (ignora H.264 integrado)
Audio (Mumble) Idéntico — audio es independiente de CSI/USB
RAM total ~65 MB (Arq 3) / ~10 MB (Arq 6) ~75 MB (Arq 3) / ~15 MB (Arq 6) ~65 MB (Arq 3) / ~10 MB (Arq 6)
Mumble no cambia con la cámara. Ambas arquitecturas elegidas (Arq. 3 y 6) soportan CSI y USB sin cambios de arquitectura — solo cambia la config de captura de vídeo.

Docker: Passthrough de Cámara

USB (simple):
docker run --device /dev/video0 ...
CSI — RPi 3B legacy (vchiq):
docker run --device /dev/vchiq \ --device /dev/video0 ...
CSI — libcamera moderno:
docker run --device /dev/video0 \ --device /dev/media0 \ -v /dev/dma_heap:/dev/dma_heap ...
El SNH corre Docker → Debian Bookworm. USB es más fácil de pasar al contenedor. CSI requiere montar dispositivos extra del ISP.

Detección Automática

# ¿Hay cámara CSI? libcamera-hello --list-cameras # Si lista algo → CSI presente # ¿Qué formatos soporta la cámara? v4l2-ctl --list-formats-ext -d /dev/video0 # CSI: aparece H264, resoluciones altas # USB: aparece MJPG y/o YUYV # USB H.264 HW: aparece H264 entre formatos
Fase 0 (hardware_detect.js) automatiza esto: retorna { type: 'csi' | 'usb' | 'usb-h264', device: '/dev/video0', formats: [...] } para que el pipeline se configure solo.

Referencia Rápida — Qué Usar Según Cámara

HerramientaCSIUSBUSB H.264
rpicam-vid✔ (óptimo)
libcamera-vid
ffmpeg -f v4l2✔ (universal)✔ (-c:v copy)
go2rtc v4l2
µStreamer✔ (M2M HW)✔ (MJPEG)✔ (MJPEG)
MediaMTX rpiCam✔ (zero-copy)✘ (requiere ffmpeg)
RPi-WebRTC✔ (MMAL)
v4l2-ctl
MIPI CSI-2 UVC V4L2 libcamera rpicam-vid H.264 M2M VideoCore IV ISP MJPEG zero-copy uvcvideo D-PHY