WebRTCで動画配信をする時に考えたこと

Tips
2020年04月08日 10:00

概要

動画を配信・視聴するアプリケーションを作りたいと思い、色々と調査をしたので、その内容について書きます。

また、今回は動画配信として、ブラウザ等で使うことができるWebRTCを使用することを予め考えていたので、主にWebRTCを採用する際に考えたことについてがメインとなっています。

WebRTCとは

WebRTCは、ブラウザを使って動画や音声を配信するためのAPIです。これを使うことで、ブラウザ等で楽に動画や音声の配信を行うことができます。

似たようなものに、WebSocketというものがありますが、これはブラウザ上でソケット通信のようなことを行うための規格で、WebRTCとは別物です。
しかし、WebRTCで通信をする際に行うシグナリングではWebSocketが使われるため、完全に無関係とは言えません。

WebRTCの大きな特徴として、P2Pの通信であるということががあります。

WebRTCの負荷

P2Pの通信ということは1台のコンピュータによる配信を100人で見るという場合、それぞれのコンピュータとコネクションを確立する必要があり、負荷が高くなることが分かります。また、それだけの帯域も必要になります。

基本的に、配信するデータの内容にもよりますが、音声・動画共に、少なくとも100人の配信はできないと思われます。

そこで、色々と調べてみるとWebRTCの配信の方法には、直接全てのコンピュータを繋ぐメッシュタイプの他に、SFUとMCUというものがあるということがわかりました。

SFUは、サーバ経由でデータを配信する方法です。サーバから配信するといっても、あくまでもサーバを経由するだけであるので、配信側が複数ある場合、視聴側では、その数だけサーバとコネクションが確立されます。

MCUは、SFUと同じでサーバ経由で配信する方法ですが、サーバ側で送られてきた複数のデータを統合して配信することができます。つまり、視聴者のサーバとのコネクションがひとつで済むということです。そのため、SFUよりもサーバの負荷が増えますがクライアントの負荷が抑えられ、100人規模のようなレベルの双方向での配信ができます。多分、会議とかでこの方法が使われると思います。

私の場合、会議のようなアプリケーションを作成するわけではなく、また配信するのは全員ではないため、サーバの負荷を抑えるためにSFUを採用することにしました。

これらの仕組みをブラウザにあるWebRTCのAPIで実現するのは、かなり大変なようです。そのためツール等を使って実現するというのが一般的なようです。

ツールについて

私が主に書きたいのはここの部分です。

WebRTCを使ってSFUを実現するには、ツールを使うのが一般的なようですが、このツールは無料のものや有料のものなどいくつかあります。

次のページでツールについて説明があり、参考になります。

http://iwashi.co/2016/09/03/webrtc-sfu-mcu-summary

私はこのページを参考にして、無料で使えるもので、高機能なものとしてJanusを採用することにしました。

TURN/STUNについて

WebRTCの欠点として、P2Pで接続するということで、NATやファイアウォールで正常に通信ができないことがあるということがあります。

TURNやSTUNは、P2Pで接続する際の仲介をするものですが、STUNサーバを使う場合、30パーセントほどの環境で使えないことがあるということで、基本的にSTUNとTURNの両方のサーバを用意して、STUNサーバで接続できない場合に、TURNサーバを使うということをするのが良さそうです。

TURNサーバは無料で使えるものもあるようですが、STUNに比べるとあまり数は多くなく、OSSで開発されているサーバを自分でホストティングした方が良いように思います。
ホスティングする場合は、帯域について気をつける必要がありそうです。

Janusについて

Janusを使って、SFUによるWebRTC通信を実現しようとしたのですが、かなり情報が少ないということに気づきました。

私は、公式のデモサイトのVideoRoomというデモを参考に実装しました。

https://janus.conf.meetecho.com/videoroomtest.html

ただ、他に参考になる情報は、私が探した限り見つけられませんでした。強いていうならば、同じくデモサイトの公式ドキュメントなのですが、公式ドキュメントに関するデータも思っていたより情報が少なく、コードを書いては動作確認をするということの繰り返しでした。

動画や音声以外の通信

私の場合、動画の他にチャット機能のようなものを付けようと思っていました。しかし、WebRTCは動画や音声を送るためのものです。そのため、動画や音声以外の、例えばテキストデータなどを送る場合は、WebRTC以外のものを使うことを考えなければなりません。

そこで、今回はWebSocketを使うことにしました。WebSocketを使うと、テキストが送信された際にすぐにその情報を反映することが可能です。

まとめ

そもそも、動画・音声配信はかなり面倒なものです。そのため、WebRTCがあったとしても昔よりは簡単ですが、誰でも簡単にできるかと言われれば難しいということなのかなと思います。

あとは、あまりWebRTCを使う人が少ない、もしくは企業で使うということなのか、情報がほとんどありません。

以上のことから、WebRTCを使って大規模なことをする場合は、有料のツールを使ってサポートを受けて少し楽をするか、無料のものを使い試行錯誤をしながら実現するかを選択する必要があると思います。
逆にWebRTCで小規模なことや、簡単なことをする場合は、SFUやMCUで接続する必要はないため、ツールを使わずに済み、それほど苦労をすることはないと思います。