不要な映像の受信を停止して、限られた帯域を有効に活用する(映像トラックの選択受信機能)

はじめに

この文書では、RICOH Live Streaming に搭載された「映像トラックの選択受信」機能のメリットと使い方を紹介しています。

「映像トラックの選択受信」機能の概要とメリット

「映像トラックの選択受信」は、あるクライアントからの映像が不要な場合に、サーバーに対してその映像の配信を停止/再開させることのできる機能です。 この機能を活用することには、以下のようなメリットがあります。

  • 利用時の費用を抑制できる
    • RICOH Live Streaming では、接続時間、通信量、Room 帯域幅予約で課金額が決定されますので、不要な映像の配信を停止させて接続時間あたりの通信量を抑制することで、RICOH Live Streaming の利用にかかる費用を削減できます
    • ポケット WiFi など利用に制限のある環境では、通信量の削減によって WiFi の下りのパケット数も同時に抑制でき、インターネットの利用にかかる費用を削減できます
  • 同じコストでより高画質な映像を利用できる
    • 不要な映像の配信を停止して視聴したい映像にビットレートを集中させることで、同じ通信量でも高画質な映像を利用できます
    • 特にクライアントアプリが複数の映像を同時に表示しないような作りである場合は、表示されない映像の受信を停止して表示が切り替わる時に受信を再開することで、表示中の映像を高画質にすることが可能です
  • 狭帯域のネットワーク環境でも利用できる
    • ネットワーク環境が細い場合、視聴したい映像以外の配信を停止させることで、同じ画質でも遅延や切断を抑制することができます

具体的にどれくらい節約できるのか?

デフォルトの設定で行われる web 会議では、各クライアントは RICOH Live Streaming のサーバーを経由して、相互に映像と音声の配信を行なっています。

下記の図 1 は、例として 3 人の参加者と THETA を利用した場合の映像トラックの流れを図示したものです。 それぞれのクライアントでは以下のように最大ビットレートが設定されていて、1 時間接続したと仮定します。

クライアント最大ビットレート指定
THETA(送信専用)5Mbps (青矢印)
モバイルクライアント2Mbps (オレンジの矢印)
PC クライアント500Kbps (薄緑の矢印)

また、送信専用 THETA とモバイルクライアントは、ポケット WiFi による接続でインターネットに繋がっているものとします。

図1

左側の例の場合、全クライアントが、自分自身と THETA を除いた他の全てのクライアントへ映像を配信しているので、RICOH Live Streaming の利用で発生する映像トラックの通信量は以下の様に計算できます。

全通信量:
(5Mbps x 4 + 2Mbps x 3 + 500Kbps x 6 / 1024) x 3600秒 = 29Mbps x 3600秒 = 約12.7GiB

ポケット WiFiの通信量:
(2Mbps x 1 + 5Mbps x 2 + 500Kbps x 2 / 1024) x 3600秒 = 13Mbps x 3600秒 = 約5.7GiB

しかし、モバイルクライアントのユーザーは現場を目視できるので、THETA の映像を画面で確認する必要はありません。また、顔が見えているだけの拠点の映像は不要というケースも少なくありません。 そこで、モバイルクライアントは 直接話したい PC クライアントの映像1つだけを表示し、PC クライアントの片方は、本社で隣にいる PC クライアントの映像とモバイルクライアントの映像の受信を停止した例が右側の図になります。

この例の場合、RICOH Live Streaming で計上される映像トラックの通信量は以下のようになり、全通信量でおよそ 3 割、ポケット WiFi の通信量をおよそ 4 割ほど削減することができます。

全通信量:
(5Mbps x 3 + 2Mbps x 2 + 500Kbps x 4 / 1024) x 3600秒 = 21Mbps x 3600秒 = 約9.2GiB

ポケット WiFiの通信量:
(2Mbps x 1 + 5Mbps x 1 + 500Kbps x 1 / 1024) x 3600秒 = 7.5Mbps x 3600秒 = 約3.3GiB

