サイマルキャスト機能

概要

サイマルキャスト (Simulcast) は、配信時に 1 つの RTCPeerConnection から複数種類のエンコードした映像を配信する技術です。

映像を配信する際、 Sora に対して、 1 つの RTCPeerConnection で複数種類のエンコードした映像を送信することにより、 受信者がどの映像を受信するかを選択できるようになります。

注意

現時点でのサイマルキャストの仕様

2024 年 6 月 時点でサイマルキャストで出力されるストリームの本数は解像度とビットレートに依存しています。

解像度とビットレートとストリーム数の関係

解像度

ビットレート

ストリーム数

1920x1080

5000 kbps

3

1280x720

2500 kbps

3

960x540

1200 kbps

3

640x360

700 kbps

2

480x270

450 kbps

2

320x180

200 kbps

1

この値は libwebrtc にハードコードされています。 VP8 と VP9 で異なります。

// These tables describe from which resolution we can use how many
// simulcast layers at what bitrates (maximum, target, and minimum).
// Important!! Keep this table from high resolution to low resolution.
constexpr const SimulcastFormat kSimulcastFormatsVP8[] = {
    {1920, 1080, 3, webrtc::DataRate::KilobitsPerSec(5000),
    webrtc::DataRate::KilobitsPerSec(4000),
    webrtc::DataRate::KilobitsPerSec(800)},
    {1280, 720, 3, webrtc::DataRate::KilobitsPerSec(2500),
    webrtc::DataRate::KilobitsPerSec(2500),
    webrtc::DataRate::KilobitsPerSec(600)},
    {960, 540, 3, webrtc::DataRate::KilobitsPerSec(1200),
    webrtc::DataRate::KilobitsPerSec(1200),
    webrtc::DataRate::KilobitsPerSec(350)},
    {640, 360, 2, webrtc::DataRate::KilobitsPerSec(700),
    webrtc::DataRate::KilobitsPerSec(500),
    webrtc::DataRate::KilobitsPerSec(150)},
    {480, 270, 2, webrtc::DataRate::KilobitsPerSec(450),
    webrtc::DataRate::KilobitsPerSec(350),
    webrtc::DataRate::KilobitsPerSec(150)},
    {320, 180, 1, webrtc::DataRate::KilobitsPerSec(200),
    webrtc::DataRate::KilobitsPerSec(150),
    webrtc::DataRate::KilobitsPerSec(30)},
    // As the resolution goes down, interpolate the target and max bitrates down
    // towards zero. The min bitrate is still limited at 30 kbps and the target
    // and the max will be capped from below accordingly.
    {0, 0, 1, webrtc::DataRate::KilobitsPerSec(0),
    webrtc::DataRate::KilobitsPerSec(0),
    webrtc::DataRate::KilobitsPerSec(30)}};
// These tables describe from which resolution we can use how many
// simulcast layers at what bitrates (maximum, target, and minimum).
// Important!! Keep this table from high resolution to low resolution.
constexpr const SimulcastFormat kSimulcastFormatsVP9[] = {
    {1920, 1080, 3, webrtc::DataRate::KilobitsPerSec(3367),
    webrtc::DataRate::KilobitsPerSec(3367),
    webrtc::DataRate::KilobitsPerSec(769)},
    {1280, 720, 3, webrtc::DataRate::KilobitsPerSec(1524),
    webrtc::DataRate::KilobitsPerSec(1524),
    webrtc::DataRate::KilobitsPerSec(481)},
    {960, 540, 3, webrtc::DataRate::KilobitsPerSec(879),
    webrtc::DataRate::KilobitsPerSec(879),
    webrtc::DataRate::KilobitsPerSec(337)},
    {640, 360, 2, webrtc::DataRate::KilobitsPerSec(420),
    webrtc::DataRate::KilobitsPerSec(420),
    webrtc::DataRate::KilobitsPerSec(193)},
    {480, 270, 2, webrtc::DataRate::KilobitsPerSec(257),
    webrtc::DataRate::KilobitsPerSec(257),
    webrtc::DataRate::KilobitsPerSec(121)},
    {320, 180, 1, webrtc::DataRate::KilobitsPerSec(142),
    webrtc::DataRate::KilobitsPerSec(142),
    webrtc::DataRate::KilobitsPerSec(49)},
    {240, 135, 1, webrtc::DataRate::KilobitsPerSec(101),
    webrtc::DataRate::KilobitsPerSec(101),
    webrtc::DataRate::KilobitsPerSec(30)},
    // As the resolution goes down, interpolate the target and max bitrates down
    // towards zero. The min bitrate is still limited at 30 kbps and the target
    // and the max will be capped from below accordingly.
    {0, 0, 1, webrtc::DataRate::KilobitsPerSec(0),
    webrtc::DataRate::KilobitsPerSec(0),
    webrtc::DataRate::KilobitsPerSec(30)}};

