WebRTC SFU Sora の今後

2021年 11 月版

V
V
Nov 23, 2021 · 19 min read

2021 年 11 月版です。1 ヶ月前のをアップデートしていく書き方をしていますので、先月と重複箇所が多くあります。

リリース

Sora は毎年 6 月と 12 月に大きめのリリースを行います。それ以外はバグ修正などがメインとなります。その他に実験的機能を中心としたリリースを行う事もあります。

2021 年 12 月に 2021.2 のリリースを予定しています。クラスター機能、DataChannel 部分信頼や順不同対応、DataChannel のメッセージング機能、統計エクスポーター機能に対応予定です。

  • クラスター機能
  • ロードバランス機能
  • 統計情報エクスポーター機能
  • DataChannel 部分信頼対応
  • DataChannel 順不同対応
  • DataChannel メッセージング機能
  • スポットライト機能強化
  • 音声 FEC 対応
  • AV1 録画
  • ディザスターリカバリー機能
  • クラスター機能改善
  • スポットライト機能改善
  • 帯域推定改善
  • DataChannel 改善
  • 暗号負荷削減
  • AV1 / VP9 Simulcast 対応
  • シグナリング経由での音量通知
  • WebTransport 対応
  • WHIP 対応
  • ACME-SSO / SPacket / MLS を利用した E2EE の実現

開発版の提供

現在お試し的な感じでテクニカルサポート契約を結んでいただいているお客様向けに開発版の提供を初めて見ています。

クラスター機能

ディザスタリーリカバリー機能に向けて、まずは同一ネットワークでのクラスター機能を搭載しました。これは主に Sora の運用を楽にするための機能です。

クラスターの機能としてはシンプルで、接続時に「そのチャネル ID の場合はどの Sora ノードに繋ぐ」という情報を返すだけです。

Sora クラスターでは、どのチャネル ID がどの Sora ノードが担当するというのを共有しています。今のところ 1 クラスター Sora 10 ノードを想定しています。

現在 5 ノードでクラスターで動かしてみていますが安定して動作しています。

詳細については以下をご確認ください。

Sora 開発版ドキュメントにクラスターの仕様を公開しています。
https://sora-doc-dev.shiguredo.jp/cluster

Sora Labo にて 5ノードのクラスタを体験できますので興味ある方はどうぞ。

WebRTC SFU はロードバランシングがとても面倒ですが、クラスター機能を利用すると何かを意識すること無くロードバランスが可能になります。Sora のクラスターは接続割合が低いノードに新しいチャネル ID の担当を割り当ててくれるようになるためです。

クライアント側に複数のシグナリング URL を持たせられる仕組みを追加し、利用者はロードバランシング可能になりました。

今後は接続割合だけでなく CPU 使用率やネットワーク利用率なども加味したノード割り当てを実現できればと思います。

クラスター同士を別拠点で同期する仕組みです。かなり難易度は高いのですがチャレンジしていく予定です。最終的には大陸間でのクラスター実現を目指します。

統計機能

Sora は多くの統計情報を中にため込んでいます。統計情報は、最新の一つだけを取得できる仕様にしていますが、特にクライアントから送られてきている統計情報は過去の情報も見たいという場合があります。

クライアントから送られてくる統計情報を HTTP/2 経由でコレクターサーバに送る仕組みを追加しました。

この機能を利用することでクライアント側の情報を時系列でデータベースなどにため込み、解析することが可能になります。HTTP/2 は h2/h2c の両方に対応しています。

stats_collector_url = https://example.com/collector

今後は Kohaku を利用する事で気軽に TimescaleDB (PostgreSQL 互換の TSDB) データをため込めるようになります。Grafana での可視化に向けたダッシュボードの公開も進めていきます。

スポットライト機能

スポットライト機能は Sora が独自に実装しているサイマルキャスト機能を活用した仕組みです。

最近ではさらにお客様のサービスに合わせて色々と設定を変えられるように作り込んでいます。

RequestSpotlightRid やそれをまとめて行う BatchRequestSpotlightRid 機能を提供する予定です。この機能はスポットライト機能でフォーカス時とアンフォーカス時に利用する rid を変更する機能です。

これを利用する事で一時的にアンフォーカスな人の映像を受信しないなどが実現できます。

WebRTC で利用するデータはすべて暗号化されており、SFU で一度かならず復号されます。ただ、スポットライト機能を利用する参加者の多い会議などでは、発言していない参加者の音声パケットや映像パケットを必ずしも配信する必要がないケースがあります。

不要な音声パケットや映像パケットは受信して復号するだけ無駄なので、復号せずにパケットを破棄する仕組みを入れる予定です。これでかなりの復号負荷を下げられると考えています。

サイマルキャストでも同様の仕組みを採用できればと考えています。

シグナリング

WebRTC のキモといっていいシグナリングですが、WebSocket から DataChannel に切り替える仕組みを追加しました。最初だけは WebSocket を利用しますが、その後は DataChannel を利用します。