上の式における 21Mbps という値は、Room 帯域幅として設定が必要な映像の送受信に必要な帯域幅に相当します。 映像に必要な帯域幅が 29Mbps から 21Mbps に減っているということは、その分、Room 帯域幅予約の値を減少させられるということでもあります(ただし、音声の通信量もあるため、実際の Room 帯域幅予約の値はこれらの値より少し大きい値が必要になります)。

「映像トラックの選択受信」機能の詳細

  • 「映像トラックの選択受信」機能は、SFU 接続時にのみ有効です
  • クライアントが接続を確立して、トラック情報の交換が終了した後のタイミングから受信状態の変更が可能です
    • ただし、受信状態の変更指示を行った時点で対向するクライアントの接続が完了していない場合、その対向クライアントの接続が完了してから変更が有効になります
  • 任意の映像トラックに対して受信の停止/再開を指定することができますが、音声トラックは対象外です
  • デフォルトでは 「映像を受信する」が指定されています

「映像トラックの選択受信」機能の利用方法

web-sdk-sampleに則って解説します。

  • client と base を初期化します
  • addRemoteTrack イベントで、Room に接続してきた対向クライアントの Connection ID を取得します
  • client.changeMediaRequirements()に停止したいクライアントの Connection ID とフラグを設定します。フラグの説明は以下の通りです
    • required: 映像を受信する
    • unrequired: 映像を受信しない
  • 停止した映像の受信を再開したい場合は、"required"を指定して client.changeMediaRequirements()を呼び出します
/*
 * Copyright 2022 RICOH Company, Ltd. All rights reserved.
 */

'use strict'

import * as LSSDK from './libs/ricoh-ls-sdk.js'

import { Base } from './libs/base.js'

const $ = document.querySelector.bind(document)

let base = null
let client = null
let lsTracks = []

let firstPeerID = ''
let firstPeerReq = 'required'

$('#start').addEventListener('click', async (e) => {
  // clientとbaseを初期化します
  if (!client) initClient()

  // baseの初期化には、自クライアントのトラック情報が必要です
  const stream = await navigator.mediaDevices.getUserMedia({
    video: true,
    audio: true,
  })
  lsTracks = stream.getTracks().map((mediaStreamTrack) => {
    return new LSSDK.LSTrack(mediaStreamTrack, stream, {})
  })
  await base.start(lsTracks)
})

$('#stop').addEventListener('click', async (e) => {
  base.stop()
  client = null
})

$('#dllog').addEventListener('click', (e) => {
  base.dllog()
})

$('#togglereq').addEventListener('click', async (e) => {
  if (firstPeerID === '') return
  // 受信停止と再開を反転させています
  firstPeerReq = firstPeerReq === 'required' ? 'unrequired' : 'required'

  // changeMediaRequirements関数に、クライアントの Connection IDとフラグを指定します
  client.changeMediaRequirements(firstPeerID, firstPeerReq)
  console.log(`set new requirement ${firstPeerReq}`)
})

function initClient() {
  base = new Base()
  client = base.client

  client.addEventListener('open', (e) => {
    $('#togglereq').disabled = false
    firstPeerID = ''
    // 初期状態は「受信する」であるため、"required"を指定しています
    firstPeerReq = 'required'
  })

  client.addEventListener('close', (e) => {
    $('#togglereq').disabled = true
    firstPeerID = ''
    firstPeerReq = 'required'
  })

  client.on('addremoteconnection', ({ connection_id, meta }) => {
    // addRemoteConnectionイベントで、自分以外のコネクションのIDが取得できます
    // このイベントは接続が増えるたびに呼ばれて、新しく接続してきたコネクションのIDを都度取得できます
    if (firstPeerID === '') firstPeerID = connection_id
  })
}

まとめ

本文書では「映像トラックの選択受信」機能のメリットと利用法について紹介しました。この機能を活用して、よりお得に RICOH Live Streaming を利用できるようになれば幸いです。 なお「映像トラックの選択受信」機能は、他の機能と組み合わせることでより細かい制御を行う事が可能です。そちらについては別途紹介する予定です。