
Ich habe versucht, ein Babyphone mit einem Raspberry Pi Zero und einer Logitech C920-Webcam einzurichten. Es funktioniert zwar mit VLC (cvlc), hat aber zu viele Verzögerungen und wird mit der Zeit schlimmer.
Ich spiele also mit ffmpeg herum und bekomme bessere Ergebnisse. Das ist, was ich bisher gemacht habe.
Zuerst habe ich die Webcam so eingestellt, dass sie nativ h264 1080p ausgibt (der Pi Zero W kann keine Transkodierung durchführen).
v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=1
Wenn ich jetzt nur Audio streame mit
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
Es funktioniert großartig und die Verzögerung beträgt etwa 1 Sekunde (definitiv akzeptabel).
Wenn ich Videos nur streame mit
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
Gleiches Ergebnis, sehr geringe Verzögerung (aus irgendeinem Grund ist der erste -vcodec erforderlich, um die Webcam zur Ausgabe von h264 zu zwingen).
Wenn ich jedoch beide streame mit
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
Die Verzögerung beträgt bis zu 10 Sekunden und Audio und Video sind nicht synchron. Weiß jemand, warum?
Ich habe UDP und TCP anstelle von RTP ausprobiert, aber dann ist die Verzögerungstetshoch, sogar nur mit Audio/Video.
Jeder Vorschlag wird sehr geschätzt.
PS Auf der Clientseite (MacOS) empfange ich mit
ffplay -protocol_whitelist file,rtp,udp -i file.sdp