** 追記2022/05/22 新しい記事を書いたのでこちらを参照してください。
jetson nanoでWebcamの映像をH.265で録画しつつSRTで小規模配信する
** 追記ここまで
SRTを使ってWebcamの映像を送ってみました。
全体図
server はクラウドの仮想マシンです。グローバルIPアドレスでアクセス可能です。
このserverのホスト名は"i3"です。
SRTで使用するUDPのポートは通過できるようにFirewallを設定しておきます。
送信側のPCは屋外から配信することを想定してモバイルルータでインターネットにつながっています。
これにつながっているWebcamの映像をSRTでserverに送信します。
受信側のPCは複数台あります。(今回は2台)
router経由でインターネットにつながっています。
送信側からserverへのRTTを調べる
RTT(Round Trip Time) はping コマンドで調べられます。
# ping i3 -c 10
PING i3 (35.201.190.159): 56 data bytes
64 bytes from 35.201.190.159: seq=0 ttl=52 time=113.861 ms
64 bytes from 35.201.190.159: seq=1 ttl=52 time=111.728 ms
64 bytes from 35.201.190.159: seq=2 ttl=52 time=110.851 ms
64 bytes from 35.201.190.159: seq=3 ttl=52 time=109.872 ms
64 bytes from 35.201.190.159: seq=4 ttl=52 time=108.992 ms
64 bytes from 35.201.190.159: seq=5 ttl=52 time=106.613 ms
64 bytes from 35.201.190.159: seq=6 ttl=52 time=107.109 ms
64 bytes from 35.201.190.159: seq=7 ttl=52 time=106.352 ms
64 bytes from 35.201.190.159: seq=8 ttl=52 time=105.231 ms
64 bytes from 35.201.190.159: seq=9 ttl=52 time=122.603 ms
--- i3 ping statistics ---
10 packets transmitted, 10 packets received, 0% packet loss
round-trip min/avg/max = 105.231/110.321/122.603 ms
だいたい120msec くらいです。
同様に受信側PCとserverとのRTTも調べます。
こちらは有線接続なので 50msec くらいでした。
Server で動かすスクリプト
gstreamerを使用します。
port 7001 で受け取ったものをport 7002 に送ります。
どちらもlistener modeで待ちます。
latency はRTTの2.5倍が推奨値です。
受信側のlatencyは 120 x 2.5 = 300 (ms) にします。
送信側はデフォルトの120 (ms)のままで。
#!/bin/sh
RECVLATENCY=300
gst-launch-1.0 -v \
srtserversrc uri="srt://:7001" latency=$RECVLATENCY \
! srtserversink uri="srt://:7002"
送信側PCで動かすスクリプト
ffmpegを使用します。
#!/bin/sh -x
HOST=i3
PORT=7001
BITRATE=2M
ffmpeg -f v4l2 -s 640x360 -i /dev/video0 -pix_fmt nv12 -c:v libopenh264 \
-b:v $BITRATE \
-f mpegts srt://$HOST:$PORT
受信側PCで動かすコマンド
ffplay -probesize 32 srt://i3:7002
-probesize 32
をつけることでffplayの中でのバッファリングによる遅延を減少させることができます。
または VLCで srt://i3:7002
を開きます。
コマンドを実行する順序
先にserver側のスクリプトを動かします。
後は、送信側PCと受信側PCの順番はどの順でも大丈夫です。
最後に
とりあえず映像が送れるこをが確認できました。遅延時間を減らすなどのチューニングはまだです。
また、受信側のPCの台数をもっと増やす場合は、server側でHLSに変換するのがよいと思います。