streaming
VLC
gstreamer
SRT

新しい映像伝送プロトコル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 のビルドとインストール

こちら を参照。

ソースコードの取得

gstreamer全てをビルドするのは大変なので、SRTのプラグインが含まれているソースコードだけをとってきて、バージョンを1.14.0 に合わせます。

cd gst-plugins-bad/
git checkout -b 1.14.0 1.14.0

コンフィグしてmake

ビルドに必要なライブラリとヘッダファイルはsudo apt build-dep gstreamer1.0-plugins-bad を実行すれば一発で揃います。
SRTのプラグインだけ

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を有効にしてビルドする