SRTはgstreamerとVLCの最近のバージョンでサポートされているということなので、実際に試してみました。
gstreamer のSRTプラグインをビルドする
gstreamer 1.14.0 からSRTがサポートされたそうです。
Ubuntu 18.04 ではgstreamer 1.14.0が入っていますが、SRTのプラグインは含まれていませんでした。なので、ソースからビルドします。
ビルド環境の準備
Ubuntu 18.04 のGCE(Google Compute Engine)の仮想マシンを作成。
まずはgstreamerのインストール。
sudo apt install gstreamer1.0-*
では依存関係が壊れていてインストールできなかったので、必要そうなものだけをインストール。
sudo apt update
sudo apt upgrade
sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly
libsrt のビルドとインストール
こちら を参照。
ソースコードの取得
gstreamer全てをビルドするのは大変なので、SRTのプラグインが含まれているソースコードだけをとってきて、バージョンを1.14.0 に合わせます。
git clone git://anongit.freedesktop.org/gstreamer/gst-plugins-bad
cd gst-plugins-bad/
git checkout -b 1.14.0 1.14.0
コンフィグしてmake
ビルドに必要なライブラリとヘッダファイルはsudo apt build-dep gstreamer1.0-plugins-bad
を実行すれば一発で揃います。
sudo apt build-dep gstreamer1.0-plugins-bad
./autogen.sh
make
SRTのプラグインがどこにできているかさがします。
$ find . -name "*.so" |grep srt
./ext/srt/.libs/libgstsrt.so
./ext/srtp/.libs/libgstsrtp.so
SRTのプラグインだけビルドする方法がわからなかったので全部ビルドしたけど、実はext/srt
の下でmakeすればよいだけでした。
インストール
SRTのプラグインの共有ライブラリだけをgstreamerのディレクトリにコピーします。
sudo cp ext/srt/.libs/libgstsrt.so /usr/lib/x86_64-linux-gnu/gstreamer-1.0/
gst-inspect-1.0 でSRTのプラグインが認識されているか確認します。
$ gst-inspect-1.0 |grep srt
srt: srtserversink: SRT server sink
srt: srtclientsink: SRT client sink
srt: srtserversrc: SRT Server source
srt: srtclientsrc: SRT client source
dtls: dtlssrtpdemux: DTLS SRTP Demultiplexer
dtls: dtlssrtpenc: DTLS-SRTP Encoder
dtls: dtlssrtpdec: DTLS-SRTP Decoder
subenc: srtenc: Srt encoder
subparse: subparse_typefind: srt, sub, mpsub, mdvd, smi, txt, dks, vtt
srtp: srtpdec: SRTP decoder
srtp: srtpenc: SRTP encoder
最初の4行がSRTのプラグイン。
これでSRTのプラグインがインストール完了。
VLC
VLCは3.0からSRTがサポートされました。
Mac用のVLCのバイナリ Version 3.0.2 Vetinari (Intel 64bit)
を以下のサイトからダウンロードしました。
https://www.videolan.org/vlc/index.ja.html
なお、VLCではSRTはmode=callerとしてしか動作しません。(ソースコードをみて確認しました。)
つまり、映像の送り側がsocketをlistenしているところにVLCで接続して再生するという使用形態になります。
gstreamerからテストパターンを送ってVLCで再生する
GCEのファイアウォールの設定を変更して、udpの7000-7100 を開けました。
そして以下のスクリプトを実行。
#!/bin/sh
gst-launch-1.0 -v \
videotestsrc is-live=true pattern=ball \
! video/x-raw,width=640,height=360,framerate=30/1 \
! x264enc tune=zerolatency key-int-max=60 \
! mpegtsmux \
! srtserversink uri="srt://:7002" latency=500
手元のMacBook ProからVLCを起動して "srt://ipaddr:7002" を開くとボールが動き回るテストパターンが見られました。
ipaddr
は仮想マシンの外部IPアドレス。
今回使用した仮想マシンはアメリカの東海岸にあり、ネットワーク的に遠いです。
$ ping -c 5 ipaddr
PING i2 (35.231.224.199): 56 data bytes
64 bytes from 35.231.224.199: icmp_seq=0 ttl=53 time=198.849 ms
64 bytes from 35.231.224.199: icmp_seq=1 ttl=53 time=169.214 ms
64 bytes from 35.231.224.199: icmp_seq=2 ttl=53 time=168.658 ms
64 bytes from 35.231.224.199: icmp_seq=3 ttl=53 time=269.872 ms
64 bytes from 35.231.224.199: icmp_seq=4 ttl=53 time=168.521 ms
--- i2 ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 168.521/195.023/269.872/39.193 ms
SRTのデフォルトのlatencyは125ms なのですが、これだとパケットの再送が間に合わないので、500ms に伸ばしました。srtserversink のlatency=500
また、この状態で別のマシンから
ffplay -i srt://ipaddr:7002
で再生することもできました。つまり複数のクライアントと接続できました。
参考
SRT in GStreamer
ffmpeg 4.0 に入った新しい映像伝送プロトコルSRTを試す
ffmpeg 4.0 をlibsrtを有効にしてビルドする