スポットライト機能

警告

スポットライト機能はプレビュー版のため正式版では仕様が変更される可能性があります

正式版リリースにむけて

正式版リリース時には下位互換を無視した変更を多く入れる予定です。

そのため本番サービスなどで利用される場合は事前にご連絡ください。

概要

WebRTC SFU サーバを利用して 10 名で会議を行う場合、各参加者は自分以外の 9 名分の音声と映像を常に受信し続ける必要があります。 また、WebRTC SFU サーバも、常に 10 名分の音声や映像を受信し、配信し続ける必要があります。

ところが実際は 10 名の会議であっても、ひとつのトピックに対して発言している人はせいぜい 2 名から 3 名で、 また、映像も常に参加者全員のものでなくとも、 その時点でアクティブに発言している人の映像のみで十分というケースも多いです。

この スポットライト機能 は、一定の音量を超えて音声を発している参加者の音声や映像のみを配信する機能です。

配信されている参加者が参加者の中でスポットライトがあたっているような形になることから、スポットライト機能と名付けました。

仕組み

開始前に、映像を配信する人数を決めます。映像の切り替わりなどを考えると 2-3 人あたりが無難だと思います。

ここでは仮に 2 人とします。

この機能を利用した場合は、音声を発していない参加者の映像は誰にも配信されません。

最初に A さんが、一定の音量を超えて発言したタイミングで、A さんの映像が 全員 に配信されます。 A さん自身 にも映像は配信されますが、音声は配信されません。

次に B さんが、一定の音量を超えて発言したタイミングで、B さんの映像も 全員 に配信されます。 おなじく映像のみが B さん自身 にも配信されます。

次に一定の音量を超えて発言したのが C さんであれば、A さんと B さんの話していた時間が 少ないほうが C さんの映像に取って替わられます。

その後は同じように、直近で (一定の音量を超えて) 発言した 2 人分の映像が常に配信されます。

文字ではわかりにくいと思いますので、 YouTube にサンプル動画を上げております。

https://www.youtube.com/watch?v=rz9NJfeX1Js

注意

Chrome と Firefox で動作します

現時点では Chrome と Firefox で検証を行っております。Safari には対応しておりません。 Edge はマルチストリームに対応していないため非対応です。

SDK への対応

現時点では JavaScript のみが対応しており、 iOS、Android の SDK は正式対応しておりません。

もし必要があればそれぞれの GitHub Issues へ課題をあげていただければと思います。

iOS と Android の SDK 対応は正式版リリース後に予定しています。

録画機能には対応しておりません

現時点では録画機能には対応しておりません。

RTP 転送には対応しておりません

現時点では RTP 転送には対応しておりません。

アクティブな参加者が接続を切った場合の挙動

アクティブに配信されていた参加者が接続を切った場合、次にアクティブではない参加者が 発言するまで映像がそのまま残ります。

仕様

アクティブな配信数

アクティブな配信数はチャネル ID ごとに 1 から 5 までのいずれかを選択可能です。

シグナリング

multistreamtrue にし、 spotlight をアクティブにする配信数に指定してください。

アクティブにする配信数は、そのチャネル ID に接続した人の値が採用されます。

その他の項目は シグナリング を参照ください。 以下に、 connect の例を示します。

"type": "connect"

{
    "type": "connect",
    "channel_id": "<チャネルID>",
    "role": "upstream",
    "spotlight": 2,
    "multistream": true,
    "metadata": "<ユーザ定義データ>",
    "video": {
        "codec_type": "VP9",
        "bit_rate": 800
    }
}

シグナリング通知

シグナリング通知の詳細は スポットライト機能のシグナリング通知 をご確認ください。

配信が切り替わったタイミングでシグナリング通知をクライアントに送ります。クライアントはこの通知を利用することで、配信が切り替わったことを知ることが可能になります。

イベントウェブフック

配信が切り替わったタイミングでウェブフックが通知されます。

API

API の詳細は スポットライト API をご確認ください。

  • 指定したクライアントを指定した固定する機能
    • スポットライトの ID は stream.id と同等になります
  • 指定したクライアントを指定したスポットライトから外す機能
  • 指定したクライアントを強制的にアクティブにする機能
    • 現在アクティブではないクライアントを強制的に固定します

デモ

デモを用意してあります、 デモ機能 を有効にしてご使用ください。

Sora がインストールされているサーバの IP アドレスをここでは仮に 192.0.2.10 としています。

Sora にこの機能のサンプルを用意しています。また、今後は SDK からこの機能を使えるようにする予定です。

Sora を起動した後に http://192.0.2.10:5000/spotlight_pubsub.html へ接続してみてください。

Chrome では HTTPS が必須なのですか? も合わせて参考にしてください。

フェイクデモ

一つの端末でこの機能を確認するのは難しいため、スポットライト機能の動作を確認していただける疑似端末デモを用意してあります。

http://192.0.2.10:5000/spotlight_fake.html

Chrome 利用における注意点

Chrome の動作として、HTML の video タグに音声、映像のストリームを繋げると、 映像ストリームからの最初の映像フレームが到着するまで音声が再生されません(M66 時点で確認)。

このため、次の条件をすべて満たす場合、音声再生のためにアプリケーションでの対応が必要です。

  1. Spotlight 機能を利用し、クライアントに Chrome が含まれる
  2. 音声、映像を共に配信する参加者と音声のみを配信する参加者が混在する

具体的には、初めてアクティブになるクライアントが音声のみを配信する場合に、 映像フレームが到着しない状況になり、音声が聞こえない状況となります。

一方、参加者がすべて音声のみ配信の場合は、HTML audio タグを使うことで Chrome でも正常に再生可能です。

アプリケーションでの対応方法例

音声が最初から再生されるようするための対応方法のひとつを以下に示します。

  1. ストリーム内の映像トラックを無効化する
  2. video タグの loadmetadata イベントで映像トラックを有効化する

Sora JavaScript SDK を用いる場合の疑似コードは次のとおりです。:

const publisher = sora.publisher();
...

publisher.on('addstream', event => {
    ...
    event.stream.getVideoTracks().forEach(t => {
      t.enabled = false;
    });

    const video = ...;  //対象となる video タグを取得する
    video.onloadedmetadata = function(e) {
      stream.getVideoTracks().forEach(t => {
        t.enabled = true;
      });
    };
    ...
});