ずっと要望を頂いていたものの、WebSocket 経由だと他の通信の邪魔になってしまうという事から採用を見送っていました。DataChannel 化することでストリームを分けて配信できるようになるため、対応していく予定です。

End to End Encryption

SaaS 提供に向けて優先度を下げてます。SaaS 提供後は最優先で実現したい機能の一つです。

Cisco が発表した ACME-SSO を利用した証明書の信頼性チェック機能を導入したいと考えています。これは完全に Sora から切り離される仕組みなので、OSS として公開していく予定です。

ACME-SSO については詳細は別途まとめていますので、興味のある方は是非。

今後は MLS にも手を出していこうと考えています。ただ、仕様が落ち着いていないため、当面は調査になりそうです。

libwebrtc には E2EE 用のインターフェースがあることがわかったため、何かしらで実現できればと考えています。

E2EE 経由でメッセージング機能を実装しようか検討中です。現在 Double Ratchet は Sender Key の配送にのみ利用していますが、 E2EE メッセージの配送にも利用できるようにしたいと考えています。

e2ee_messaging = true

メッセージング機能

Sora は今まで音声と映像のみに特化してきましたが、今後はメッセージングにも対応していきます。これは WebRTC の DataChannel を Sora でも利用できるようにしたためです。

DataChannel を利用したメッセージングを利用するには以下のような設定を有効にする必要があります。

default_data_channel_messaging = true

Sora 開発版ドキュメントに DataChannel メッセージングの仕様を公開しています。
https://sora-doc-dev.shiguredo.jp/data_channel_messaging

メッセージングを使う場合はシグナリング接続時に data_channels を指定し、その中で prefix に # をつけたラベルを指定します。

いつも通り data_channels は認証成功時の戻り値にも指定できます。

data_channels: [
{"label": "#spam", "direction": "sendrecv"},
{"label": "#egg", "direction": "recvonly"}
]

メッセージングを利用する場合、ユーザ定義の DataChannel でラベル # から始める必要があります。これは Sora がデフォルトで利用している DataChannel のラベルと区別するためです。

DataChannel には方向という概念が無くやりたい放題できるため、Sora では SCTP レイヤーに独自に手を入れて方向性の仕組みを追加しています。ただし DataChannel とは完全互換です。あくまで悪意ある攻撃を防ぐための仕組みとして存在しています。

方向を role と同じように sendrecv / sendonly / recvonly の 3 つの方向を用意することで、より DataChannel をコントロールしやすくしています。

メッセージは指定したラベルで方向を sendrecv または recvonly に指定している自分以外のクライアント全員に配信されます。

現時点で、個別の配信は個別の label を用意する事で解決するという方針です。さらに動的な DataChannel 作成はできないようにしています。

Sora 2021.1に実装されている DataChannel は到達保証と順序保証があるものだけでしたが、DataChannel の魅力である部分信頼性(再送回数や再送時間を指定できる)や順不同を利用できるようにします。

再送回数は max_retransmits で、再送時間は max_paket_life_time で指定可能です。これは DataChannel と内容はと同じです。ラベル毎に指定できます。順番保証は ordered: true/false で指定可能です。

あたりまえですが、max_packet_life_time と max_retransmits は同時に指定することはできません。

data_channel_messaging: [
{"label": "#spam", "direction": "sendrecv", "max_packet_life_time": 3000},
{"label": "#egg", "direction": "recvonly", "max_retransmits": 1}
]

録画

出力ファイルの MP4 対応を考えていましたが、一番の問題児だった Safari が WebM 対応を始めたので、優先順位がかなり下がりました。

ただ、現時点ではいろいろ対応できていないので、Hisui で MP4 (VP9/Opus) に変換することをお勧めします。

Chrome M90 で AV1 への対応をしたこともあり、AV1 での録画に対応しました。

廃止機能

CentOS 8 のサポート終了に合わせて、2021 年 12 月末にてサポートを終了します。

2021 年 12 月リリース予定の Sora で廃止します。

その他

Chrome で AV1 / VP9 のサイマルキャストへ対応が予定されているため、そちらにも対応予定です。

Chrome M94 で対応した音声 RED に対応しました。パケロス 30% でも音声が聞き取れるなことを確認しました。

現在 SDP はマルチストリームを利用した場合に増え続けるばかりですが、再利用できるように変更する予定です。

Sora デモ機能を Sora DevTools (Sora 開発ツール) に名前を変更し、開発版を気軽に触れるようにしました。

https://sora-devtools.shiguredo.jp/

クラスター機能と DataChannel メッセージング機能に対応しました。さらにコンテンツヒントも指定できるようになりました。

Sora SDK

Sora SDK も継続的に開発しています。また、コミュニティからのフィードバックを可能な範囲で取り入れています。全ての SDK でサイマルキャストとスポットライト機能、データチャネル機能が利用できるようにしたいと思っています。

クラスター機能に対応済みです。DataChannel メッセージング機能に対応済みです。

仮想背景機能などストリームに対する前処理を独立したライブラリとして OSS にて提供予定です。こちらは来年前半に向けて提供できればと考えています。

