新しい映像伝送プロトコルSRTをgstreamerとVLCで試す

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 のビルドとインストール

[こちら](https://qiita.com/tetsu_koba/items/92c398abd96c651f4035#libsrt%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89%E3%81%A8%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) を参照。

## ソースコードの取得

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 を開けました。
そして以下のスクリプトを実行。

```sh
#!/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](https://www.collabora.com/news-and-blog/blog/2018/02/16/srt-in-gstreamer/)
[ffmpeg 4.0 に入った新しい映像伝送プロトコルSRTを試す](https://qiita.com/tetsu_koba/items/b8e1868a726c6201d3ab)
[ffmpeg 4.0 をlibsrtを有効にしてビルドする](https://qiita.com/tetsu_koba/items/92c398abd96c651f4035)