WebRTC における Simulcast の現状
ここ1ヶ月くらいずーっと Simulacst をやっているので、まとめておきたい。
Google 独自 Simulcast
いままで WebRTC で Simulcast といえば Google 独自の SDP を書き換えて実現する方式だったがこの方式はそろそろお別れの時期が来ていると考えて良さそうだ。
ほとんどの SFU が対応しているが、次世代の Simulcast への移行していくのは間違いない。
rid ベース Simulcast
最新の Simulcast 実装は rid ベースの Simulcast を実装し始めている。
Google 独自の Simulcast は m= の中に ssrc-group を利用して複数の SSRC を用意するという方式だったが、 rid ベースは SSRC を捨てるという方針にでた。
つまり SSRC 自体が定義されない。つまり SSRC を利用するではなく RtpStreamId と呼ばれる RTP 拡張を利用することで区別をする方式。
そもそも Google 独自の ssrc-group を利用した Simulcast はあくまで Google が決めた固定値を利用するかしないかというだけであった。rid ベースでは配信する側が好きに解像度やビットレート、フレームレートを設定できる。
JavaScript 側での設定
画質に対して名前をつけられるようになりとてもわかりやすい。
var encodings = [
{rid: 'low', scaleResolutionDownBy: 4.0},
{rid: 'middle', scaleResolutionDownBy: 2.0},
{rid: 'high'}
];
rid ベースの Simulcast で Simulcast のパラメータを設定する場合は setParameters の sendEncodings にて指定するだけでよい。
https://www.w3.org/TR/webrtc/#dom-rtcrtpencodingparameters
dictionary RTCRtpEncodingParameters : RTCRtpCodingParameters {
octet codecPayloadType;
RTCDtxStatus dtx;
boolean active = true;
RTCPriorityType priority = "low";
unsigned long ptime;
unsigned long maxBitrate;
double maxFramerate;
double scaleResolutionDownBy;
};
Google 方式は libwebrtc にハードコードされているため、設定という概念がなかったが rid ベースは好きに設定できるため幅がとても広がる。
同一解像度、複数フレームレート
例えば解像度は変えたくないがフレームレートだけ変更したいとかができる。
var encodings = [
{rid: 'low', maxFramerate: 5},
{rid: 'middle', maxFramerate: 15},
{rid: 'high', mmaxFramerate: 30}
];
いままでの Simulcast ではできなかったフレームレートだけが異なるといった配信も可能になる。かなり柔軟性があるため、サービスの合わせて利用できるようになる。
おすすめの Simulcast 画質組み合わせなんかを将来的に用意できたらと思ったりしている。
SDP
SDP はシンプルで rid で画質を定義するという仕組み。まだビットレートやフレームレート、解像度は SDP には定義できず、反映もされない。
max-width や max-hight 、max-br や max-fps といった設定がある。
a=rid:low send
a=rid:middle send
a=rid:high send
a=simulcast:send low;middle,high
Simulcast の今後
今後は Simulcast が当たり前になると考えている。実際ほぼすべての SFU 開発者は Simulcast に取り組んでいる。マルチストリームと Simulcast はできて当たり前な SFU になっていくだろう。
今後は Simulcast 自体のコントロールが焦点になっていくと考えている。つまり帯域推定による配信者のビットレートコントロールや視聴者への配信自動切り替えだ。
ただ Simulcast 一つとっても課題は多い。そこにビットレートコントロールや自動切り替えが入ってきて、さらに VP9/AV1 が入ってくるとなるとなかなかしんどい。
ただ、利用者にとてはメリットしかない機能なので、積極的に情報を公開していきたい。
おまけ
ハードウェアエンコーダーと Simulcast
ハードウェアエンコーダーと Simulcast において明確な課題があることを書いておきたい。
SImulcast は前述したとおり複数の画質の映像を送る仕組みだが、これは複数の画質を同時に圧縮しているとも言える。
Simulcast は 2–4 本の映像を同時に送ることができるため、つまりハードウェアエンコーダーでも同時に処理する必要がある。
ただ一般的なハードウェアエンコーダは多くても 2 本程度しか映像を圧縮することができない。NVENC は明示的に 2 本と書いてある。
そのため、ハードウェアエンコーダとSimulcast という課題はついて回るだろう。
エンコーダとの密接な関係
もう一つ WebRTC の Simulcast はエンコーダーとの密接な関係が求められう事も書いておきたい。
もともと libwebrtc は密接だからこそ強いという機能だが、Simulcast はより密接になったと考えて良い。
WebRTC クライアントを利用する場合はエンコーダーとの密接な関係を大事にして言ったほうが良い。エンコーダーと通信のプロトコルの分離は避けたほうが良い。
参考資料
簡単にまとめたものが以下にあるので興味がある方は読んでみてほしい。