ffmpeg

Pipeline & Comandos

Captura y encode según tipo de cámara — CSI, USB, USB-H.264

Pipeline de Transmisión por Pista (CSI/USB-aware)

Sustituye la tabla original de web-rtc.md §1.7 que asumía solo CSI.
PistaOrigen CSIOrigen USBCodecCPU
Vídeo rpicam-vid --codec h264 --inline -o - (zero-copy) ffmpeg -f v4l2 -input_format mjpeg + re-encode h264_v4l2m2m H.264 HW CSI ~5% · USB ~15%
Vídeo (USB H.264 HW) N/A ffmpeg -f v4l2 -input_format h264 -c:v copy (passthrough) H.264 pass ~3%
Audio ffmpeg -f alsa -i default · o Mumble (§2.2 Arq. 3) Opus 48 kHz ~2%
Datos Independiente de cámara SCTP

Comandos ffmpeg por Tipo de Cámara

═══ CSI: H.264 HW directo ═══
# Opción 1: rpicam-vid (recomendado, zero-copy) rpicam-vid -t 0 --width 1280 --height 720 --framerate 25 \ --codec h264 --profile baseline --level 3.1 \ --inline --listen -o tcp://127.0.0.1:8888
# Opción 2: ffmpeg vía V4L2 (si rpicam-vid no disponible) ffmpeg -f v4l2 -input_format h264 -video_size 1280x720 \ -framerate 25 -i /dev/video0 -c:v copy \ -f rtp rtp://127.0.0.1:5004
═══ USB: MJPEG → re-encode H.264 HW ═══
# La mayoría de webcams USB entregan MJPEG por V4L2 ffmpeg -f v4l2 -input_format mjpeg -video_size 1280x720 \ -framerate 25 -i /dev/video0 \ -c:v h264_v4l2m2m -b:v 1M -pix_fmt yuv420p \ -f rtp rtp://127.0.0.1:5004
═══ USB con H.264 HW integrado: passthrough ═══
# Webcams tipo Logitech C920 que entregan H.264 directo ffmpeg -f v4l2 -input_format h264 -video_size 1280x720 \ -framerate 25 -i /dev/video0 -c:v copy \ -f rtp rtp://127.0.0.1:5004

Impacto en §2.1 — Formato de Entrega al Navegador

El formato al navegador (MJPEG, HLS) es el mismo con CSI o USB. Lo que cambia es el pipeline servidor.
Formato entregaPipeline CSIPipeline USBΔ CPU
MJPEG <img> rpicam-vid --codec mjpeg → HTTP ffmpeg -f v4l2 -input_format mjpeg -c:v copy → HTTP ~0% (ambos nativos)
HLS <video> rpicam-vid --codec h264 → ffmpeg -f hls ffmpeg -f v4l2 mjpeg → h264_v4l2m2m → -f hls CSI ~5% · USB ~15%
HLS (USB H.264 HW) N/A ffmpeg -f v4l2 h264 → -c:v copy -f hls ~3%
Para Fase 3 (Internet) con HLS, CSI ahorra ~10% CPU vs. USB. En un dispositivo solar de 22W, esos ciclos de CPU se traducen en vatios.

Detección Automática del Tipo de Cámara

# 1. ¿Hay cámara CSI? libcamera-hello --list-cameras # Si lista algo → CSI presente # Si error/vacío → No hay CSI, buscar USB # 2. ¿Qué formatos soporta? v4l2-ctl --list-formats-ext -d /dev/video0 # CSI típica: aparece "H264" con resoluciones altas # USB típica: aparece "MJPG" y/o "YUYV" # USB H.264 HW: aparece "H264" entre formatos # 3. Hardware detect (Fase 0) # hardware_detect.js retorna: # { type: 'csi'|'usb'|'usb-h264', # device: '/dev/video0', # formats: ['H264','MJPG',...] }
Fase 0 automatiza la detección: el pipeline se configura solo según el resultado de hardware_detect.js.

Compatibilidad: Herramientas × Tipo de Cámara

HerramientaCSIUSBUSB H.264Notas
rpicam-vid✔ óptimoZero-copy ISP directo
libcamera-vidEquivalente a rpicam-vid
ffmpeg -f v4l2✔ universal✔ -c:v copyFunciona con todo
go2rtc v4l2Sin ffmpeg necesario
µStreamer✔ M2M HW✔ MJPEG✔ MJPEGIgnora H.264 USB
MediaMTX rpiCam✔ zero-copyUSB requiere ffmpeg
RPi-WebRTC✔ MMALSolo CSI
v4l2-ctlDiagnóstico universal
rpicam-vid ffmpeg h264_v4l2m2m V4L2 MJPEG passthrough libcamera-hello v4l2-ctl