https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/video/config/simulcast.cc

SDK 対応状況

最新版の JavaScript SDK, iOS SDK, Android SDK, Unity SDK, C++ SDK では、 配信と視聴ともに VP8 と H.264 に対応済みです。

注釈

Chrome M113 以降では JavaScript SDK を利用することで VP9 と AV1 利用できます。

配信ブラウザの対応状況

Firefox は配信に対応していません

配信側は Chrome と Edge と Safari の最新バージョンに対応しています。

視聴ブラウザの対応状況

視聴側は Chrome と Safari と Firefox と Edge の最新バージョンに対応しています。

映像コーデック

配信時に利用できる映像コーデックは VP8 と VP9 と AV1 と H.264 と H.265 です。

VP9 と AV1 でのサイマルキャスト

VP9 や AV1 でサイマルキャストを行う場合、ブラウザでは配信側が Chrome M113 以降である必要があります。 また設定では scalabilityModescaleResolutionDownBy の 2 つを設定する必要があります。

詳細は scalabilityMode を参照してください。

H.265 でのサイマルキャスト

H.265 でサイマルキャストを行う場合、ブラウザでは Safari Technology Preview の実験的機能で WebRTC H265 を有効にする必要があります。

非対応機能

以下はすべて今後対応予定です

  • ULPFEC 機能には対応していません

映像の優先度

サイマルキャストでは 1 つのクライアントからの同じ映像を複数のエンコードで配信できます。

Sora では 1 つのクライアントから最大 3 種類のエンコードで映像を受信する仕組みが入っています。 この 3 種類の映像のそれぞれに r0 / r1 / r2 の 3 つの値を定義しています。 この値は rid と呼ばれています。

配信継続の優先度は r0 > r1 > r2 です。

例えば、回線が不安定だったりマシンの負荷が高かった場合、rid が r2 の映像の配信が最初に停止します。 さらに配信状況が悪化した場合は rid が r1 の映像の配信が停止します。 r0 の映像は必ず配信されます。

映像の種類のデフォルト

Sora ではサイマルキャストで配信する映像の種類にデフォルト値を設定しています。

[
  {"rid": "r0", "active": true, "scalabilityMode": "L1T1", "scaleResolutionDownBy": 4.0},
  {"rid": "r1", "active": true, "scalabilityMode": "L1T1", "scaleResolutionDownBy": 2.0},
  {"rid": "r2", "active": true, "scalabilityMode": "L1T1", "scaleResolutionDownBy": 1.0}
]

r0

rid が r0 の場合は通常の解像度から解像度 (一辺) が 1/4 の映像になるように設定されています。

r1

rid が r1 の場合は通常の解像度から解像度 (一辺) が 1/2 の映像になるように設定されています。

r2

rid が r2 の場合は通常の解像度のままの映像に設定されています。

映像のエンコーディングパラメーターのカスタマイズ

Sora ではサイマルキャストでの映像のエンコーディングパラメーターを自由に設定できます。

  • sora.conf のファイルで指定することで全体のサイマルキャストのエンコーディングパラメーターが指定できます

  • 認証成功時に simulcast_encodings で払い出すことで個別にサイマルキャストのエンコーディングパラメーターが指定できます

sora.conf でファイル指定

sora.conf にて simulcast_encodings_file で JSON を指定してください。

simulcast_encodings_file = etc/simulcast_encodings.json

sora.conf で指定する JSON ファイルの記述方法

[
  {"rid": "r0", "active": true, "scaleResolutionDownBy": 2.0, "maxFramerate": 5.0},
  {"rid": "r1", "active": true, "scaleResolutionDownBy": 2.0, "maxFramerate": 20.0},
  {"rid": "r2", "active": true, "scaleResolutionDownBy": 1.0, "maxFramerate": 30.0}
]

認証成功時に simulcast_encodings で払い出す記述方法

