| Criterio | Cá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) |
| Escenario | CSI | USB |
|---|---|---|
| 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 | ✔ |
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) │
│ │
└────────────────────────────────────────────────┘
| CSI | USB | USB 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) |
{ type: 'csi' | 'usb' | 'usb-h264', device: '/dev/video0', formats: [...] } para que el pipeline se configure solo.| Herramienta | CSI | USB | USB 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 | ✔ | ✔ | ✔ |