
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
結果は同じで、遅延はほとんどありません (何らかの理由で、Web カメラに h264 を強制的に出力させるには、最初の -vcodec が必要です)。
しかし、両方をストリーミングすると
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 秒まで増加し、オーディオとビデオが同期しません。理由を知っている人はいますか?
RTPの代わりにUDPとTCPを試してみましたが、ラグがいつもオーディオ/ビデオのみの場合でも、高い品質です。
どのようなご提案でも大歓迎です。
PS クライアント側(MacOS)では、
ffplay -protocol_whitelist file,rtp,udp -i file.sdp