統計情報¶
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> です。
キーの String は RTCStats.id と同一の値です。
RTCStats¶
RTCStats は https://www.w3.org/TR/webrtc-stats/ の定義に沿ったオブジェクトで、 id、timestampUs、type といった基本フィールドを持ちます。詳しくは https://www.w3.org/TR/webrtc-stats/#dom-rtcstats をご確認ください。
RTCStats.type¶
type は RTCStats オブジェクトの種類 (codec、 inbound-rtp など) を表現しており、統計の種類をフィルターする際に使います。例えば現在使用しているコーデックに関する統計情報を取得したい場合は stats.type == "codec" でフィルターします。
RTCStats.members¶
members: Map<String, Object> は統計オブジェクトの辞書です。統計情報の種類ごとに異なるキーを持った辞書が格納されます。
上記実装例のように stats.members["payloadType"] の形でアクセスすることで、仕様書が定める任意の項目を読み出せます。どのようなキーが利用できるかは https://www.w3.org/TR/webrtc-stats/ をご確認ください。