WebRTC Metrics

A comprehensive overview of WebRTC statistics, derived calculations, extracted features, and observable signals, to better understand call quality, connectivity, and user experience in rtcStats

Back
On this page6 sections
trackvideooutboundcpubandwidthquality

Quality limitation (feature)

Last updated Applies tortcstats-serverrtcstats.com

Track-level features breaking down why outbound video was degraded (CPU, bandwidth, or other) as a fraction of the track's lifetime, plus resolution-change count.

Description

Track-level features, extracted per outbound video track into features_track, from last-getStats ratios.

These features decompose why the encoder had to reduce quality, as a fraction of the track's lifetime:

  • cpuQualityLimitationPercentage - fraction of time the encoder was CPU-limited.
  • bandwidthQualityLimitationPercentage - fraction of time it was bandwidth-limited.
  • otherQualityLimitationPercentage - fraction limited by other.
  • qualityLimitationResolutionChanges - cumulative count of resolution changes triggered by quality limits.

Extracted by the open-source rtcstats-features package.

Why it matters

When outbound video looks bad, the first question is always whose fault is it: the machine or the network? These features answer it directly. A high cpuQualityLimitationPercentage means the encoder couldn't keep up (an underpowered device, or too many concurrent streams); a high bandwidthQualityLimitationPercentage means the network couldn't carry the target bitrate. The two demand opposite responses (lower resolution/framerate vs. improve the path), so splitting them at the population level tells you where to invest. qualityLimitationResolutionChanges counts how often the encoder had to renegotiate resolution, a marker of unstable conditions.

Typical values

  • Good: all limitation percentages near 0.
  • Concerning: a sustained CPU or bandwidth fraction above ~0.2 across a cohort.
  • Many qualityLimitationResolutionChanges indicates volatile CPU or network conditions.

SQL example

Average limitation breakdown for outbound video, on connections that actually established:

SELECT
  AVG(track.cpu_quality_limitation_percentage)       AS avg_cpu_limited,
  AVG(track.bandwidth_quality_limitation_percentage) AS avg_bw_limited,
  AVG(track.other_quality_limitation_percentage)     AS avg_other_limited
FROM features_track AS track
JOIN features_connection AS connection ON connection.id = track.connection_id
WHERE connection.connected           -- only connections that reached 'connected'
  AND track.kind = 'video'           -- 'audio' or 'video'
  AND track.direction = 'outbound';  -- 'inbound' or 'outbound'

See also