GStreamer から WebRTC Janus に配信を行う

WebRTC Janus

WebRTC Janus は GPLv3 でライセンスされるオープンソースの WebRTC SFU サーバーです。
WebRTC では、P2P で相互に接続を行い映像・音声のやり取りを行なっていましたが、WebRTC SFU では、一度 SFU サーバを経由して映像・音声のやり取りを行います。

P2P では、接続する端末数が増えることで、端末の数だけ送信・受信のための通信が必要になってしまいますが、SFU では、SFU サーバに対して配信することで、SFU サーバに接続する各端末に配信できます。 そのために、大勢が視聴するようなライブ配信などに SFU が用いられることがあります。 その反面、SFU は、一旦サーバを経由するために P2P よりも遅延が大きくなるために、リアルタイム性が低くなってしまいます。

WebRTC Janus は、以下のページからダウンロードして使用することができます。
https://github.com/meetecho/janus-gateway

SFU

SFU とは、映像や音声などのデータを各端末から SFU サーバーにデータを送信し、SFU サーバーから複数の端末にデータを共有します。

P2P

P2P(Peer-to-Peer)とは、互いの端末がサーバーを中継することなく端末同士で直接データを共有します。

WebRTC Janus Plugins

WebRTC Janus は、プラグインとして様々な機能を提供しています。

以下が提供されているプラグインの一覧になります。

  • EchoTest Plugin
  • Streaming Plugin
  • VideoCall Plugin
  • SIP Plugin
  • NoSIP Plugin
  • AudioBridge Plugin
  • VideoRoom Plugin
  • Record&Play Plugin
  • VoiceMail Plugin
  • Lua Plugin
  • Javascript Plugin

標準で用意されているプラグインで、ほとんどの機能が揃っています。


Streaming Plugin

Streaming Plugin は、映像・音声を配信するための機能を提供します。
今回は、このプラグインを使用して映像・音声を配信します。

Streaming Plugin は以下の janus.plugin.streaming.jcfg で設定を行います。

janus.plugin.streaming.jcfg 設定

rtp-sample: {
	type = "rtp"
	id = 1
	description = "Opus/VP8 live stream coming from external source"
	metadata = "You can use this metadata section to put any info you want!"
	audio = true
	video = true
	audioport = 5002
	audiopt = 111
	audiocodec = "opus"
	videoport = 5004
	videopt = 100
	videocodec = "vp8"
	secret = "adminpwd"
}

デフォルトの設定で、上記のように映像と音声を受信するためのポートが指定されています。

このポートに対して、gstreamer を使用して映像と音声を配信します。

gst-launch-1.0 
  audiotestsrc ! 
    audioresample ! audio/x-raw,channels=1,rate=48000 ! 
    opusenc bitrate=20000 ! 
      rtpopuspay ! udpsink host=webrtc-janus port=5002 
  videotestsrc ! 
    video/x-raw,width=640,height=480,framerate=30/1 ! 
    videoconvert ! timeoverlay ! 
    vp8enc error-resilient=1 ! 
      rtpvp8pay mtu=1500 ! udpsink host=webrtc-janus port=5004

サンプル

上記の配信を行うサンプルプログラムは、github にソースコードがあります。
https://github.com/nobuo-kobayashi/docker-webrtc-janus

上記のサイトからソースコードをクローンして、下記のようにして実行します。

$ docker-compose build
$ docker-compose up

上記で配信した映像と音声を確認するには、WebRTC Janus のデモページが用意されていますので、そちらを使用します。

Chrome ブラウザで、 https://${ローカルアドレス}:8000 を開くと、デモページを表示することができます。

メニューから Demos を開き、Straming を選択します。

Straming Plugin のでも画面への遷移後、Start ボタンを押下します。

今回の設定では、Opus/VP8 live stream coming from external source に対して、映像・音声を配信していますので、Streams を開き、リストから選択し、Watch or Listen ボタンを押下します。

映像・音声が配信できていれば、テスト映像が配信されていることが確認できます。

Streaming Plugin を使用することで、WebRTC Janus を経由して、多人数への映像配信が行えるようになります。 また、Streaming Plugin の設定を変えることにより、複数の映像も配信できるようになりますので、多視点の映像を配信することなどもできるようになります。