Skip to content

Instantly share code, notes, and snippets.

@voluntas
Last active April 19, 2024 12:05
Show Gist options
  • Star 48 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save voluntas/e914aa245fc26f3133c2 to your computer and use it in GitHub Desktop.
Save voluntas/e914aa245fc26f3133c2 to your computer and use it in GitHub Desktop.
時雨堂 WebRTC SFU Sora 開発ログ

時雨堂 WebRTC SFU Sora 開発ログ

日時

2024-04-19

時雨堂

バージョン

2024.1

url

https://sora.shiguredo.jp/

depth

2

概要

時雨堂 が 1 から開発し、販売している WebRTC SFU の開発ログです。

WebRTC SFU Sora

興味がある方は sora at shiguredo.jp までご連絡ください (このメールアドレスへの特定電子メールの送信を拒否いたします)

時雨堂ノハナシ

Medium にて WebRTC SFU Sora についての技術的な記事を公開しています。是非覗いてみてください。

https://medium.com/shiguredo/tagged/sora

Sora Labo

WebRTC SFU Sora を検証目的であれば無料で試せる Sora Labo というサービスを公開しています。 GitHub のアカウントだけあればすぐに利用可能なので是非試してみて下さい。

Sora Labo

Sora Cloud

WebRTC SFU Sora のクラウド版です。同時接続数と利用帯域での課金で、転送量や利用時間では課金されません。

Sora Cloud

セミナー

不定期オンラインセミナー

不定期ではありますが、時雨堂製品についての最新情報を話す雑談イベントを開催しています。

時雨堂 WebRTC 不定期オンライン雑談配信 (SHIGURADIO)

SFU

SFU は Selective Forwarding Unit の略で、簡単に言えば SFU と呼ばれるサーバが音声や映像、 またはそれ以外のデータを配信者に変わって複数の視聴者に配信してくれる仕組みです。

また SFU は音声や映像を再変換せず配信するため、 サーバを経由したとしても遅延を 1 秒未満に抑えることが可能になります。

片方向配信

SFU を利用すれば 1:N の配信を気軽に行う事ができます。もちろん 2:N や 3:N と配信者を複数にすることも可能です。

/ -> WebRTC -> 視聴者 

/ -> WebRTC -> 視聴者

配信者 -> WebRTC -> SFU -> WebRTC -> 視聴者
-> WebRTC -> 視聴者

-> WebRTC -> 視聴者

双方向配信

SFU の配信機能を応用することで複数人の配信を一つの PeerConnection で利用することができます。

この機能は「マルチストリーム」と呼ばれています。 つまり自分の映像を複数人に配信せず、そこは SFU に任せ、他の人の映像のみを受け取るとい仕組みです。

参加者 A <- (WebRTC) ->     <- (WebRTC) -> 参加者 D
参加者 B <- (WebRTC) -> SFU <- (WebRTC) -> 参加者 E
参加者 C <- (WebRTC) ->     <- (WebRTC) -> 参加者 F

全員がそろってから開始するため、その人の映像や音声は後から設定されます。 マルチストリームを利用することで、一つの PeerConnection 上に動的に映像や音声を追加削除する仕組みがマルチストリームです。

クライアントは ontrack のコールバックを利用し、複数人数での映像音声の仕組みを利用することができます。

参加者の詳細:

-> 自分 A の映像       (WebRTC) ->
参加者 A <- 他の参加者 B の映像 (WebRTC) <- SFU

<- 他の参加者 C の映像 (WebRTC) <-

さらに Sora を利用すればこの複数人数の映像を全てサーバサイドで録画することができます。

サイマルキャスト配信

サイマルキャストは配信者が複数の画質の映像を送ることで、視聴者が画質を選択できるようになります。 この機能はクライアント側と SFU 側両方がサイマルキャストでの配信に対応している必要があります。

/ -> WebRTC(高画質) -> 視聴者 

-> WebRTC(高画質) -> / -> WebRTC(中画質) -> 視聴者

配信者 -> WebRTC(中画質) -> SFU -> WebRTC(中画質) -> 視聴者
-> WebRTC(低画質) -> -> WebRTC(中画質) -> 視聴者

