統計情報

Sora Android SDK では Sora を利用した WebRTC 接続中に Android クライアントから送信している 音声・映像やデータの状況(ビットレート、RTT、パケットロス等)を統計情報として確認することができます。

用語

WebRTC 統計情報

WebRTC 統計情報とは https://www.w3.org/TR/webrtc-stats/ に定義されている W3C の標準仕様であり、Sora Android SDK が返す WebRTC 統計情報もこの定義に沿っています。

統計情報取得方法

統計情報の取得には getStats を利用します。

以下に getStats を使った統計情報取得の実装例を示します。

import android.util.Log
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import jp.shiguredo.sora.sdk.channel.SoraMediaChannel
import kotlinx.coroutines.launch
import org.webrtc.RTCStatsReport

// SoraMediaChannel インスタンスが mediaChannel 変数に代入されていることを前提とします。
private var mediaChannel: SoraMediaChannel? = null

// WebRTC 統計情報のうち codec 情報をログに書き込む関数です。
suspend fun dumpCodecStats() {
    // getStats で WebRTC 統計情報を取得します。
    val report: RTCStatsReport = mediaChannel?.getStats() ?: return

    // statsMap の型は Map<String, org.webrtc.RTCStats> です。
    report.statsMap.forEach { (key, stats) ->

        // codec かどうかの判定には RTCStats.type を使います。
        if (stats.type == "codec") {
            // RTCStats.members の型は Map<String, Object> です。
            // members のキーは RTCStats オブジェクトの種類ごとに違います。
            // 以下の例では codec の持つメンバーを抽出しています。
            val payloadType = stats.members["payloadType"]
            val mimeType = stats.members["mimeType"]
            val transportId = stats.members["transportId"]
            Log.d("Stats", "WebRTC Stats Codec Type: $key, Payload Type: $payloadType, Mime Type: $mimeType, Transport Id: $transportId")
        }
    }
}

// suspend fun を Fragment から呼び出す例です。
fun Fragment.requestCodecStats() {
    // SoraMediaChannel.getStats は suspend のためコルーチンスコープから実行する必要があります。
    viewLifecycleOwner.lifecycleScope.launch {
        dumpCodecStats()
    }
}

上記 getStats のコード例に出てきた内容について以下で解説します。

RTCStatsReport

getStats メソッドから取得する統計情報のコンテナです。複数の org.webrtc.RTCStats を保持します。

RTCStatsReport.statsMap

用語の説明で RTCStatsReport が 複数の org.webrtc.RTCStats を保持すると説明しましたが、その実態が RTCStatsReport.statsMap: Map<String, org.webrtc.RTCStats> です。

キーの StringRTCStats.id と同一の値です。

RTCStats

RTCStats は https://www.w3.org/TR/webrtc-stats/ の定義に沿ったオブジェクトで、 idtimestampUstype といった基本フィールドを持ちます。詳しくは https://www.w3.org/TR/webrtc-stats/#dom-rtcstats をご確認ください。

RTCStats.type

type は RTCStats オブジェクトの種類 (codecinbound-rtp など) を表現しており、統計の種類をフィルターする際に使います。例えば現在使用しているコーデックに関する統計情報を取得したい場合は stats.type == "codec" でフィルターします。

RTCStats.members

members: Map<String, Object> は統計オブジェクトの辞書です。統計情報の種類ごとに異なるキーを持った辞書が格納されます。

上記実装例のように stats.members["payloadType"] の形でアクセスすることで、仕様書が定める任意の項目を読み出せます。どのようなキーが利用できるかは https://www.w3.org/TR/webrtc-stats/ をご確認ください。