自社の WebRTC SFU にマルチコーデックサイマルキャストという機能を実装しているので、どんな仕組みか説明するための説明を含めて雑に書いていく。とにかく利用技術が新しいため説明が難しい。
マルチコーデックサイマルキャストは基本的に WebRTC SFU 前提。
サイマルキャスト
サイマルキャストは 1つのコーデックで複数の画質を配信する仕組み。例えば 1080p / 720p / 360p の解像度の映像を同時に配信したりできる。
視聴側は好きな画質の映像を選べたり、SFU が帯域を推定して自動で切り替えたりする。
あくまで 1 コーデックの話。ここ重要。
マルチコーデック
マルチコーデックというのは 1 つの映像を再接続無し、再ハンドシェイク無しで最初に SDP でハンドシェイクしたコーデックであれば何のコーデックがきても視聴できる仕組み。
あくまで視聴できるであって、配信側がコーデックを切り替えるのはまた別の機能。ここ重要。
主要ブラウザは全てマルチコーデックに対応している。
WebRTC Codec Selection API
配信側が利用できるコーデックを再接続なし、再ハンドシェイクなしで切り替えられる仕組み。最近 Chrome に入った。
この機能を利用することでクライアントが配信する映像コーデックを切り替えられる。
マルチコーデックと WebRTC Codec Selection API を組み合わせることで、配信側のコーデックを動的に切り替えて、視聴側でコーデックが切り替わっても特に違和感なく視聴できる。
誰が使うんだそんな機能?って思うかもしれないが Google Meet が利用している。
マルチコーデックサイマルキャスト
複数コーデックを利用して複数の画質を配信することができるようになる仕組み。今まで登場した技術を全て組み合わせた技術。
1080p (AV1) / 1080p (HEVC) / 720p (H.264) とかで配信できるようになる。視聴側はマルチコーデックの仕組みは必須になる。
マルチコーデックサイマルキャストが解決するのは最新のコーデックを使いたいが、視聴側が対応していないと、どうしようもないという部分。
この問題は双方向配信ではほとんど起きることはないが、片方向配信では発生する可能性がある。
たとえば、WebRTC SFU を利用して 1 万人に配信する際、 AV1 を利用して配信したいが、Safari もいるし、Firefox もいるとする。
その場合、映像コーデックをフォールバックする必要があるが、そんな都合がいい仕組みは WebRTC にはない。
そこでマルチコーデックサイマルキャストを利用して疑似フォールバックを実現する。AV1 と HEVC が再生できないクライアントなら H.264 を配信するという判断を WebRTC SFU がすればいい。
これはもちろん WebRTC だけでなくても、MOQT などでも必要となる技術になる。
今までの WebRTC の概念から大きく外れるので、頑張って設計しつつコード書いてる。さらに libwebrtc はまだマルチコーデックサイマルキャストに対応していないので、要注意。自社ではパッチを当てる方針でいる。
それにしても解決する問題がニッチな割にあまりにも複雑な技術すぎないか。