-> WebRTC(低画質) -> 視聴者

双方向配信とサイマルキャスト

双方向配信とサイマルキャストを組み合わせることで、 複数人の配信でも「自信が受信したい画質」を選択して受信することができるようになります。 マシンスペックが低かったり、回線が不安定な場合は低画質の配信、低画質の受信を選択できます。

WebRTC SFU の課題である「全員が同じ画質を受信する必要がある」というものを解決する、画期的な仕組みです。

-> WebRTC(高画質) ->
参加者 A -> WebRTC(中画質) -> <- WebRTC(中画質) <-

-> WebRTC(低画質) -> SFU <- WebRTC(低画質) <- 参加者 B <- WebRTC(高画質) <- -> WebRTC(低画質) ->

スポットライト

時雨堂独自の機能です

双方向配信とサイマルキャストを組み合わせるて、さらに発話しているかどうかの判断を利用することで、 直近で話をした N 人は高画質で音声あり、それ以外は低画質で音声なしという仕組みを提供しています。 これによりクライアントとサーバ両方の CPU 負荷、ネットワーク負荷を削減することができるようになります。

受信する映像の画質はクライアント単位で指定でき、話をしたとしても映像を受信しないなども実現可能です。

SFU をもっと詳しく知りたい方向け

WebRTC SFU コトハジメ

ブラウザ対応

最新の Chrome / Firefox / Safari / Edge とすべての主要ブラウザに対応済みです。

OBS 対応

OBS Studio 30 から WebRTC 経由で音声や映像を直接 WebRTC SFU に送れるようになります。

image

目的

WebRTC は映像と音声をリアルタイムに配信する仕組みです。ただ P2P の場合は大量の配信を行うことは難しくなります。 そこでサーバを経由することで遅延が少ない状態で配信を 1000 人といった規模に対して配信が可能になります。

通常の WebRTC はブラウザとブラウザの間で実現する仕組みですが、 サーバサイド WebRTC ではブラウザとサーバの間で WebRTC を実現します。

サーバサイドでの録画を行う場合はサーバサイドでの WebRTC スタックが無ければできません。 録画以外にもスター型で WebRTC を繋ぐ場合にも必要です。

サーバでの WebRTC 可能性を探るために 1 から WebRTC スタックを開発しています。

WebRTC SFU Sora の特徴

ドキュメント

細かいところまで網羅した、ドキュメントを提供しています。

WebRTC SFU Sora ドキュメント

サポート

Sora 開発チームが直接サポート対応を行います。

超低遅延

WebRTC SFU Sora は低遅延を目的に作られた製品です。遅延は環境にも寄りますが基本的には 1 秒未満です。

超高画質

WebRTC SFU Sora を利用すればカメラや CPU や回線、さらにはクライアント側の対応が必要になりますが 4K@30 での超高画質を最大 15Mbps で安定的に配信可能です。

再送制御を WebRTC SFU 側で高ビットレート向けに制御することにより実現を可能にしています。

超大規模配信

WebRTC SFU Sora を利用すれば、クラスター機能を利用することで数百万ユーザーに配信することも可能です。

最大 3000 視聴者への配信

ビットレートに依存しますが、片方向配信で多くのクライアントへの配信が可能です。

IPv6 のみ

IPv6 のみの環境での動作をします。

4K 配信

4K 30fps 15Mbps の映像を、片方向配信での配信も可能です。

無変換

WebRTC SFU は映像のコーデックなど変換を一切行わないで、複数の視聴者に映像や音声を配信する仕組みです。 変換を行わないため、サーバのリソースを節約することが可能です。

さらに Sora は録画も無変換で行います。

パッケージ

サービスではなくパッケージ製品です。サービスの場合は従量課金がほとんどです。Sora は年間の利用ライセンスだけです。 またクローズドなネットワークでも利用可能です。サービスに左右されることなく自前で気軽に運用可能です。

数ヶ月に一度の定期的なアップデート以外はやることはなく放置していて問題ありません。

クラスター

