エンコード設定の設計指針

SkyWay で設定可能なパラメータとして、Publication のエンコード設定があります。 エンコード設定は安定的な通話の実現やコストコントロールを行う上で非常に重要なパラメータです。 ここでは、エンコード設定のパラメータを設計する上での考え方について説明します。

エンコード設定のパラメータ

エンコード設定のパラメータは下記のとおりです。

  • scaleResolutionDownBy
    • scaleResolutionDownBy では映像の元の解像度に対して何分の 1 の解像度に変換するかを指定できます。元の解像度が 640×360 の映像で仮に 4 を入れると 4 分の 1 の解像度である 160×90 の映像が公開されます。
  • maxBitrate
    • 各エンコード設定のビットレートは maxBitrate の値(bps)に制限されます。
  • maxFramerate
    • 各エンコード設定のフレームレートは maxFramerate の値に制限されます。
    • iOS/Android SDK においては複数指定することはできません。
  • id
    • 受信側でエンコード設定を指定する場合は ID を設定してください。

エンコード設定を行ったほうが良いケース

以下では、主にVideoStreamのPublicationにmaxBitrateを設定することを推奨していますが、AudioStreamのPublicationにmaxBitrateを設定する際にはご注意ください。 AudioStreamは多くのプラットフォームでmaxBitrateのデフォルト値が32kbpsとなっています。エンコード設定で明示的にデフォルト値よりも大きな値を設定すると、想定外に大きな帯域を利用する可能性があります。

ケース(1): SkyWayのコスト(TURN/SFU通信料)をコントロールしたい場合

SkyWay の料金として大きなウエイトを占めるものが、TURN 通信料と SFU 通信料です。この料金は通信量に基づく従量課金ですが、特にビデオ通信で利用される通信量は通信状況などの外的要因で変化するため、コントロールすることが難しいものです。

VideoStream の Publication に maxBitrate を設定することで、単位時間あたりの映像通信における通信量の上限を設けることができるため、比較的計算しやすくなります。

例えば、5人で SFU を利用した双方向ビデオ通信(maxBitrate: 200,000bps)を60分行う場合の SFU 通信料の上限値は下記で計算されます。

SFU 通信料の上限値

SFU通信量 = SFU通信量[GB] × 単価 = (Publication数 × 1PublicationのSubscriber数 + Publication数) × ビットレート[Gbit/s] × 通信時間[sec] × 単価 = (5 × 4 + 5) × (200,000/10^9/8) × 3600 × 40 = 90円

なお、料金ページの料金シミュレータなどは、maxBitrate を設定することを前提として料金計算しています。

ケース(2): 端末での利用帯域を最適化したい場合

ビデオ通話を行う環境は必ずしも潤沢な帯域をもつ回線を利用しているとは限りません。また、モバイル回線を利用している場合には、データ通信量の上限が設定されていたり回線料金に影響するため、通信量を抑えたいというニーズも考えられます。

このような場合にも、VideoStream の Publication に maxBitrate を設定することで、想定以上の帯域利用を避けることができます。

ケース(3): SFUを利用する場合

SFU Room などで SFU を利用する場合にはサイマルキャストの利用を強く推奨します。サイマルキャストは、SFU 利用時に複数のエンコード設定を設定することでご利用いただけます。

詳細は、「SFUのエンコード設定」をご参照ください。

参考) エンコード設定の設定方法

エンコード設定は Publish のオプションとして設定します。

videoPublication = await member.publish(video, { encodings: [{ maxBitrate: 200_000, scaleResolutionDownBy: 4, maxFramerate: 25, }], });

通話中にエンコード設定を変更する場合は、RoomPublication の updateEncodings() を利用します。

videoPublication.updateEncodings([{ maxBitrate: 80_000, scaleResolutionDownBy: 4, maxFramerate: 5, }]);