
He estado intentando configurar un monitor para bebés con una Raspberry Pi Zero y una cámara web Logitech C920. Funciona con VLC (cvlc) pero se retrasa demasiado y empeora con el tiempo.
Así que estoy jugando con ffmpeg y obtengo mejores resultados. Esto es lo que he hecho hasta ahora.
Primero, configuro la cámara web para que emita h264 1080p de forma nativa (el Pi Zero W no puede permitirse el lujo de realizar ninguna transcodificación).
v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=1
Ahora, si transmito audio solo con
ffmpeg \
-f alsa \
-i hw:1,0 \
-vn \
-flags +global_header \
-acodec aac \
-ac 1 \
-ar 16000 \
-ab 16k \
-f rtp rtp://192.168.0.10:5002 > audio.sdp
Funciona muy bien y el retraso es de aproximadamente 1 segundo (definitivamente aceptable).
Si transmito vídeo sólo con
ffmpeg \
-f v4l2 \
-vcodec h264 \
-i /dev/video0 \
-an \
-vcodec copy \
-pix_fmt yuv420p \
-r 30 \
-b:v 512k \
-flags +global_header \
-f rtp rtp://192.168.0.10:5000 > video.sdp
Mismo resultado, muy poco retraso (por alguna razón, el primer -vcodec es necesario para forzar a la cámara web a generar h264).
Sin embargo, cuando transmito ambos con
ffmpeg \
-f v4l2 \
-vcodec h264 \
-i /dev/video0 \
-f alsa \
-i hw:1,0 \
-an \
-preset ultrafast \
-tune zerolatency \
-vcodec copy \
-pix_fmt yuv420p \
-r 30 \
-b:v 512k \
-flags +global_header \
-f rtp rtp://192.168.0.10:5000 \
-vn \
-flags +global_header \
-acodec aac \
-ac 1 \
-ar 16000 \
-ab 16k \
-f rtp rtp://192.168.0.10:5002 > both.sdp
El retraso aumenta hasta ~10 segundos y el audio y el vídeo no están sincronizados. ¿Alguien sabe por qué?
Probé UDP y TCP en lugar de RTP pero luego el retraso essiemprealto, incluso con audio/vídeo únicamente.
Cualquier sugerencia es muy apreciada.
PD: En el lado del cliente (MacOS), estoy recibiendo
ffplay -protocol_whitelist file,rtp,udp -i file.sdp