Sora は複数台でクラスターを組むことができます。 クラスターが組んでる Sora ノードのどれかが障害が起きた場合、再接続するだけで復旧可能です。

Sora クラスターでは指定した Channel ID がどの Sora ノードに接続するべきかを共有しています。 そのため、どれかの Sora ノードに障害が起きたとしても、適切なノードに再接続できる仕組みを搭載しています。

また、ネットワーク障害が起きても自動で復旧する仕組みが組み込まれています。

ロードバランサー

Sora はクラスターを構築することでロードバランサー機能を提供します。そのためロードバランサーを別に用意する必要はありません。 Channel ID の割り当てノードを選択する際に、接続割合が低いノードを選択します。

サーバ主導

サーバ側がクライアントをコントロールし、サーバ側が色々吸収するため、クライアント側の開発コストが下がります。

またサーバ側でクライアントの切断などをコントロールしやすいため、ビジネス用途に向いています。

サーバでの録画

WebRTC SFU は映像の暗号化をいったんほどいてから配信しているため、 サーバ側で映像を保存することが可能になります。

つまり好きなタイミングで配信している映像を保存可能です。

さらに変換せずその流れている映像そのままの画質で保存が可能です。 VP8 + Opus または VP9 + Opus さらに H.264 + Opus の三種類形式で動画を保存可能です。

無変換で録画するため、サーバのリソースを配信に集中することができます。 またすぐに録画したファイルを見ることができます。

録画時にリップシンクを行っているため、ある程度のパケロスでも音ズレを回避できるようになっています。

サイマルキャストやスポットライトを利用した場合でも録画が可能です。

録画ファイルの分割出力

Sora には一定期間ごとに録画ファイルを出力する機能あり、24/365 の配信を録画することも可能です。

マルチストリーム

Firefox と Chrome と Safari と Edge に対応済みです

WebRTC では複数の映像を 1 本のセッションで束ねる マルチストリームという仕組みがあります。

SFU を使った場合は配信は 1 つですが、視聴は複数になる事があるため、 マルチストリーム と SFU の相性はよく、今後は マルチストリーム が主流になっています。

SFU で マルチストリーム を使うと DTLS セッションを 1 本だけ張れば良くなります。 WebRTC API の ontrack/onremovetrack イベントを活用することで、参加者の通知を気軽に行えます。

動的にクライアント側の実装がとてもシンプルになります。

実際に Firefox と WebRTC SFU を使った マルチストリーム のデモを動画にしてみました。

Firefox 45 と WebRTC SFU Sora を使った マルチストリーム のデモ - YouTube

詳細は Sora のドキュメント マルチストリーム をご覧ください

マルチストリームの最大参加人数

映像を有効にした際のマルチストリームでの一つのチャネルへの最大参加人数は 12 名程度です。 制限はかかっていないため最大人数は増やすことはできますが、 これ以上はクライアント側が耐えられない可能性が高いです。

これ以上を利用する場合はスポットライト機能を検討してください。 スポットライト機能を利用すれば一つのチャネルへの最大参加人数が 50 名までに増やすことが可能になります。

サイマルキャスト対応

マルチストリームの課題は参加者全員が同じ画質の映像を受信するというものですが、サイマルキャストを利用することでこの課題を解決できます。

たとえば A さんは自宅のデスクトップマシンから利用しており「高画質」の映像を受信しても問題ありませんが、 出先からスマートフォンで利用している B さんは「高画質」の映像を受信すると映像が止まってしまったりする可能性があります。

サイマルキャストを利用することで B さんは A さんが配信している「高画質」「中画質」「低画質」の3つから「低画質」を受信するという選択ができるようになります。

サイマルキャストと非サイマルキャストの混合

マルチストリーム利用時にサイマルキャストを利用した場合、しない場合を混合して利用可能です。 サイマルキャストで配信されている映像は画質の切り替えが可能になります。

利用者は特に何かを意識する必要はありません。

ビットレートシェアリング

マルチストリームのビットレート指定は現在マルチストリームに配信で参加している人数でわった値で配信するという機能です。

