> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stmlink.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> 对外开放的服务端接口有两组前缀，都用同一套鉴权：`/server/v1/...`（SRTC 与 SMeeting 的主接口）和 `/stm/srvapi/v1/...`（SMeeting 的用户体系，服务端极简对接会用到）。鉴权是 app_id + nonce + timestamp + signature 四个请求头，用 app_key 做 HMAC-SHA256 签名，只能从业务方自己的后端调用。除这两组前缀外的接口均为内部接口，不要建议客户调用。 Public server APIs use two path prefixes with the same authentication: `/server/v1/...` (the main APIs of both SRTC and SMeeting) and `/stm/srvapi/v1/...` (the SMeeting user system, used by server-side low-code integration). Authenticate with four request headers, app_id + nonce + timestamp + signature, where signature is HMAC-SHA256 keyed with app_key; call these APIs only from the customer's own backend. Any other path is internal: never suggest calling it.
> app_key 是服务端密钥，绝不能出现在客户端代码、前端配置或移动 App 里。客户端加入频道用的 token 必须由业务方后端签发后下发（SRTC 走 `/server/v1/channel/grant`，SMeeting 走 `/stm/srvapi/v1/member/grant`）。 app_key is a server-side secret and must never appear in client code, frontend config, or a mobile app. The token a client uses to join must be issued by the customer's backend and passed down to the client (SRTC: `/server/v1/channel/grant`; SMeeting: `/stm/srvapi/v1/member/grant`).
> SRTC 与 SMeeting 是上下两层不同的产品，术语不通用：SRTC 是音视频底座，说「频道 channel」「加入 / 退出」；SMeeting 建在 SRTC 之上，说「房间 room」「会议 meeting」「进入 / 退出」。回答时按用户所在的层用对应术语，不要把「房间」「会议」安到 SRTC 的接口上，也不要用「频道」「加入 / 离开」描述 SMeeting 的概念（接口标识符原样保留）。 SRTC and SMeeting are two separate layers with different terminology. SRTC is the audio/video foundation: it has channels, and users join and leave a channel. SMeeting is built on top of SRTC: it has rooms and meetings, and members enter and exit a meeting. Answer in the terms of the layer the user is working with: never apply "room" or "meeting" to SRTC APIs, and never describe SMeeting concepts in prose with "channel", "join", or "leave" (API identifiers such as `force_join` keep their literal names).
> 同一能力在各端 SDK 里的包名、类名、方法名并不相同。写示例代码时请使用文档中该端自己的 API，不要把一个端的写法套到另一个端上。苹果平台每个产品都有两套 SDK（Swift 原生与 Objective-C），两套 API 不能混用。 Package, class, and method names differ between platform SDKs for the same capability. In sample code, use the API documented for that platform; never carry one platform's code over to another. On Apple platforms each product ships two SDKs (native Swift and Objective-C) whose APIs must not be mixed.

# Media quality

> How to read Android SMeeting media statistics, server-side quality reports, and network quality changes through MeetingEngine.getMetric() or MeetingMediaEvent, plus the full MediaMetric field dictionary. Read this when building call quality indicators or diagnosing poor network.

## Notes

SMeeting directly reuses `MediaMetric`, `NetworkQualityChange`, and related statistics types from the transitive SRTC dependency; the fields follow the SRTC version you depend on. See SRTC [Media quality](/en/rtc/android/media-quality).

You can get quality data in two ways:

* `MeetingEngine.getMetric()`: actively reads a thread-safe copy of the current meeting's most recent sample; it doesn't trigger an immediate sample and may be `null` right after entering the meeting.
* `MeetingEngine.mediaEvent`: listen to `MeetingMediaEvent.onMediaMetric()` and `onNetworkQualityChanged()`. Statistics are usually called back about every 5 seconds; callbacks stay on the SRTC source thread.

`onNetworkQualityChanged()` passes through the SRTC callback as is: it fires once for the uplink and once for the downlink on every quality report from the server, without debouncing, and fires even when the level hasn't changed (`trend` is `STABLE`). Debounce actions such as poor-network prompts yourself. For level, direction, and trend enums, see [SRTC enums](/en/rtc/android/enums); for the full poor-network policy, see [SRTC network quality](/en/rtc/android/network-quality). The field dictionary below is kept consistent with [SRTC media quality](/en/rtc/android/media-quality).

## MediaMetric.Metric

Aggregate media quality statistics object.

