$30 off During Our Annual Pro Sale. View Details »

WebRTC、 綺麗に見るか滑らかに見るか

Avatar for sublimer sublimer
November 27, 2025

WebRTC、 綺麗に見るか滑らかに見るか

WebRTC Meetup Tokyo #31

まとめ
送信可能な帯域幅が狭まった場合やCPUの負荷が高い場合に、解像度とフレームレートをどのように調整するかを決めるためのdegradationPreferenceというオプションがある
基本的には、より抽象度の高いプロパティであるContent Hintを指定すればOK
degradationPreferenceにはmaintain-framerate-and-resolutionという値が新しく追加された
maintain-framerate-and-resolutionを指定するとブラウザ(libwebrtc)側での解像度・フレームレートの制御が無効化され、自前で細かい調整が実装できるようになる
MDNではdegradationPreferenceが非推奨になっているが、おそらく記載ミスなので安心して使って大丈夫

高画質版
https://docs.google.com/presentation/d/e/2PACX-1vTljVvr3HfWDHRw7-AX1Ef4JbHcd6Hb5XH0mVZsAQJQjAV7wlFw59yfsTHdXFbzFA0u2MtDGHtdaa2I/pub?start=false&loop=false&delayms=60000

Avatar for sublimer

sublimer

November 27, 2025
Tweet

More Decks by sublimer

Other Decks in Programming

Transcript

  1. 自己紹介 • @sublimer • NTT Communications NTTドコモビジネスでSkyWayを作るお仕事をし ています ◦ 先日Webhook機能をリリース[1]

    したので、もしよかったら使ってみてください [1] https://support.skyway.ntt.com/hc/ja/articles/52573289077017-Webhook機能のβ提供を開始しました
  2. 本日お話すること・しないこと • お話すること ◦ エンコーダーを制御するためのWebRTCのオプションについて ◦ 綺麗さ(解像度)と滑らかさ(フレームレート)のトレードオフを制御する方法の説明 • お話しないこと ◦

    ブラウザ(libwebrtc)側の詳細な実装の説明 • 今日のゴール ◦ アプリケーションの特性に合わせて、エンコーダーの振る舞いを制御する方法を理解する
  3. 前提 • 以下の環境で動作確認をしています ◦ Google Chrome 142 ◦ macOS Sequoia

    ◦ 同一ホスト、同一タブ内で通信(loopback) • 以下の設定で動作確認をしています ◦ 映像のみの送信(VP8) ◦ FHD(1920 x 1080) ◦ 30 FPS ◦ 100Mbps(制限無し)と1Mbps(制限あり)で帯域幅を変更 • Firefox、Safariでは挙動が異なる可能性があります • 検証で利用したコードは公開しています ◦ https://github.com/kadoshita/webrtc-degradationpreference-demo
  4. 映像のトレードオフを理解する WebRTCでは、エンコーダーに対してパラメーターを設定して、解像度やフレーム レートなどを調整する 送信可能な帯域幅が狭まった場合やCPUの負荷が高い場合は、データ量やエンコー ド処理の負荷を減らすために解像度とフレームレートのどちらか、または両方を調整 する必要が生じる degradationPreference[2] というオプションで指定できる • balanced

    ◦ 解像度とフレームレートの両方をいい感じにする • maintain-resolution ◦ 解像度を維持して、フレームレートの方を変化させる • maintain-framerate ◦ フレームレートを維持して、解像度の方を変化させる • One more thing… ◦ 後述 [2] https://w3c.github.io/mst-content-hint/#dom-rtcdegradationpreference
  5. degradationPreferenceを指定した場合の振る舞い degradationPre ferenceの設定 解像度 フレームレート 送信開始時 帯域幅が狭 まった時 帯域幅が回復 した時

    送信開始時 帯域幅が狭 まった時 帯域幅が回復 した時 未指定 徐々に上がる 下がる 徐々に上がる 変わらない 一度下がって 元に戻る 変わらない balanced 徐々に上がる 下がる 徐々に上がる 徐々に上がる 一度下がって 元に戻る 変わらない maintain-resolu tion 変わらない 変わらない 変わらない 変わらない 下がる 徐々に上がる maintain-frame rate 徐々に上がる 下がる 徐々に上がる 変わらない 一度下がって 元に戻る 変わらない
  6. Content Hintとの違い • degradationPreference ◦ 映像の品質を下げざるを得ない場合にどうするかを指定する ◦ RTCRtpSenderのオプション ◦ 仕様としては、Content

    Hintの一部という位置付け • Content Hint[4] ◦ 通常時も含めて、エンコーダーに対して「ヒント」を伝えるための設定 ◦ MediaStreamTrackのプロパティ ◦ ユーザーがdegradationPreferenceを指定せず、Content Hintを指定している場合、 Content Hintの設定に応じて内部的にdegradationPreferenceが設定される 基本的には、抽象度の高いプロパティであるContent Hintの指定をすればOK 細部が重要な映像ならdetailを指定して綺麗に、動きが重要な映像ならmotionを 指定して滑らかに表示させる [4] https://w3c.github.io/mst-content-hint/#dom-mediastreamtrack-contenthint
  7. degradationPreferenceの新しい値について 新たに「maintain-framerate-and-resolution」[5] が追加された 解像度とフレームレートを、ユーザー側で制御するために指定する値 ブラウザ(libwebrtc)側での解像度・フレームレートの制御を無効化し、ユーザー側 で細かいチューニングができるようになる getStatsを呼び出して必要な統計値を取得し、アプリケーション側で解像度・フレー ムレートをコントロールする必要がある(Bring Your Own

    Adaptation) 前述の通り、帯域幅が広くなっても元の映像品質に戻るまでに1〜2分くらいはかか るため、「できるだけすぐに映像品質を回復させたい」というユースケースなどで使 えるかもしれない [5] https://docs.google.com/presentation/d/11rr8X4aOao1AmvyoDLX8o9CPCmnDHkWGRM3nB4Q_104/edit?slide=id.g3657813d9b5_0_0#slide=id.g3657813d9b5_0_0
  8. Q. degradationPreferenceは非推奨? A. いいえ MDNではdegradationPreferenceに非推奨のアイコンがついている[7] 元々はWebRTCの仕様として定義されていたが、途中で削除された[8] 代わりにContent Hintの仕様として定義された 仕様から削除された(=非推奨)と誤認されてしまったのでは? 新しい値の追加もあるので、さすがに非推奨ではないはず

    ”This is incorrect and needs to be updated, the feature was moved under content-hints” https://bugzilla.mozilla.org/show_bug.cgi?id=1329847#c7 [7] https://developer.mozilla.org/en-US/docs/Web/API/RTCRtpSender/setParameters#degradationpreference [8] https://github.com/w3c/webrtc-pc/pull/2399
  9. 参考サイト • Bring Your Own Adaptation with "maintain-framerate-and-resolution" · Issue

    #62 · w3c/mst-content-hint • Intent to Ship: RTCDegradationPreference enum value "maintain-framerate-and-resolution" • MediaStreamTrack Content Hints • WebRTC September 2025 meeting – 16 September 2025 • Video Adaptation • RTCRtpSender: setParameters() method - Web APIs | MDN