たとえばボットレートの指定を 1000kbps にして、そのマルチストリームに 4 名参加している場合、 配信する映像のビットレートは 250kbps となります。もし 1 名参加者が減って 3 名になった場合は 333kbps となります。

マルチストリームでは全員で共有する最大で利用可能な配信ビットレートの値を指定することになります。

マルチストリームでの録画

マルチストリームでの録画を実現しました。指定したグループに対しての録画を事前に指定できます。

録画を指定してからその録画有効期限が切れるまでは、そのグループでの映像や音声は自動で録画されるようになります。

この機能を利用することで、気軽に複数人数の録画が可能になります。

さらに録画したファイルの生成が完了したタイミングや、録画が開始されたタイミングでウェブフックから通知がくるため、アプリとの連携が簡単になります。

視聴専用機能

マルチストリームで配信している映像を、映像を配信せず視聴のみで参加することができます。

この機能を使うことで同じチャネルに 4 人が参加して配信をしているのを、他の人がみるという事が可能になります。

4 人の配信を 30 人が視聴するなどが可能になります

スポットライト機能

Chrome と Edge と Safari に対応しています

この機能を使うことでサーバが配信する内容を「直近で喋っていた人たち」とそれ以外で切り替えられます。

  • 直近で喋っていた人たちは「高画質」で「音声あり」
  • それ以外の人たちは「低画質」で「音声なし」

こうすることで受信側の負荷を下げながらも多くの情報量を提供可能になります。

  • アンフォーカス時に受信する RID を指定可能です
  • フォーカス時に受信する RID を指定可能です
  • アンフォーカス時にフォーカスを遅延させるかどうかを指定可能です
  • アンフォーカス時にフォーカスを遅延させる時間を指定可能です
  • アンフォーカス時に音声を配信しなくなる上限値を指定可能です
  • フォーカスからアンフォーカスに切り替わったタイミングで音声を配信し続けるかどうかを指定可能です
  • フォーカスからアンフォーカスに切り替わったタイミングで音声を配信し続ける時間を指定可能です

OBS WHIP 対応機能

OBS Studio 30 から対応する OBS が直接 WebRTC を配信することができるようになる WHIP を実装しています。

これにより OBS から WebRTC SFU Sora に直接配信することが可能になります。

TURN 機能

Sora は TURN 機能を内蔵しているため、 TURN サーバを別に立てる必要がなくなります。 現時点では TURN-UDP と TURN-TCP に対応しています。今後は TURN-TLS への対応も予定しています。

TURN 機能を内蔵することで TURN 利用時に必須な認証などを全て自動で行ってくれます。 また WebRTC 通信自体に認証がかからないため TURN を前提とすることで、よりセキュアに WebRTC を利用することが可能になります。

詳細は Sora のドキュメント TURN 機能 をご覧ください

TURN-TLS 払い出し機能

Sora では TURN-TLS 自体を処理する機能は搭載しません。 TURN-TLS は TURN-TCP の TLS 版です。 この機能は TURN-TLS の urls turns: を払い出すようにする機能です。

実際の TLS の処理は Nginx などを利用して前段で終端して、そのご TURN-TCP に繋ぐという仕組みです。

TCP serverをSSL/TLS化するのに nginx の stream_ssl_module/stream_proxy_module が便利 - たごもりすメモ

Sora では Nginx などを前段において貰うことを前提としています。そのため、 TLS 部分の処理も前段に任せてしまうという方針です。

サイマルキャスト機能

サイマルキャストとはクライアント側は複数の画質の映像を同時に送ってくるという仕組みです。

現時点で Sora では最新版の Chrome と Edge と Safari で VP8 と H.264 を指定した場合のサイマルキャスト機能に対応しています。

サイマルキャストを使うことで WebRTC の課題の一つである視聴者側が複数いる場合に配信ビットレートが一つになってしまうという問題を解決できます。

つまり配信者は高画質で配信しているが、ある視聴者は端末や回線の問題から低画質で見たい。という問題です。

これを解決するのがサイマルキャストで配信者が複数の画質の映像を SFU に配信し、 SFU から視聴者へは望む画質を配信するという仕組みです。

