我一直在尝试使用 Raspberry Pi Zero 和 Logitech C920 网络摄像头设置婴儿监视器。它确实可以与 VLC (cvlc) 配合使用,但延迟太多,并且随着时间的推移情况会变得更糟。
因此,我尝试使用 ffmpeg,并获得了一些更好的结果。这是我目前所做的。
首先,我将网络摄像头设置为原生输出 h264 1080p(Pi Zero W 无法进行任何转码)。
v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=1
现在,如果我只使用
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
它运行良好并且延迟大约为 1 秒(绝对可以接受)。
如果我只使用
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
结果相同,延迟很小(由于某种原因,第一个 -vcodec 是强制网络摄像头输出 h264 所必需的)。
然而,当我同时使用
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
延迟时间增加至约 10 秒,音频和视频不同步。有人知道原因吗?
我尝试过 UDP 和 TCP 来代替 RTP,但延迟总是高,即使只有音频/视频。
任何建议都将不胜感激。
PS 在客户端(MacOS)我接收
ffplay -protocol_whitelist file,rtp,udp -i file.sdp