| Property | Data type | Description |
| - | - | - |
| localAudios | `MutableMap<UserTrackDesc, AudioSenderStats>` | Local audio stats (by user track). |
| localVideos | `MutableMap<UserTrackDesc, VideoSenderStats>` | Local video stats (by user track). |
| remoteAudios | `MutableMap<UserTrackDesc, AudioReceiverStats>` | Remote audio stats (by user track). |
| remoteVideos | `MutableMap<UserTrackDesc, VideoReceiverStats>` | Remote video stats (by user track). |
| localUploadStats | LocalUploadStats | Local upload overview stats. |
| remoteDownloadStats | `MutableMap<String, RemoteDownloadStats>` | Remote download stats (by `uid`). |
| networkStats | NetworkStats | Network status stats. |
| qualityReport | QualityReport? | Uplink/downlink quality report additionally sent by the server; `null` until the first report arrives. |

## MediaMetric.QualityReport

Uplink/downlink connection quality report computed and sent by the server, distinguishing uplink (this client to the server) from downlink (the server to this client).

| Property | Data type | Description |
| - | - | - |
| timestamp | Long | Timestamp (ms) when the server generated the quality report. |
| uplink | QualityStats | Uplink quality from this client to the server. |
| downlink | QualityStats | Downlink quality from the server to this client. |

## MediaMetric.QualityStats

Quality sample of one side of the link (uplink or downlink).

| Property | Data type | Description |
| - | - | - |
| score | Double | Overall quality score, 0–100; higher is better. |
| level | String | Quality level: `excellent` / `good` / `poor` / `lost`. |
| mos | Double | Estimated voice MOS (mean opinion score), 1.0–4.5; higher is better. |
| loss | Double | Packet loss rate, 0–1. |
| rtt | Double | Round-trip time (ms). |
| jitter | Double | Jitter (ms). |
| packets | Long | Number of packets included in this round of statistics. |
| bitrate | Double | Average bitrate (kbps). |
| bytes | Long | Bytes in this window. |

## MediaMetric.LocalMetric

Local aggregate statistics object (Map keys are `String`).

| Property | Data type | Description |
| - | - | - |
| localAudios | `MutableMap<String, AudioSenderStats>` | Local audio stats. |
| localVideos | `MutableMap<String, VideoSenderStats>` | Local video stats. |
| remoteAudios | `MutableMap<String, AudioReceiverStats>` | Remote audio stats. |
| remoteVideos | `MutableMap<String, VideoReceiverStats>` | Remote video stats. |
| networkStats | NetworkStats | Network status stats. |

## MediaMetric.NetworkStats

Network state statistics object.

| Property | Data type | Description |
| - | - | - |
| bitrateUp | Float | Uplink bitrate (kb/s). |
| bitrateDown | Float | Downlink bitrate (kb/s). |
| delay | Float | Delay. |
| lossrateUp | Float | Uplink packet loss rate. |
| lossrateDown | Float | Downlink packet loss rate. |
| upLevel | MediaUploadLevel | Uplink quality level. |
| downLossLevel | MediaDownLossLevel | Downlink packet loss level. |
| pktUp | Long | Uplink packet count. |
| pktDown | Long | Downlink packet count. |
| pktLossUp | Long | Uplink packets lost. |
| pktLossDown | Long | Downlink packets lost. |

## MediaMetric.LocalUploadStats

Local upload statistics object.

| Property | Data type | Description |
| - | - | - |
| uid | String | User ID. |
| delay | Float | Upload delay. |
| videoBitrate | Float | Video upload bitrate (kb/s). |
| audioBitrate | Float | Audio upload bitrate (kb/s). |
| lossrate | Float | Packet loss rate. |

## MediaMetric.RemoteDownloadStats

Remote download statistics object.

| Property | Data type | Description |
| - | - | - |
| uid | String | User ID. |
| audioPacketsReceived | Long | Audio packets received. |
| videoPacketsReceived | Long | Video packets received (including retransmitted packets). |
| packetsLost | Long | Packets lost. |
| retransmittedPackets | Long | Retransmitted packets (video). |
| lossrate | Float | Packet loss rate. |
| downLevel | MediaDownLevel | Downlink quality level. |
| audioBitrate | Float | Audio bitrate (kb/s). |
| videoBitrate | Float | Video bitrate (kb/s). |

## MediaMetric.AudioSenderStats

Audio sender statistics object.