Sora ではさらに配信者側が不安定になり優先度が低いが質が配信できなくなった場合、 視聴者がその画質の映像を見ていたとしてもクライアントが特に何をすることもなく、 Sora 側で配信されている画質に切り替える仕組みを導入しています。配信者が不安定ではなくなり、安定したタイミングで視聴者側の画質も戻します。

さらに視聴者側の画質を自由に切り替える API も提供しています。

シグナリング

シグナリングとはクライアントと SFU が WebRTC の通信を始めるために事前にやりとりをするための仕組みです。

どんな映像コーデックを使うのか、音声は配信するのかどうか、などを指定します。認証などもここで行います。

WebRTC でのシグナリングは仕様的には定義されていません。 Sora のシグナリングは WebSocket を利用しています。

WebSocket を使い、内部で JSON 形式での通信を行います。

詳細は Sora のドキュメント シグナリング をご覧ください

DataChannel シグナリング機能

Sora では接続時のみ WebSocket を利用し、その後のシグナリングをすべて DataChannel を利用する仕組みを持っています。

この機能を利用することで WebSocket でおきていたヘッドオブラインブロッキングを避けることができ、より繋がり続ける事が可能になります。

DataChannel メッセージング機能

Sora では DataChannel を利用したリアルタイムなメッセージング機能に対応しています。 音声や映像、さらにデータを自由に参加者に配信することができるようになります。

再送をアプリに依存させたりなど、色々な方針で配信が可能です。

シグナリング通知機能

接続してきたクライアントや、切断してきたクライアントの情報をシグナリングを利用している WebSocket 経由でプッシュで通知する仕組みです。

接続時にメタデータを Sora に渡しておくことで、プッシュ通知時にそのメタデータを送信します。

この機能を使うことでどの配信が誰の配信かなどを簡単に実現できるようになります。

モード機能

API 経由で Sora のモードを新規接続停止や新規セッション停止のモードに切り替える事が可能です。

新規接続停止は既存の接続は継続しつつ、新規接続を停止します。

新規セッション停止は既存のセッションは継続しつつ、新規セッションを停止します。 そのため、新規でチャネルを作る事ができなくなります。

認証ウェブフック

Sora 自体は認証機能を持っていません。ただし、認証の処理を外部の認証サーバに委譲することができます。

外部への認証は Sora が HTTP 経由で設定に指定されたサーバに問い合わせます。そのため Sora がデータベース連携を行う必要がありません。

詳細は Sora のドキュメント 認証ウェブフック をご覧ください。

認証ウェブフックでの払い出し機能

Sora では認証サーバが払い出した JSON を利用することができます

  • event_metadata の指定
    • この機能はイベントフックで、接続、切断、更新時に送ってくる値をサーバ側から好きな値を指定することができます
    • 例えばプライマリキーなどを保存しておくことで、アプリ側の処理を単純かすることが可能です
    • この値は接続毎に保持し、クライアントに通知されることはありません
  • オーディオ、ビデオの設定の指定
    • サーバ側から利用するオーディオやビデオのコーデックやビットレートを指定することができます
    • チャネルで利用するコーデックを統一したい場合に利用可能です
  • ipv4_address や ipv6_address の指定
    • サーバ側から、クライアントが利用する IP アドレスのリストを送ることができます
    • これによりプライベートネットワークだけで通信して欲しい場合など、クライアントの接続をネットワークレベルでコントロールすることができるようになります

セッションウェブフック

Sora ではチャネルの時間帯でのグルーピングにセッションという概念があり、セッションの開始と終了でウェブフックを飛ばすことができます。

これはチャネルを使い回して利用する事が多いため、もう一つ時間帯でのグルーピングが必要と考えたため、このウェブフックを実装しました。

イベントウェブフック

Sora は状態の変化などを全てウェブフック経由でアプリケーションに通知します。

この Web フック機能を使うことで、アプリ側は通常の HTTP API アプリを書く事で Sora と連携することが可能になります。

詳細は Sora のドキュメント イベントウェブフック をご覧ください。

API

