Mixed-codec simulcast と WebRTC Codec Selection API
この記事は WebRTC を理解している人向けかつ、WebRTC SFU ありきになります
もし WebRTC を知らないという人は以下をどうぞ。
はじめに | 好奇心旺盛な人のための WebRTC
概要
枯れきっている WebRTC にも新しい技術の話はあります。今後ブラウザで利用可能になるであろう Mixed-codec simulcast のお話をしてきます。
Mixed-codec simulcast つまり コーデックが複数種類存在するサイマルキャスト です。
もともとサイマルキャストは同一コーデックでの複数画質の配信を 1 RTCPeerConnection で実現する機能です。
Mixed-codec simulcast はコーデックを複数種類使って複数画質の配信を 1 RTCPeerConnection で実現する機能です。
何が嬉しいの?
コーデックというのはハードウェアアクセラレーター(以下 HWA)の支援を受けると本当に CPU を食いません。1080p 30fps の映像とかでも 1-2% とかしか CPU を食いません。
ただ、HWA 対応のコーデックというのは限られています。H.264/H.265 は多くの端末で対応していますが、VP8/VP9/AV1 はそんなに多くありません。
Mixed-codec simulcast は HWA の恩恵を受けやすいコーデックと、 HWA の恩恵を受けにくいが、高圧縮なコーデックを利用するといったことが可能になります。
例えば HWA の恩恵を受けやすい H.264 と高圧縮な AV1 を 1 つのサイマルキャストで配信し、視聴側が選択できるようにするということが可能になります。
今までできなかったの?
仕組みがなかったので Mixed-codec simulcast はできませんでした。ただ RTCPeerConnection を分けて複数コーデックでの配信をするというのは可能です。実際、自社オンラインイベントでは AV1 と H.264 という 2 種類のコーデックで配信をしており、好評でした。
どうやって実現するの?
Mixed-codec simulcast は WebRTC Codec Selection API という仕様を利用して実現します。
WebRTC Codec Selection API はブラウザであれば難しい技術ではありません。RTCRtpSender.setParameters() を利用して、encodings に設定をいれるだけです。
params.encodings: [
{
codec: {
clockRate: 90000,
mimeType: "video/H264",
sdpFmtpLine:
"level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f",
},
maxBitrate: 5000,
scaleResolutionDownBy: 1,
},
{
codec: { clockRate: 90000, mimeType: "video/AV1" },
maxBitrate: 1000,
scaleResolutionDownBy: 1,
},
];
いつから利用できるの?
WebRTC Codec Selection API は Chrome 119 で利用可能です。ただし Mixed-codec simulcast はまだ利用できません。
WebRTC Codec Selection API - Chrome Platform Status
SDP との関係性
WebRTC Codec Selection API は SDP の offer/answer で合意した codec 以外は利用できません。
対応予定ブラウザ
全てのベンダーがやる気があり、未来はあります
- Google: Positive
- WebKit: Positive
- Mozilla: Positive
まとめ
- サイマルキャストで複数コーデックが利用可能になる
- 端末やネットワークに優しい世界になる
- サイマルキャストの世界が広がる
参考
- https://chromestatus.com/feature/5200982281027584
- https://github.com/Orphis/webrtc-extensions/blob/explainer/explainers/codec-selection.md
- https://bugs.chromium.org/p/webrtc/issues/detail?id=15064
- https://webrtc.googlesource.com/src/+/43a5dd86c20df887496979acf5041f9920b1b501
- https://github.com/w3c/webrtc-extensions/issues/43
- https://www.w3.org/2023/01/17-webrtc-minutes.html#t07
- https://github.com/w3c/webrtc-extensions/issues/126
- https://github.com/w3ctag/design-reviews/issues/836
- https://developer.mozilla.org/en-US/docs/Web/API/RTCRtpCodecParameters
Discussion