# 統計情報

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

## 用語

### WebRTC 統計情報

WebRTC 統計情報とは  に定義されている W3C の標準仕様であり、Sora Android SDK が返す WebRTC 統計情報もこの定義に沿っています。

## 統計情報取得方法

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

> **注釈**
>
> getStats メソッドは Sora Android SDK 2025.4.0 から利用できます。


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

```kotlin
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 は  の定義に沿ったオブジェクトで、 `id`、`timestampUs`、`type` といった基本フィールドを持ちます。詳しくは  をご確認ください。

### RTCStats.type

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

### RTCStats.members

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

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