API は Sora が持っている HTTP API です。この API を操作することで指定したユーザを切断したり、指定したグループ全員にプッシュで情報を送るなどが利用可能になります。

詳細は Sora のドキュメント をご覧ください。

転送フィルター機能

Sora の音声や映像の転送をフィルターする機能を提供しています。最初は映像を映さず音声のみを転送する。 特定の接続にだけ映像を転送するなど、転送フィルターのルールを設定することで複雑な転送ルールが実現できます。

詳細は 転送フィルター機能 をご確認ください。

統計エクスポーター機能

WebRTC Stats をクライアント経由で Sora からさらに統計コレクターに HTTP/2 を利用して送る機能です。 接続単位の統計情報、最小 30 秒間隔で送る事ができます。

WebRTC Stats Collector Kohaku を使うことで Grafana + TimescaleDB で、ため込んだデータを可視化することが可能です。

インポートするだけですぐ利用可能な Grafana のダッシュボードも用意してあります。

音声ストリーミング機能

クライアントから送られてくる音声パケットを、HTTP/2 経由で出力する機能です。

shiguredo/suzu: Audio Streaming Gateway Suzu を利用する事で AWS や GCP といった音声から文字起こしするサービス経由でリアルタイムな文字起こしをクライアントに配信可能になります。

サービスに音声を送る:

クライアント -> <WebRTC> -> Sora -> <HTTP/2> -> Suzu -> AWS や GCP 

サービスから解析結果を受け取る:

クライアント <- <WebRTC DataChannel> <- Sora <- <HTTP/2> <- Suzu <- AWS や GCP 

開発ツール機能

Sora にはオープンソースとして公開している開発ツールが組み込まれています。

WebRTC SFU Sora DevTools

End to End Encryption

Sora はブラウザ上で End to End Encryption 機能を利用可能です。

詳細は Sora E2EE ドキュメント をご覧ください。

前方誤り訂正対応 (ULPFEC)

回線が不安定になった場合でも再送することなく欠損したパケットを回復する仕組みです。 これを利用することで高ビットレートや不安定な回線での映像を配信することが可能になります。

AV1 対応

AV1 に対応しています。

H.265 対応

Safari TP 105 から利用可能になった WebRTC での H.265 に対応しています。

Lyra 対応

google/lyra: A Very Low-Bitrate Codec for Speech Compression に対応しています。これは独自対応です。

現時点ではブラウザと C++ SDK で利用可能です。

SDK

SDK の有償サポートは行っておりません、ただしバグフィックスなどは最優先で対応します

Sora には現在 JavaScript と iOS と Android と Unity の SDK が存在しています。

全ての SDK がマルチストリームに対応済です。クライアントから簡単にマルチストリームを利用することができます。

さらに常に最新の WebRTC ライブラリに追従しています。

SDK は OSS で、ラインセスも Apache 2.0 にて提供しており、自由に使って頂く事を想定しています。

JavaScript SDK

iOS SDK

WebRTC ネイティブ iOS ライブラリ API ガイド

Android SDK

Unity SDK

C++ SDK

Python SDK

C SDK

WebRTC Native Cleint Momo

コンソールから WebRTC を利用できる Momo に対応しています。

shiguredo/momo: WebRTC Native Client Momo

負荷試験ツール

Sora 専用の負荷試験ツールを OSS として公開しています。

WebRTC Load Testing Tool Zakuro

このツールを利用することでキャパシティプランニングが可能になります。

録画合成ツール

Sora 専用の録画合成ツールを OSS として公開しています。

shiguredo/hisui: Recording Composition Tool Hisui

このツールを利用することで、別れて録画されたファイルを一つのファイルにすることが可能です。

統計情報収集ツール

クライアントや Sora の統計情報を Sora から受け取り TSDB (Time series database) に格納するツールを OSS として公開しています。

shiguredo/kohaku: WebRTC Stats Collector Kohaku

このツールを利用することで、問題があるクライアントの解析をより細かく解析が可能になります。

音声ストリーミングゲートウェイ

Sora から HTTP/2 経由で Opus を受け取り、音声解析サービスに送信しその結果を Sora に返すゲートウェイを公開しています。

