サイマルキャスト機能¶
概要¶
サイマルキャスト (Simulcast) は、配信時に 1 つの RTCPeerConnection から複数種類のエンコードした映像を配信する技術です。
映像を配信する際、 Sora に対して、 1 つの RTCPeerConnection で複数種類のエンコードした映像を送信することにより、 受信者がどの映像を受信するかを選択できるようになります。
注意¶
現時点でのサイマルキャストの仕様¶
2024 年 6 月 時点で libwebrtc を利用したサイマルキャストで出力されるストリームの本数は解像度とビットレートに依存しています。
VP8¶
解像度 |
ビットレート |
ストリーム数 |
---|---|---|
1920x1080 |
5000 kbps |
3 |
1280x720 |
2500 kbps |
3 |
960x540 |
1200 kbps |
3 |
640x360 |
700 kbps |
2 |
480x270 |
450 kbps |
2 |
320x180 |
200 kbps |
1 |
VP9¶
解像度 |
ビットレート |
ストリーム数 |
---|---|---|
1920x1080 |
3367 kbps |
3 |
1280x720 |
1524 kbps |
3 |
960x540 |
879 kbps |
3 |
640x360 |
420 kbps |
2 |
480x270 |
257 kbps |
1 |
320x180 |
101 kbps |
1 |
libwebrtc の仕様¶
この値は 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)}};
SDK 対応状況¶
最新版の JavaScript SDK, iOS SDK, Android SDK, Unity SDK, C++ SDK では、 配信と視聴ともに VP8 と VP9 と AV1 と H.264 と H.265 に対応済みです。
配信ブラウザの対応状況¶
配信側は Chrome と Edge と Safari の最新バージョンに対応しています。
警告
Firefox は配信に対応していません。
視聴ブラウザの対応状況¶
視聴側は Chrome と Safari と Firefox と Edge の最新バージョンに対応しています。
警告
Firefox は AV1 に対応していません。
映像コーデック¶
配信時に利用できる映像コーデックは VP8 と VP9 と AV1 と H.264 と H.265 です。
VP9 と AV1 でのサイマルキャスト¶
VP9 や AV1 でサイマルキャストを行う場合、ブラウザでは配信側が Chrome M113 以降である必要があります。
また設定では scalabilityMode
と scaleResolutionDownBy
の 2 つを設定する必要があります。
詳細は scalabilityMode を参照してください。
H.265 でのサイマルキャスト¶
H.265 でサイマルキャストを行う場合、 ブラウザでは Safari Technology Preview を利用する必要があります。
非対応機能¶
以下は今後対応予定です
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}
]
}
カスタマイズの設定¶
rid
必須
string (r0 / r1 / r2)
https://www.w3.org/TR/webrtc/#dom-rtcrtpcodingparameters-rid
active
このエンコーディングパラメーターを有効にします
オプション
boolean
https://www.w3.org/TR/webrtc/#dom-rtcrtpencodingparameters-active
scaleResolutionDownBy
オプション
1 以上の number (float または integer)
https://www.w3.org/TR/webrtc/#dom-rtcrtpencodingparameters-scaleresolutiondownby
maxBitrate
オプション
最大ビットレートを指定する
0 以上の integer
https://www.w3.org/TR/webrtc/#dom-rtcrtpencodingparameters-maxbitrate
maxFramerate
オプション
最大フレームレートを指定する
0 以上の number (float または integer)
https://w3c.github.io/webrtc-extensions/#dom-rtcrtpencodingparameters-maxframerate
adaptivePtime
この設定は Chrome でしか利用できません
オプション
boolean
https://w3c.github.io/webrtc-extensions/#dom-rtcrtpencodingparameters-adaptiveptime
scalabilityMode
この設定は Chrome 113 / Edge 113 以降でしか利用できません
オプション
string
https://www.w3.org/TR/webrtc-svc/#dom-rtcrtpencodingparameters-scalabilitymode
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 以降でのみ有効です
VP9 または AV1 でサイマルキャストを利用する場合の条件として、
scalabilityMode
と scaleResolutionDownBy
を両方をすべての rid に対して設定する必要があります。
サイマルキャスト利用時に scalabilityMode
に設定可能な値は L1T1
、 L1T2
、 L1T3
のみです。
デフォルトでは 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.conf
のdefault_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": "recvonly",<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