🍡

Mixed-codec simulcast と WebRTC Codec Selection API

2023/10/23に公開

この記事は 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

まとめ

  • サイマルキャストで複数コーデックが利用可能になる
  • 端末やネットワークに優しい世界になる
  • サイマルキャストの世界が広がる

参考

Discussion