{
  "allowed": true,
  "simulcast_encodings": [
    {"rid": "r0", "active": true, "scaleResolutionDownBy": 2.0, "maxFramerate": 5.0},
    {"rid": "r1", "active": true, "scaleResolutionDownBy": 2.0, "maxFramerate": 20.0},
    {"rid": "r2", "active": true, "scaleResolutionDownBy": 1.0, "maxFramerate": 30.0}
  ]
}

カスタマイズの設定

active: false の挙動

r1 の active を false にカスタマイズしている配信で r1 を受信をリクエストした場合、r0 が配信されます。

[
  {"rid": "r0", "active": true},
  {"rid": "r1", "active": false},
  {"rid": "r2", "active": true}
]

r0 の active を false にカスタマイズしている配信で r0 を受信をリクエストした場合、r1 が配信されます。

[
  {"rid": "r0", "active": false},
  {"rid": "r1", "active": true},
  {"rid": "r2", "active": true}
]

r0 と r1 の active を false にカスタマイズしている配信で r0 を受信をリクエストした場合、r2 が配信されます。

[
  {"rid": "r0", "active": false},
  {"rid": "r1", "active": false},
  {"rid": "r2", "active": true}
]

scalabilityMode

この設定は Chrome / Edge M113 以降でのみ有効です

注釈

PSA: VP9/AV1 simulcast support in M113

Chrome では VP9/AV1 サイマルキャストが利用できますが、Edge では VP9 サイマルキャストのみです。

VP9 または AV1 でサイマルキャストを利用する場合の条件として、 scalabilityModescaleResolutionDownBy を両方をすべての rid に対して設定する必要があります。

サイマルキャスト利用時に scalabilityMode に設定可能な値は L1T1L1T2L1T3 のみです。

デフォルトでは L1T1 が指定されています。特に理由がなければ L1T1 を利用してください。

重要

AV1 でサイマルキャストやスポットライトを利用し、録画をする場合は L1T1 を利用してください。 L1T1 以外では正常に録画がされません。

[
  {"rid": "r0", "active": true, "scaleResolutionDownBy": 4.0, "scalabilityMode": "L1T3"},
  {"rid": "r1", "active": true, "scaleResolutionDownBy": 2.0, "scalabilityMode": "L1T3"},
  {"rid": "r2", "active": true, "scaleResolutionDownBy": 1.0, "scalabilityMode": "L1T3"}
]

配信側の利用方法

シグナリング開始時に指定できます。

シグナリング開始時

シグナリングの "type": "connect" 時に "simulcast": true を指定することで、有効になります。 映像コーデックは VP8 または H264 を選択してください。

{
  "type": "connect":,
  "role": "sendonly",
  "channel_id": "sora",
  "video": {"codec_type": "VP8"},
  "simulcast": true
}

視聴側の利用方法

シグナリング開始時に指定できます。

シグナリング開始時

  • シグナリング "type": "connect" 時に "simulcast": true を指定することで、有効になります

  • simulcast_rid には r0 / r1 / r2 が指定できます

    • simulcast_rid を指定しない場合は r0 が指定されます

    • この値は サイマルキャストで配信されている映像を受信する際のデフォルト値 です

    • この値は sora.confdefault_simulcast_rid で変更できます

  • 映像コーデックは VP8 または H264 を選択してください

{
  "type": "connect":,
  "role": "recvonly",
  "channel_id": "sora",
  "video": {"codec_type": "VP8"},
  "simulcast": true,
  "simulcast_rid": "r2"
}

視聴側のストリームの変更 API

詳細は サイマルキャスト API をご確認ください

シーケンス図

sequenceDiagram participant C1 as クライアント1 participant S as WebRTC SFU Sora participant C2 as クライアント2 C1->>S: "type": "connect",<br/>"role": "sendonly",<br/>"simulcast":"true" note over C1, S: クライアント1 WebRTC 確立 C2->>S: "type": "connect",<br/>"role": "sendonly",<br/>"simulcast":"true",<br/>"simulcast_rid": "r1" note over C2, S: クライアント2 WebRTC 確立 par C1-)S: 映像<br>rid: r0 and C1-)S: 映像<br>rid: r1 S-)C2: 映像<br>rid: r1 and C1-)S: 映像<br>rid: r2 end
© Copyright 2024, Shiguredo Inc Created using Sphinx 7.2.6