Chrome M94 にてInsertable streams for MediaStreamTrack が入ったこともあり、弊社でできる範囲でやっていくことにしました。

DataChannel シグナリング、DataChannel メッセージングに対応済みです。M96 バージョンに向けて作業を進める予定です。

カメラ周りの改善、SwiftPM への対応を行いました。今後は libwebrtc M95 へのアップデート、 DataChannel シグナリング機能に対応してリリース予定です。その後 libwebrtc M97 や DataChannel メッセージ、クラスター対応を予定しています。

DataChannel への対応済みです。DataChannel メッセージや libwebrtc M96 へのアップデート、クラスター対応を予定しています。

新しく C++ SDK を開発予定です。この SDK は iOS / Android / Unity / Momo / Zakuro のベースとなる SDK になります。来年前半に提供を開始できればと思います。

いったん Sora とは別に独立したサーバとして実装中です。将来的には Sora に組み込んで利用できるようにします。

まずはブラウザから利用できるようにして、WebCodecs と組み合わせて色々と実験していければと考えています。WebTransport サーバ自体も Sora Labo で公開して、誰でも気軽に触れるようにできればと思っています。

2021 年 11 月頃に本格的に Chrome で利用できるようになるため、来年後半からはテクニカルサポート契約をしていただいているお客様向けに試作版を提供できればと思います。

Sora を採用したくなる OSS

時雨堂の今期の方針として「Sora を採用したくなる OSS の提供」をかかげました。Sora や Sora SDK をより良くしているのはもちろん、それ以外の部分で「あ、このツールがあるなら Sora を採用しよう」と思えるものを提供していこうという考えからです。

それらのツールは Sora 専用ですが、Sora はそれらのツールに依存するものではなく、他の OSS などでも実現可能です。

実際、今期は負荷試験ツール Zakuro と録画合成ツール Hisui をリリースできました。また統計ツール Kohaku もリリースに向けて進めています。

詳細は以下に書いてありますので、興味ある方は読んでみてください。

かなり力を入れており、多くの機能を追加しています。WebRTC フェイクネットワークや、新しく入った dcsctp を利用する機能などが追加されています。DataChannel メッセージング向けの負荷試験機能も追加しました。

zakuro:
instances:
- name: zakuro
vcs: 2
sora:
signaling-url: "wss://sora.example.com/signaling"
channel-id: sora
role: sendrecv
multistream: true
data-channel-signaling: true
data-channel-messaging:
- label: "#test"
direction: "sendrecv"
interval: 300
size_min: 100
size_max: 1000

レイアウト機能、タイトルやユーザ名追加、AV1 出力機能などを追加予定です。

レイアウト機能は特定の映像だけを 640x480 で出力し、それ以外の音声は全員含めた一つの映像を作ったり、複数の映像を複雑なレイアウトを指定できるようになります。

複雑なレイアウトをシンプルな JSON 指定で実現できるようにします。

Sora にすでにあるリモート統計機能で取得しているクライアントの統計情報を HTTP/2 経由で収集し、TSDB に突っ込みリアルタイムな解析ができるようにするというものです。

Sora からクライアントとサーバの統計情報を受け取り、TimescaleDB に入れ込む Kohaku を提供します。Kohaku で加工なども行える用にして行ければと思っています。現在リリースに向けて開発中です。

統計情報をどのようにデータベースにため込むか、どうやって集計していくのかはとても難しい課題のため、そのまま使え、さらにカスタマイズも自由に行える仕組みを提供できればと思います。

TSDB には TimescaleDB 、可視化には Grafana を採用しています。

Sora Labo

Sora Labo のサンプルを Sora DevTools に置き換えました。さらに今まではシングルノードのみでしたが、クラスター & ロードバランス機能を体験できるように 5ノードのクラスターを組んだ Sora を体験できるようになりました。

サービス

Sora がパッケージとして売れており、会社としても安定してきたことから、Sora を気軽に利用できるようにするサービスを作る事にしました。

WebRTC SFU Sora as a Service Tobi

Sora を利用した「転送量課金」ではない「帯域課金」なサービスを提供する準備をしています。2022 年中に提供を開始予定です。

4K 30 fps や 1080p 60 fps を配信を長時間できるようになるサービスです。転送量を気にすること無く使うことができるサービスを目指します。

詳細は以下や、開発ログをご確認ください。

WebRTC SFU Sora Capacity Planing Service Lemon

Sora と Zakuro と Kohaku を連携したキャパシティプランニングサービスを提供を検討しています。

自分が想定しているシナリオをセットすると CPU 負荷やメモリーなどが確認できる仕組みです。

タスクを用意して、負荷をかけて、レポートが見れる仕組みです。ここで検証した結果はログインしている誰もが見られるようにする予定です。

詳細は開発ログをどうぞ。

2021 年 10 月版は以下からどうぞ

shiguredo

時雨堂ノハナシ

shiguredo

時雨堂ノハナシ

V

Written by

V

Erlang/OTP / 時雨堂 / WebRTC / E2EE

shiguredo

時雨堂ノハナシ