shiguredo/suzu: Audio Streaming Gateway Suzu

このゲートウェイを利用する事で AWS や GCP の Speech To Text が簡単に利用できるようになります。

Sora Exporter

Sora の統計情報を OpenMetrics 形式で取得可能にするツールを公開しています。

shiguredo/sora_exporter: Prometheus exporter for WebRTC SFU Sora metrics

Sora Archive Uploader

Sora が生成する録画ファイルを AWS S3 または S3 互換のオブジェクトストレージにアップロードするツールを公開しています。

shiguredo/sora-archive-uploader: Sora Archive Uploader

サンプル

これは WebRTC SFU Sora を利用して録画した映像のサンプル画像です。このサンプルには音声は含まれておりません。

image

コーデックは VP9 を利用し、ビットレートは 5000 Kbps で解像度はフル HD 、フォーマットは WebM 形式で録画しております。

映像はこちら、 26 M バイト程度あります。

https://dl.dropbox.com/s/36g3o9tlgtppea6/8d096fb4-6fd2-40d6-9637-115062a82bc6.webm

Firefox または Chrome で録画した WebM ファイルを見ることができます。このサンプルには音声は含まれておりません。

ゴール

SFU (+TURN) 機能を持った WebRTC サーバです

  • 最新版の Chrome と Firefox と Safari と Edge が繋がる WebRTC サーバを製品として提供します
  • サーバ経由での片方向での音声/映像配信/データを可能にします
    • SFU 1 台で WebRTC 経由で 10000 の片方向配信を可能にします
  • マルチストリーム を使用した双方向での音声/映像配信/データを可能にします
    • 常に マルチストリーム 前提で動作させます
    • マルチストリームでは最大 12 人の双方向配信を可能にします
    • マルチストリームでの一人当たりの利用帯域を人数関係なく固定することを可能にします
  • サイマルキャストを片方向/双方向で利用可能にします
    • Opus, Lyra に対応
    • VP8, VP9, AV1, H.264, H.265 に対応
    • 録画も可能
  • スポットライト機能
    • 1 チャネルに最大 100 人以上の双方向配信を可能にする機能です
    • 音声が一定量を超えた配信者のみの音声や映像を配信する機能です
    • 配信していない参加者のビットレートを自動で下げます
    • 受信側がサイマルキャストのストリームを選択できるようにします
  • サイマルキャストと帯域推定による動的な配信映像の変更を行います
    • 帯域が厳しいと判断した場合は低画質の映像を受信します
  • OBS から直接配信できるます
  • 常に組み込みでの TURN 経由アクセスを行います
    • username / credential な認証の仕組み自体は組み込みます
    • TURN 機能もサーバ側に盛り込みます
    • TURN-UDP 機能
    • TURN-TCP 機能
    • TURN-TLS 機能
  • 録画/録音機能を組み込みます
    • VP8, VP9, AV1, H.264, H.265 の録画に対応
    • WebM 形式での出力が可能
    • 音声のみの Opus, Lyra 録音機能
    • サイマルキャスト機能利用時でも録画可能
    • スポットライト機能利用時でも録画可能
  • DataChannel を利用したシグナリングを採用します
    • 最初だけ WebSocket を利用し WebRTC が確立したら DataChannel へ切り替わります
    • 切断判定は WebSocket または DataChannel を利用できます
  • IPv6 対応
    • NAT64/DNS64 対応
  • クライアント SDK の提供
    • クライアント SDK はすべて Apache 2.0 ライセンスにて OSS として公開します
    • JavaScript (TypeScript)
    • C++ SDK
    • iOS (Swift)
      • C++ SDK ベース
    • Android (Kotlin)
      • C++ SDK ベース
    • Unity (C++)
      • C++ SDK ベース
    • Python SDK (C++)
      • C++ SDK ベース
    • C SDK
      • libdatachannel を利用
  • サンプルアプリの提供
    • Apache 2.0 ライセンスにて公開します
    • iOS (Swift)
    • Android (Kotlin)
    • Unity (C#)
    • C++
    • Python

実装しない機能

  • 変換機能
    • クライアント側で処理をお願いします
  • P2P 経由への対応
    • P2P 専用シグナリングサーバをオープンソースにて公開、維持していくプロジェクトがありますのでそちらをお使い下さい
    • OpenAyame プロジェクト

動作環境

CPU

  • x86_64
  • arm64

OS

Linux のみに対応しており、Windows への対応は行いません

  • Ubuntu 22.04 x86_64
  • Ubuntu 20.04 x86_64
  • Ubuntu 22.04 arm64
    • 一定期間以上ライセンスを購入いただいているのが提供条件
  • Ubuntu 20.04 arm64
    • 一定期間以上ライセンスを購入いただいているのが提供条件
  • Red Hat Enterprise Linux 9 x86_64
  • Red Hat Enterprise Linux 8 x86_64

ブラウザ

最新の安定版ブラウザのみに対応します

  • Chrome
  • Firefox
  • Edge
  • Safari

要求スペック

Sora バージョン

2022.2

コア数

最低でも 500 kbps 利用時で 100 ストリーム利用の場合は 2 コア以上必要

メモリ

1G 以上

1:N とマルチストリームではストリームの数が接続数と一致しないため、ここではストリーム数で表現しています。

また実際に送られるパケット数も全く異なるため 1:N とマルチストリームでのストリーム数をそのまま計算するのは難しいです。

利用している CPU やビットレート、クライアントごとの回線状況などで CPU 利用率は大きく変わってくるため、必ず自社で負荷の検証をお願いします。

現状

同時配信

マシンスペックや配信ビットレート、ネットワーク環境に依存しますが最大 1:2000 の配信を超低遅延で実現可能です。

同時接続

マシンスペック依存になりますが、 1:500 の映像のみ配信 x 8 の合計 4000 接続に成功しています。

連続稼働

連続した安定的な配信を可能にします。 6 ヶ月以上の無停止連続稼働を実現しています。

パケットロストした RTP パケットを再取得する Generic-NACK 機能に対応しており、画質を安定して配信することが可能です。

遅延

Safari TP を利用して 1:1 での配信と視聴を行いました。ちなみにサーバははさくら VPS 4G のサーバにおいてあります

  • 上の映像が Safari のフェイクカメラをそのまま流している映像です
  • 下の映像が WebRTC SFU Sora を経由した映像です

image

遅延は 100 ミリ秒程度でした。これはかなり遅延が少ないと思います。

ライセンス

ライセンスは 1 年間毎での更新が必要です。3 ヶ月と 6 ヶ月のライセンスも用意しています。

WebRTC SFU Sora は時雨堂が1から開発したパッケージ製品です。自社のサーバにインストールしてご利用ください。

100 同時 接続利用可能なライセンスが 84 万円/年でご利用頂けます。

ライセンス費用の詳細につきましては、 https://sora.shiguredo.jp/price をご確認ください。

大量のライセンスを購入いただいた方向けの割引もありますので、お気軽に sora at shiguredo.jp までご質問ください。

Sora Cloud

URL

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

利用時間や転送量ではなく、同時接続数と帯域で課金する Sora のクラウド版です。

Sora を構築、運用、監視する必要がなくなります。

WebRTC 系の自社製品

WebRTC Native Client Momo

Sora ともつながるブラウザなしで様々な環境で動作する WebRTC ネイティブクライアントをオープンソースにて公開しています。

ハードウェアエンコーダに対応することで Jetson Nano を使った 4K@30 での配信や Raspberry Pi Zero を利用して 720p での配信など実現が可能です。

WebRTC Signaling Server Ayame

P2P で 1:1 向けのシグナリングサーバをオープンソースにて公開しています。 Web SDK を用意しています。

仕様がとてもシンプルで、さらにオープンになっているため、気軽にクライアント側を開発可能です。

Ayame Labo

Ayame を利用した無料で利用できるサービスを公開しています。気軽に WebRTC を体験してみてください。

Sora Labo

検証目的であれば無料で WebRTC SFU Sora を試せるサービスです。気軽に WebRTC SFU を体験してみてください。

参考

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment