更新: | 2018-08-20 |
---|---|
作者: | @voluntas |
バージョン: | 18.8.3 |
URL: | https://voluntas.github.io/ |
この記事が良いと思ったらこの記事に Star をお願いします
定期的にアップデートしていきます
WebRTC を利用した配信システムを開発しているのですが、超低遅延で大規模配信が見えてきたので実際に実現可能な内容で書いていきます。
残念ながらまだ妄想ですが、最終的には動くものを提供したいと考えています。
WebRTC 関連の知識は一通り要求するので、以下でざっくり WebRTC について把握してから読んでください。
- 通信技術には WebRTC を利用する
- Chrome や Firefox といったブラウザで視聴ができる
- 大規模というのは 1:10000 以上を指す
- 超低遅延というのは 500 ミリ以下を指す
- 配信は全てサーバ経由で行う
- CDN などは一切使わない
音声には Opus 、映像には VP8 を利用します。VP9 や AV1 を利用したいところですが VP9 にはまだ Simulcast が来ていませんし、AV1 は WebRTC では非対応です。iOS を考えると H.264 を使いたいところですが H.264 の Simulcast は動作確認できていません。
WebRTC SFU を利用する。配信者が直接配信するのではなくサーバ経由で配信を行うことで配信者の負荷を減らし、さらに配信数を引き上げます。
WebRTC SFU を複数利用しリレー配信(Origin/Edge) を行います。リレーといっても多段は 1 つのみです。1 台の WebRTC SFU で 300 クライアントまで配信を想定しています。
-> WebRTC SFU (Edge) -> WebRTC SFU (Edge) -> WebRTC SFU (Edge) -> WebRTC SFU (Edge) WebRTC SFU (Origin) -> WebRTC SFU (Edge) -> WebRTC SFU (Edge) -> WebRTC SFU (Edge) -> WebRTC SFU (Edge) -> WebRTC SFU (Edge)
Origin で配信からの映像を受けて、視聴者はどれかの Edge につなぐという方式です。これで Edge を増やせば増やすだけ配信数を増やすことができるようになります。Edge はまずは 100 までは増やせると考えており、おそらく最大 30000 視聴者までは配信が可能になります。
Simulcast は1つの配信で複数の解像度の映像を配信する技術です。この技術が必要な理由は視聴者側にあります。
配信者がいくら高解像度できれいな映像を送ったとしても視聴者の回線が細かった場合はその映像を受け取ることができません。
例えば 1 万人の視聴者がいた場合、間違いなく様々な帯域やマシンスペックが存在することになります。そのため WebRTC SFU を利用してただ配信するだけでは、配信者が期待する帯域を持っている必要が出てしまいます。それでは大規模配信を実現したとは言えません。
Simulcast を利用することで複数の解像度を WebRTC SFU に送り、視聴者に合う解像度のみを配信する仕組みが必要になります。
例えば配信者は HD で 2.5Mbps で配信しているとします。視聴者は 300Kbps しか帯域がない場合は一切映像を見ることができません。そこで Simulcast を利用します。
配信者は HD 2.5M 以外に VGA 500K と QVGA 150K な解像度で映像を WebRTC SFU に送ります。WebRTC SFU は帯域推定を利用して視聴者のビットレートを推測し、QVGA 150K な映像を送ります。
この仕組を利用することで様々な環境の視聴者を許容することが可能になります。
複数の解像度を変換するため、配信者の CPU 使用率が跳ね上がってしまうのではないか?という疑問ですが私もそう思っておりました。ただ現実は先程の 2.5M / 500K / 150K の 3 種類であれば 2.5M を配信するよりも 30% 程度 CPU 使用率が上がる程度ですので安心してください。
30% 程度の理由としては、ソースは一つだけであること、HD,VGA (HD の 1/4),QVGA (HD の 1/16) と半分ずつの解像度になっていることから 100 * 1/4 + 100 * 1/16 で 31% 増ということで、CPU 使用率と一致するという感じのようです。
最近は映像ではなく音声とモーションデータだけを送りたいという要望が多くあります。これは VR を利用したライブ配信とかで映像ではなくモーションデータだけを送ることで、映像よりも転送量を抑えることができる仕組みです。
その場合は WebRTC のデータチャネル (SCTP over DTLS over UDP) を利用することで、超低遅延でデータを配信することができます。この仕組もリレー機能を活用することで大規模な配信も実現可能だと考えています。
VP8 + WebRTC SFU + Simulcast + リレーを利用することで数万人規模に対して 500 ミリ以下の超低遅延で音声や映像を配信することが可能になります。さらには WebRTC のデータチャネルを利用することで文字列やバイナリなどのデータも配信可能です。
WebRTC という既存の技術を使うことで超低遅延で大規模に配信することが現実的になってきています。
ただし 10 万人などの超大規模に対しては HLS/MPEG-DASH + CDN という世界を利用すべきだと考えています。超大規模で超低遅延の需要はスポーツ中継とかでしょうか ... このあたりは、まだなんとも言えないのが現状です。