| Property | Data type | Description |
| - | - | - |
| audioLevel | Float | Audio energy. |
| trackId | String | Track ID. |
| packetsSent | Long | Packets sent. |
| byteSent | Long | Bytes sent. |
| bitrateSent | Float | Send bitrate (kb/s). |
| jitter | Float | Network jitter. |
| packetsLost | Int | Packets lost (retransmissions not deducted). |
| roundTripTime | Float | Round-trip time. |
| mimeType | String | Codec type. |
| timestamp | Long | Timestamp (ms). |
| type | String | Media type, always `audio`. |

## MediaMetric.VideoSenderStats

Video sender statistics object.

| Property | Data type | Description |
| - | - | - |
| firCount | Long | Number of requests to send an I-frame. |
| pliCount | Long | Number of PLI (Picture Loss Indication) requests, i.e., keyframe requests. |
| nackCount | Long | Number of requests to retransmit lost RTP packets. |
| rid | String | Simulcast stream identifier. |
| frameWidth | Int | Video frame width. |
| frameHeight | Int | Video frame height. |
| framesPerSecond | Float | Video frame rate (fps). |
| frameSent | Long | Frames sent. |
| qualityLimitationReason | String | The main reason quality is limited (such as none/cpu/bandwidth/other/inactive). |
| qualityLimitationDurations | `Map<String, Float>` | Cumulative duration of each limitation reason (seconds). |
| qualityLImitationResolutionChange | Long | Number of resolution changes caused by quality limitation. |
| retransmittedPacketsSent | Long | RTP packets retransmitted. |
| targetBitrate | Float | Encoder target bitrate (bps). |
| trackId | String | Track ID. |
| packetsSent | Long | Packets sent. |
| byteSent | Long | Bytes sent. |
| bitrateSent | Float | Send bitrate (kb/s). |
| jitter | Float | Network jitter. |
| packetsLost | Int | Packets lost (retransmissions not deducted). |
| roundTripTime | Float | Round-trip time. |
| mimeType | String | Codec type. |
| timestamp | Long | Timestamp (ms). |
| type | String | Media type, always `video`. |

## MediaMetric.AudioReceiverStats

Audio receiver statistics object.

| Property | Data type | Description |
| - | - | - |
| audioLevel | Float | Audio energy. |
| concealedSamples | Long | Total audio samples recovered by concealment. |
| concealEvents | Long | Number of interpolation operations. |
| silentConcealedSamples | Long | Number of samples concealed as silence. |
| silentConcealmentEvents | Long | Number of silent concealment events. |
| totalAudioEnergy | Double | Cumulative received audio energy. |
| totalSamplesDuration | Double | Cumulative playback duration (seconds). |
| trackId | String | Track ID. |
| packetsReceived | Long | Packets received. |
| bytesReceived | Long | Bytes received. |
| bitrateReceived | Float | Receive bitrate (kb/s). |
| jitter | Float | Network jitter. |
| jitterBufferDelay | Float | Cumulative jitter buffer delay. |
| packetsLost | Int | Packets lost (retransmissions not deducted). |
| mimeType | String | Codec type. |
| timestamp | Long | Timestamp (ms). |
| type | String | Media type, always `audio`. |

## MediaMetric.VideoReceiverStats

Video receiver statistics object.

| Property | Data type | Description |
| - | - | - |
| framesDecoded | Long | Frames decoded successfully. |
| framesDropped | Long | Frames dropped during decoding. |
| framesReceived | Long | Total frames received. |
| framesPerSecond | Float | Receive frame rate (fps). |
| frameWidth | Int | Received frame width. |
| frameHeight | Int | Received frame height. |
| firCount | Int | Number of requests to send an I-frame. |
| pliCount | Int | Number of PLI (Picture Loss Indication) requests, i.e., keyframe requests. |
| nackCount | Int | Number of requests to retransmit lost RTP packets. |
| retransmittedPacketsReceived | Long | Retransmitted packets counted by the receiver. |
| decoderImplementation | String | Decoder implementation name. |
| trackId | String | Track ID. |
| packetsReceived | Long | Packets received. |
| bytesReceived | Long | Bytes received. |
| bitrateReceived | Float | Receive bitrate (kb/s). |
| jitter | Float | Network jitter. |
| jitterBufferDelay | Float | Cumulative jitter buffer delay. |
| packetsLost | Int | Packets lost (retransmissions not deducted). |
| mimeType | String | Codec type. |
| timestamp | Long | Timestamp (ms). |
| type | String | Media type, always `video`. |
